GS2-Schedule 트랜잭션 액션

검증/소비/입수 각 트랜잭션 액션의 사양

액션의 조합과 동시 실행

모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-Schedule 고유의 내용입니다.

GS2-Schedule의 트랜잭션 액션은 네임스페이스·사용자·트리거 이름의 조합으로 결정되는 하나의 트리거를 대상으로 합니다. 트리거는 업데이트할 때마다 전체가 다시 쓰입니다.

조작같은 행을 겹쳤을 때중첩 너머다른 대상이 되는 경계직렬 실행 모드 활성화 시
트리거를 당기기
TriggerByUserId
1건으로 통합된다실패한다네임스페이스·사용자·트리거 이름중첩을 넘어서도 성립한다. 다만 1건으로 통합되지는 않는다. 2건째는 1건째가 남긴 트리거에 대해 실행되어 자신의 triggerStrategy를 적용한다
트리거의 연장
ExtendTriggerByUserId
통합되어 초 수가 합산된다실패한다네임스페이스·사용자·트리거 이름중첩을 넘어서도 성립한다. 2건째는 1건째가 남긴 기한에 대해 실행되므로 결과적으로 초 수는 합산된다
트리거의 삭제
DeleteTriggerByUserId
1건으로 통합된다실패한다네임스페이스·사용자·트리거 이름계속 실패한다. 1건으로 묶이지 않게 되므로, 2건째는 이미 사라진 트리거에 대해 실행되어 찾을 수 없음(404)으로 거부된다
트리거의 검증
VerifyTriggerByUserId
완전히 같은 검증은 1건으로 묶인다읽기만 하므로 충돌하지 않는다트리거·검증 타입·경과 시간변하지 않는다. 읽기만 하므로 원래 충돌하지 않는다
이벤트의 검증
VerifyEventByUserId
완전히 같은 검증은 1건으로 묶인다읽기만 하므로 충돌하지 않는다이벤트·검증 타입·사용자변하지 않는다. 읽기만 하므로 원래 충돌하지 않는다

당기기·연장하기·삭제하기는 세 개의 다른 행이며 경계가 같습니다. 이 중 두 개를 하나의 트리거에 대해 지정하면 충돌합니다. 트리거를 당긴 뒤 연장하고 싶다는 요구는 흔하지만, 여기에는 트랜잭션이 두 개 필요합니다. 연장은 트랜잭션 시작 시점의 상태에서 움직이므로, 같은 트랜잭션이 당긴 트리거가 보이지 않기 때문입니다. 직렬 실행 모드(enableSequentialExecution 또는 TransactionSettingV2)를 활성화하면 당기기와 연장하기를 하나의 트랜잭션에 넣을 수 있게 됩니다. 다만 순서는 기대와 다릅니다. 페이즈 안에서의 실행 순서는 액션 이름으로 결정되므로 ExtendTriggerByUserIdTriggerByUserId보다 반드시 먼저 실행됩니다. 트리거가 아직 없으면 연장이 트리거를 만들고, 그 위에 당기기가 자신의 triggerStrategy를 적용합니다. 당긴 뒤 그 결과를 같은 트랜잭션에서 연장할 수는 없습니다. 삭제와 당기기·연장하기의 조합은 해소되지 않습니다. 삭제는 소비 액션으로 먼저 실행되지만, 하나의 트랜잭션에서 트리거를 지웠다가 다시 만드는 것은 같은 행에 대한 두 개의 쓰기가 되어 묶이지 않고 오류(400)가 됩니다.

검증 액션은 트랜잭션 시작 시점의 상태를 봅니다. 같은 트랜잭션에서 당긴 트리거나 삭제한 트리거를 검증할 수는 없습니다.

이벤트가 개최 중인지는 시간 오프셋에 의존하고 오프셋은 사용자별이므로, 이벤트의 검증은 사용자별로 다른 대상이 됩니다.

중첩된 트랜잭션에 주의

트리거는 전체가 다시 쓰이므로, 안쪽에서 당겨진 트리거와 바깥쪽에서 연장 또는 삭제된 같은 트리거가 충돌하여 트랜잭션이 실패합니다. 직렬 실행 모드를 활성화해도 바깥쪽이 삭제하는 경우는 해소되지 않습니다. 삭제는 먼저 실행되지만, 뒤에 이어지는 당기기는 트리거를 다시 만들게 되고, 같은 행에 대한 삭제와 생성을 하나의 트랜잭션에서 묶을 수는 없으므로 오류(400)가 됩니다.

제한을 회피하고 싶은 경우

트리거를 당기기·연장하기는 획득 액션, 삭제는 소비 액션입니다. 당기기와 연장의 충돌은 acquireActionUseJobQueue를 활성화하면 해소되지만, 삭제와의 공존은 enableAtomicCommit을 비활성화하지 않으면 해소되지 않습니다.

동시 실행과 재시도

트리거는 리비전 대조를 수반하여 전체가 다시 쓰이므로, 같은 트리거를 여러 요청이 동시에 업데이트하면 나중에 확정된 쪽이 충돌(409)이 됩니다. 요청 내용에 문제가 있는 것은 아니므로, 재시도하면 성공합니다.

트리거 이름이 다르면 다른 대상이므로, 다른 트리거에 대한 요청끼리는 충돌하지 않습니다.


Verify Action

검증 액션

Gs2Schedule:VerifyTriggerByUserId

사용자 ID를 지정하여 트리거가 당겨진 후 경과 시간 검증

지정한 사용자의 트리거 상태에 관한 조건을 검증합니다. verifyType은 notTriggerd, elapsed, notElapsed를 설정할 수 있습니다. 검증 조건이 충족되지 않으면 오류를 반환합니다.

수량 지정 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
triggerNamestring
~ 128자트리거 이름
트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
verifyType문자열 열거형
enum {
  “notTriggerd”,
  “elapsed”,
  “notElapsed”
}
검증 종류
정의설명
notTriggerd트리거가 당겨지지 않음
elapsed지정한 시간이 경과함
notElapsed지정한 시간이 경과하지 않음
elapsedMinutesint{verifyType} in [“elapsed”, “notElapsed”]
✓※
0 ~ 2147483646경과 시간(분)
※ verifyType이(가) “elapsed”,“notElapsed"이면 필수
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Schedule:VerifyTriggerByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "triggerName": "[string]트리거 이름",
        "verifyType": "[string]검증 종류",
        "elapsedMinutes": "[int]경과 시간(분)",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Schedule:VerifyTriggerByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  triggerName: "[string]트리거 이름"
  verifyType: "[string]검증 종류"
  elapsedMinutes: "[int]경과 시간(분)"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("schedule").verify.verify_trigger_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    triggerName="[string]트리거 이름",
    verifyType="[string]검증 종류",
    elapsedMinutes="[int]경과 시간(분)",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2Schedule:VerifyEventByUserId

사용자 ID를 지정하여 이벤트 개최 기간인지 검증

지정한 사용자에 대해 지정된 이벤트가 현재 활성 스케줄 기간 내에 있는지 검증합니다. verifyType 은 inSchedule 또는 notInSchedule 을 설정할 수 있습니다. 검증 조건이 충족되지 않으면 오류가 반환됩니다.

수량 지정 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
eventNamestring
~ 128자이벤트 이름
이벤트 고유의 이름. 영숫자 및 -(하이픈), _(언더스코어), .(마침표)로 지정합니다.
verifyType문자열 열거형
enum {
  “inSchedule”,
  “notInSchedule”
}
검증 종류
정의설명
inSchedule이벤트의 개최 기간임
notInSchedule이벤트의 개최 기간이 아님
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Schedule:VerifyEventByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "eventName": "[string]이벤트 이름",
        "verifyType": "[string]검증 종류",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Schedule:VerifyEventByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  eventName: "[string]이벤트 이름"
  verifyType: "[string]검증 종류"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("schedule").verify.verify_event_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    eventName="[string]이벤트 이름",
    verifyType="[string]검증 종류",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Consume Action

소비 액션

Gs2Schedule:DeleteTriggerByUserId

사용자 ID를 지정하여 트리거 삭제

지정한 사용자의 지정된 트리거를 삭제합니다. 트리거를 삭제하면 관련된 상대 스케줄 이벤트가 비활성화됩니다.

수량 지정 가능한 액션: 아니오

반전 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
triggerNamestring
~ 128자트리거 이름
트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Schedule:DeleteTriggerByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "triggerName": "[string]트리거 이름",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Schedule:DeleteTriggerByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  triggerName: "[string]트리거 이름"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("schedule").consume.delete_trigger_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    triggerName="[string]트리거 이름",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Acquire Action

입수 액션

Gs2Schedule:TriggerByUserId

사용자 ID를 지정하여 트리거 실행

지정한 사용자의 트리거를 당깁니다. 트리거 전략에 따라 동작이 결정됩니다: renew는 새로운 TTL로 리셋, extend는 기존 TTL을 연장, drop은 이미 당겨진 경우 무시, repeatCycleEnd/repeatCycleNextStart/absoluteEnd는 지정한 이벤트의 스케줄에 유효기간을 맞춥니다. 트리거를 당기면 관련된 상대 스케줄 이벤트가 활성화됩니다.

수량 지정 가능한 액션: 아니오

반전 가능한 액션: 예

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
triggerNamestring
~ 128자트리거 이름
트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
triggerStrategy문자열 열거형
enum {
  “renew”,
  “extend”,
  “drop”,
  “repeatCycleEnd”,
  “repeatCycleNextStart”,
  “absoluteEnd”
}
트리거 실행 정책
정의설명
renew이미 트리거가 당겨진 경우 새로운 기간으로 다시 당기기
extend이미 트리거가 당겨진 경우 기간 연장
drop이미 트리거가 당겨진 경우 무시
repeatCycleEnd지정한 이벤트의 반복 기간 종료 일시에 유효 기간이 만료되도록 트리거 당기기
repeatCycleNextStart지정한 이벤트의 반복에서 다음 반복 시작 일시에 유효 기간이 만료되도록 트리거 당기기
absoluteEnd지정한 이벤트의 종료 일시에 유효 기간이 만료되도록 트리거 당기기
ttlint{triggerStrategy} in [“renew”, “extend”, “drop”]
✓※
0 ~ 2147483646트리거 유효기간(초)
※ triggerStrategy이(가) “renew”,“extend”,“drop"이면 필수
eventIdstring{triggerStrategy} in [“repeatCycleEnd”, “repeatCycleNextStart”, “absoluteEnd”]
✓※
~ 1024자이벤트 GRN
※ triggerStrategy이(가) “repeatCycleEnd”,“repeatCycleNextStart”,“absoluteEnd"이면 필수
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Schedule:TriggerByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "triggerName": "[string]트리거 이름",
        "userId": "[string]사용자ID",
        "triggerStrategy": "[string]트리거 실행 정책",
        "ttl": "[int]트리거 유효기간(초)",
        "eventId": "[string]이벤트 GRN",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Schedule:TriggerByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  triggerName: "[string]트리거 이름"
  userId: "[string]사용자ID"
  triggerStrategy: "[string]트리거 실행 정책"
  ttl: "[int]트리거 유효기간(초)"
  eventId: "[string]이벤트 GRN"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("schedule").acquire.trigger_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    triggerName="[string]트리거 이름",
    userId="[string]사용자ID",
    triggerStrategy="[string]트리거 실행 정책",
    ttl="[int]트리거 유효기간(초)",
    eventId="[string]이벤트 GRN",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2Schedule:ExtendTriggerByUserId

사용자 ID를 지정하여 트리거 기간 연장

지정한 사용자의 기존 트리거 유효기간을 지정한 초만큼 연장합니다. 트리거가 존재하지 않는 경우, 지정한 연장 기간을 TTL로 하는 새로운 트리거가 생성됩니다.

수량 지정 가능한 액션: 예

반전 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
triggerNamestring
~ 128자트리거 이름
트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
extendSecondsint
0 ~ 2147483646트리거를 연장하는 기간(초)
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Schedule:ExtendTriggerByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "triggerName": "[string]트리거 이름",
        "userId": "[string]사용자ID",
        "extendSeconds": "[int]트리거를 연장하는 기간(초)",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Schedule:ExtendTriggerByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  triggerName: "[string]트리거 이름"
  userId: "[string]사용자ID"
  extendSeconds: "[int]트리거를 연장하는 기간(초)"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("schedule").acquire.extend_trigger_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    triggerName="[string]트리거 이름",
    userId="[string]사용자ID",
    extendSeconds="[int]트리거를 연장하는 기간(초)",
    timeOffsetToken="[string]타임 오프셋 토큰",
})