GS2-Schedule 트랜잭션 액션
액션의 조합과 동시 실행
모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-Schedule 고유의 내용입니다.
GS2-Schedule의 트랜잭션 액션은 네임스페이스·사용자·트리거 이름의 조합으로 결정되는 하나의 트리거를 대상으로 합니다. 트리거는 업데이트할 때마다 전체가 다시 쓰입니다.
| 조작 | 같은 행을 겹쳤을 때 | 중첩 너머 | 다른 대상이 되는 경계 |
|---|---|---|---|
트리거를 당기기TriggerByUserId | 1건으로 통합된다 | 실패한다 | 네임스페이스·사용자·트리거 이름 |
트리거의 연장ExtendTriggerByUserId | 통합되어 초 수가 합산된다 | 실패한다 | 네임스페이스·사용자·트리거 이름 |
트리거의 삭제DeleteTriggerByUserId | 1건으로 통합된다 | 실패한다 | 네임스페이스·사용자·트리거 이름 |
트리거의 검증VerifyTriggerByUserId | 먼저 지정한 쪽이 남음 | 읽기만 하므로 충돌하지 않는다 | 트리거·검증 타입·경과 시간 |
이벤트의 검증VerifyEventByUserId | 먼저 지정한 쪽이 남음 | 읽기만 하므로 충돌하지 않는다 | 이벤트·검증 타입·사용자 |
당기기·연장하기·삭제하기는 세 개의 다른 행이며 경계가 같습니다. 이 중 두 개를 하나의 트리거에 대해 지정하면 충돌합니다. 트리거를 당긴 뒤 연장하고 싶다는 요구는 흔하지만, 여기에는 트랜잭션이 두 개 필요합니다. 연장은 트랜잭션 시작 시점의 상태에서 움직이므로, 같은 트랜잭션이 당긴 트리거가 보이지 않기 때문입니다.
검증 액션은 트랜잭션 시작 시점의 상태를 봅니다. 같은 트랜잭션에서 당긴 트리거나 삭제한 트리거를 검증할 수는 없습니다.
이벤트가 개최 중인지는 시간 오프셋에 의존하고 오프셋은 사용자별이므로, 이벤트의 검증은 사용자별로 다른 대상이 됩니다.
중첩된 트랜잭션에 주의
트리거는 전체가 다시 쓰이므로, 안쪽에서 당겨진 트리거와 바깥쪽에서 연장 또는 삭제된 같은 트리거가 충돌하여 트랜잭션이 실패합니다.
제한을 회피하고 싶은 경우
트리거를 당기기·연장하기는 획득 액션, 삭제는 소비 액션입니다. 당기기와 연장의 충돌은 acquireActionUseJobQueue를 활성화하면 해소되지만, 삭제와의 공존은 enableAtomicCommit을 비활성화하지 않으면 해소되지 않습니다.
동시 실행과 재시도
트리거는 리비전 대조를 수반하여 전체가 다시 쓰이므로, 같은 트리거를 여러 요청이 동시에 업데이트하면 나중에 확정된 쪽이 충돌(409)이 됩니다. 요청 내용에 문제가 있는 것은 아니므로, 재시도하면 성공합니다.
트리거 이름이 다르면 다른 대상이므로, 다른 트리거에 대한 요청끼리는 충돌하지 않습니다.
Verify Action
검증 액션
Gs2Schedule:VerifyTriggerByUserId
사용자 ID를 지정하여 트리거가 당겨진 후 경과 시간 검증
지정한 사용자의 트리거 상태에 관한 조건을 검증합니다. verifyType은 ’notTriggerd’, ’elapsed’, ’notElapsed’를 설정할 수 있습니다. 검증 조건이 충족되지 않으면 오류를 반환합니다.
수량 지정 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||||
| triggerName | string | ✓ | ~ 128자 | 트리거 이름 트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||
| verifyType | 문자열 열거형 enum { “notTriggerd”, “elapsed”, “notElapsed” } | ✓ | 검증 종류
| |||||||||||
| elapsedMinutes | int | {verifyType} in [“elapsed”, “notElapsed”] | ✓※ | 0 ~ 2147483646 | 경과 시간(분) ※ verifyType이(가) “elapsed”,“notElapsed"이면 필수 | |||||||||
| timeOffsetToken | string | ~ 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’ 을 설정할 수 있습니다. 검증 조건이 충족되지 않으면 오류가 반환됩니다.
수량 지정 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||
| eventName | string | ✓ | ~ 128자 | 이벤트 이름 이벤트 고유의 이름. 영숫자 및 -(하이픈), _(언더스코어), .(마침표)로 지정합니다. | ||||||||
| verifyType | 문자열 열거형 enum { “inSchedule”, “notInSchedule” } | ✓ | 검증 종류
| |||||||||
| timeOffsetToken | string | ~ 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를 지정하여 트리거 삭제
지정한 사용자의 지정된 트리거를 삭제합니다. 트리거를 삭제하면 관련된 상대 스케줄 이벤트가 비활성화됩니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| triggerName | string | ✓ | ~ 128자 | 트리거 이름 트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| timeOffsetToken | string | ~ 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’는 지정한 이벤트의 스케줄에 유효기간을 맞춥니다. 트리거를 당기면 관련된 상대 스케줄 이벤트가 활성화됩니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| triggerName | string | ✓ | ~ 128자 | 트리거 이름 트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||||||||||
| triggerStrategy | 문자열 열거형 enum { “renew”, “extend”, “drop”, “repeatCycleEnd”, “repeatCycleNextStart”, “absoluteEnd” } | ✓ | 트리거 실행 정책
| |||||||||||||||||
| ttl | int | {triggerStrategy} in [“renew”, “extend”, “drop”] | ✓※ | 0 ~ 2147483646 | 트리거 유효기간(초) ※ triggerStrategy이(가) “renew”,“extend”,“drop"이면 필수 | |||||||||||||||
| eventId | string | {triggerStrategy} in [“repeatCycleEnd”, “repeatCycleNextStart”, “absoluteEnd”] | ✓※ | ~ 1024자 | 이벤트 GRN
※ triggerStrategy이(가) “repeatCycleEnd”,“repeatCycleNextStart”,“absoluteEnd"이면 필수 | |||||||||||||||
| timeOffsetToken | string | ~ 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로 하는 새로운 트리거가 생성됩니다.
수량 지정 가능한 액션: 예
반전 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| triggerName | string | ✓ | ~ 128자 | 트리거 이름 트리거 고유 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| extendSeconds | int | ✓ | 0 ~ 2147483646 | 트리거를 연장하는 기간(초) | ||
| timeOffsetToken | string | ~ 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]타임 오프셋 토큰",
})