GS2-Ranking2 트랜잭션 액션
액션의 조합과 동시 실행
모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-Ranking2 고유의 내용입니다.
GS2-Ranking2의 트랜잭션 액션은 2종류의 대상을 다룹니다. 시즌 보상의 수령을 기록한 것과, 검증 액션이 읽는 스코어입니다. 기록은 랭킹과 시즌별로 나뉘므로, GS2-Ranking2의 액션끼리 충돌하는 일은 거의 없습니다.
| 조작 | 같은 행을 겹쳤을 때 | 중첩 너머 | 다른 대상이 되는 경계 |
|---|---|---|---|
수령의 기록CreateGlobalRankingReceivedRewardByUserId CreateClusterRankingReceivedRewardByUserId | 1건으로 통합된다 | 실패한다 | 네임스페이스·사용자·랭킹·시즌·클러스터 |
스코어의 검증VerifyGlobalRankingScoreByUserId VerifyClusterRankingScoreByUserId VerifySubscribeRankingScoreByUserId | 임계값이 같은 것은 1건으로 묶이고, 다른 것은 각각 판정된다 | 읽기만 하므로 충돌하지 않는다 | 랭킹·시즌·검증 타입 |
기록은 아직 존재하지 않는 경우에만 기록됩니다. 이것이 시즌 보상을 이중으로 수령하지 못하게 하는 구조입니다. 이미 기록된 수령을 다시 기록하는 것은, 같은 트랜잭션에서든 이후의 트랜잭션에서든 실패합니다.
보유 수와 같은 소비할 수 있는 양과 달리, 스코어의 임계값은 더할 의미를 갖지 않으므로 합산되지 않습니다. 「100 이상」과 「500 이상」을 나열하면 양쪽 다 판정되며, 결과적으로 엄격한 쪽이 효력을 가집니다.
검증 액션은 트랜잭션 시작 시점의 스코어를 봅니다. 스코어의 등록은 트랜잭션 액션이 아니라 API이므로, 트랜잭션 안에서 스코어를 등록한 뒤 검증하는 구성은 할 수 없습니다.
수령의 기록은 표시에 지나지 않습니다. 시즌의 보상 자체는 자신의 트랜잭션으로 발행되므로, 그것이 속한 서비스의 제한이 그대로 해당되며, 아래의 「중첩된 트랜잭션에 주의」도 해당됩니다.
중첩된 트랜잭션에 주의
같은 수령이 안쪽과 바깥쪽 양쪽에서 기록되면 트랜잭션이 실패합니다. 또한 보상이 안쪽 트랜잭션으로 발행되므로, 보상이 배분하는 것은 다른 액션과 같은 트랜잭션에 모입니다. 그것들이 속한 서비스의 페이지를 확인해 주십시오.
제한을 회피하고 싶은 경우
수령의 기록은 소비 액션이므로 acquireActionUseJobQueue로는 분리할 수 없습니다. enableAtomicCommit을 비활성화하면 안쪽과 바깥쪽의 충돌은 해소되지만, 이 판단은 신중하게 해 주십시오. 기록된 수령은 그 후에 보상의 부여가 실패해도 취소되지 않습니다.
동시 실행과 재시도
기록은 시즌별로 나뉘므로 동시 실행 요청이 충돌하는 일은 거의 없습니다. 실패하는 것은 이미 기록된 수령을 기록한 경우뿐이며, 이것이 시즌 보상을 이중으로 수령하지 못하게 하는 구조입니다. 재시도해도 달라지지 않습니다.
Verify Action
검증 액션
Gs2Ranking2:VerifyGlobalRankingScoreByUserId
사용자 ID를 지정하여 글로벌 랭킹의 스코어 검증
지정한 사용자의 글로벌 랭킹 스코어를 비교 연산자(less, lessEqual, greater, greaterEqual, equal, notEqual)를 사용하여 지정한 값과 비교 검증합니다.
수량 지정 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||||||||||
| rankingName | string | ✓ | ~ 128자 | 글로벌 랭킹 모델 이름 글로벌 랭킹 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| verifyType | 문자열 열거형 enum { “less”, “lessEqual”, “greater”, “greaterEqual”, “equal”, “notEqual” } | ✓ | 검증 종류
| |||||||||||||||||
| season | long | 0 ~ 9223372036854775805 | 시즌 | |||||||||||||||||
| score | long | ✓ | 0 ~ 9223372036854775805 | 스코어 사용자가 등록한 스코어 값입니다. 랭킹 모델의 minimumValue와 maximumValue로 정의된 범위 내에 있어야 합니다. | ||||||||||||||||
| multiplyValueSpecifyingQuantity | bool | true | 수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부 | |||||||||||||||||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Ranking2:VerifyGlobalRankingScoreByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"rankingName": "[string]글로벌 랭킹 모델 이름",
"verifyType": "[string]검증 종류",
"season": "[long]시즌",
"score": "[long]스코어",
"multiplyValueSpecifyingQuantity": "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Ranking2:VerifyGlobalRankingScoreByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
rankingName: "[string]글로벌 랭킹 모델 이름"
verifyType: "[string]검증 종류"
season: "[long]시즌"
score: "[long]스코어"
multiplyValueSpecifyingQuantity: "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("ranking2").verify.verify_global_ranking_score_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
rankingName="[string]글로벌 랭킹 모델 이름",
verifyType="[string]검증 종류",
season="[long]시즌",
score="[long]스코어",
multiplyValueSpecifyingQuantity="[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
timeOffsetToken="[string]타임 오프셋 토큰",
})Gs2Ranking2:VerifyClusterRankingScoreByUserId
사용자 ID를 지정하여 클러스터 랭킹의 스코어 검증
지정한 사용자의 클러스터 랭킹 스코어를 비교 연산자(less, lessEqual, greater, greaterEqual, equal, notEqual)를 사용하여 지정한 값과 비교 검증합니다.
수량 지정 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||||||||||
| rankingName | string | ✓ | ~ 128자 | 클러스터 랭킹 모델 이름 클러스터 랭킹 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| clusterName | string | ✓ | ~ 1024자 | 클러스터 이름 이 스코어가 속한 클러스터(길드, 개더링, 또는 임의의 그룹)의 이름입니다. 클러스터 타입 설정에 따라 사용자의 소속이 검증됩니다. | ||||||||||||||||
| verifyType | 문자열 열거형 enum { “less”, “lessEqual”, “greater”, “greaterEqual”, “equal”, “notEqual” } | ✓ | 검증 종류
| |||||||||||||||||
| season | long | 0 ~ 9223372036854775805 | 시즌 | |||||||||||||||||
| score | long | ✓ | 0 ~ 9223372036854775805 | 스코어 이 클러스터 내에서 사용자가 등록한 스코어 값입니다. | ||||||||||||||||
| multiplyValueSpecifyingQuantity | bool | true | 수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부 | |||||||||||||||||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Ranking2:VerifyClusterRankingScoreByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"rankingName": "[string]클러스터 랭킹 모델 이름",
"clusterName": "[string]클러스터 이름",
"verifyType": "[string]검증 종류",
"season": "[long]시즌",
"score": "[long]스코어",
"multiplyValueSpecifyingQuantity": "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Ranking2:VerifyClusterRankingScoreByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
rankingName: "[string]클러스터 랭킹 모델 이름"
clusterName: "[string]클러스터 이름"
verifyType: "[string]검증 종류"
season: "[long]시즌"
score: "[long]스코어"
multiplyValueSpecifyingQuantity: "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("ranking2").verify.verify_cluster_ranking_score_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
rankingName="[string]클러스터 랭킹 모델 이름",
clusterName="[string]클러스터 이름",
verifyType="[string]검증 종류",
season="[long]시즌",
score="[long]스코어",
multiplyValueSpecifyingQuantity="[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
timeOffsetToken="[string]타임 오프셋 토큰",
})Gs2Ranking2:VerifySubscribeRankingScoreByUserId
사용자 ID를 지정하여 구독 랭킹의 스코어를 검증
지정한 사용자의 구독 랭킹 스코어를 비교 연산자(less, lessEqual, greater, greaterEqual, equal, notEqual)를 사용하여 지정한 값과 비교 검증합니다.
수량 지정 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||||||||||
| rankingName | string | ✓ | ~ 128자 | 구독 랭킹 모델 이름 구독 랭킹 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||||||||
| verifyType | 문자열 열거형 enum { “less”, “lessEqual”, “greater”, “greaterEqual”, “equal”, “notEqual” } | ✓ | 검증 종류
| |||||||||||||||||
| season | long | 0 ~ 9223372036854775805 | 시즌 | |||||||||||||||||
| score | long | ✓ | 0 ~ 9223372036854775805 | 스코어 | ||||||||||||||||
| multiplyValueSpecifyingQuantity | bool | true | 수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부 | |||||||||||||||||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Ranking2:VerifySubscribeRankingScoreByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"rankingName": "[string]구독 랭킹 모델 이름",
"verifyType": "[string]검증 종류",
"season": "[long]시즌",
"score": "[long]스코어",
"multiplyValueSpecifyingQuantity": "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Ranking2:VerifySubscribeRankingScoreByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
rankingName: "[string]구독 랭킹 모델 이름"
verifyType: "[string]검증 종류"
season: "[long]시즌"
score: "[long]스코어"
multiplyValueSpecifyingQuantity: "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("ranking2").verify.verify_subscribe_ranking_score_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
rankingName="[string]구독 랭킹 모델 이름",
verifyType="[string]검증 종류",
season="[long]시즌",
score="[long]스코어",
multiplyValueSpecifyingQuantity="[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
timeOffsetToken="[string]타임 오프셋 토큰",
})Consume Action
소비 액션
Gs2Ranking2:CreateGlobalRankingReceivedRewardByUserId
사용자 ID를 지정하여 글로벌 랭킹 보상 수령 이력 기록
지정한 사용자를 대신하여, 지정한 글로벌 랭킹의 보상 수령 이력을 기록합니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| rankingName | string | ✓ | ~ 128자 | 글로벌 랭킹 모델 이름 글로벌 랭킹 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| season | long | 0 ~ 9223372036854775805 | 시즌 | |||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Ranking2:CreateGlobalRankingReceivedRewardByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"rankingName": "[string]글로벌 랭킹 모델 이름",
"userId": "[string]사용자ID",
"season": "[long]시즌",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Ranking2:CreateGlobalRankingReceivedRewardByUserId
request:
namespaceName: "[string]네임스페이스 이름"
rankingName: "[string]글로벌 랭킹 모델 이름"
userId: "[string]사용자ID"
season: "[long]시즌"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("ranking2").consume.create_global_ranking_received_reward_by_user_id({
namespaceName="[string]네임스페이스 이름",
rankingName="[string]글로벌 랭킹 모델 이름",
userId="[string]사용자ID",
season="[long]시즌",
timeOffsetToken="[string]타임 오프셋 토큰",
})Gs2Ranking2:CreateClusterRankingReceivedRewardByUserId
사용자 ID를 지정하여 클러스터 랭킹 보상 수령 이력 기록
지정한 사용자를 대신하여, 지정한 클러스터 랭킹 및 클러스터의 보상 수령 이력을 기록합니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| rankingName | string | ✓ | ~ 128자 | 클러스터 랭킹 모델 이름 클러스터 랭킹 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| clusterName | string | ✓ | ~ 1024자 | 클러스터 이름 랭킹 보상을 수령한 클러스터의 이름입니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| season | long | 0 ~ 9223372036854775805 | 시즌 | |||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Ranking2:CreateClusterRankingReceivedRewardByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"rankingName": "[string]클러스터 랭킹 모델 이름",
"clusterName": "[string]클러스터 이름",
"userId": "[string]사용자ID",
"season": "[long]시즌",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Ranking2:CreateClusterRankingReceivedRewardByUserId
request:
namespaceName: "[string]네임스페이스 이름"
rankingName: "[string]클러스터 랭킹 모델 이름"
clusterName: "[string]클러스터 이름"
userId: "[string]사용자ID"
season: "[long]시즌"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("ranking2").consume.create_cluster_ranking_received_reward_by_user_id({
namespaceName="[string]네임스페이스 이름",
rankingName="[string]클러스터 랭킹 모델 이름",
clusterName="[string]클러스터 이름",
userId="[string]사용자ID",
season="[long]시즌",
timeOffsetToken="[string]타임 오프셋 토큰",
})