GS2-JobQueue トランザクションアクション
アクションの組み合わせと同時実行
すべてのサービスに共通する前提は トランザクションアクションの組み合わせ にまとめています。先にそちらを読んでください。この節の残りは GS2-JobQueue 固有の内容です。
GS2-JobQueue のトランザクションアクションは、ネームスペースとユーザーの組で決まる 1 人のユーザーのジョブキューを対象にします。登録は常に新しいジョブを作るので登録ごとに別の対象になり、削除はジョブ名で特定される既存のジョブ 1 つを対象にします。
| 操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 |
|---|---|---|---|
ジョブの登録PushByUserId | 1 件の登録に統合され、ジョブのリストが連結される。合計が 10 件を超えると発行時にエラーになる | 衝突しない。登録するたびに自分のジョブを作る | 登録のたびに別の対象 |
ジョブの削除DeleteJobByUserId | 1 件に統合される | 失敗する | ネームスペース・ユーザー・ジョブ名 |
トランザクションで登録したジョブは、そのトランザクションの他のアクションからはまだ存在していないものとして扱われます。すべてのアクションがトランザクション開始時点の状態を基準に動くためです。ジョブを積んでから操作したい場合は、トランザクションを分けてください。
複数のジョブをまとめて積みたい場合は、アクションを何度も指定するより、1 つの登録の jobs に並べて指定するほうが簡潔で処理も軽くなります。
ジョブはトランザクションの中ではなく、後で実行されます
積まれたジョブはトランザクションの一部としては実行されません。あとから取り出されて単独で実行され、その内容はこのトランザクションではなく、ジョブが触るサービスそれぞれの制限を受けます。
これが GS2-JobQueue を他サービスの制限の回避に使える理由です。同じものを更新するために 1 つのトランザクションに入れられない 2 つのアクションがある場合、片方をジョブとして積めば別々のトランザクションに分けられます。引き換えに、その結果はトランザクションの応答時点では反映されておらず、トランザクション全体と一括で成功・失敗することもなくなります。
同じ考え方は、アクションとして明示するのではなく設定としても使えます。ネームスペースのトランザクション設定で acquireActionUseJobQueue を有効にすると、そのネームスペースのトランザクションで入手アクションが 2 つ以上あるときに、それらが GS2-JobQueue 経由で 1 つずつ実行されるようになります。
入れ子になったトランザクションに注意
内側から削除されたジョブと、外側から削除された同じジョブが衝突します。登録は影響を受けません。登録するたびに自分のジョブを作るためです。
制限を回避したい場合
ジョブの登録は入手アクション、ジョブの削除は消費アクションです。削除どうしの衝突は消費アクションどうしなので acquireActionUseJobQueue では分離できず、enableAtomicCommit を無効にする必要があります。登録の連結が上限を超えて発行時にエラーになる場合は、どちらの設定でも解消しません。登録を分けてください。
同時実行とリトライ
ジョブの登録は、リクエストが何本重なってもコンフリクトしません。登録するたびに自分のジョブを作るためです。
ジョブの削除は、そのジョブがまだ存在することを確認します。そのため同じジョブを同時に削除すると、後から確定した側がエラーになります。削除の最中にジョブが実行を終えて取り除かれた場合も同様です。
Consume Action
消費アクション
Gs2JobQueue:DeleteJobByUserId
ユーザーIDを指定してジョブを削除
指定ユーザーのジョブキューから特定のジョブを削除します。
実行状態に関係なくジョブが削除されます。
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| jobName | string | ✓ | UUID | ~ 36文字 | ジョブの名前 ジョブの一意な名前を保持します。 名前は UUID(Universally Unique Identifier)フォーマットで自動的に生成され、各ジョブを識別するために使用されます。 | |
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2JobQueue:DeleteJobByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"userId": "[string]ユーザーID",
"jobName": "[string]ジョブの名前",
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2JobQueue:DeleteJobByUserId
request:
namespaceName: "[string]ネームスペース名"
userId: "[string]ユーザーID"
jobName: "[string]ジョブの名前"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("jobQueue").consume.delete_job_by_user_id({
namespaceName="[string]ネームスペース名",
userId="[string]ユーザーID",
jobName="[string]ジョブの名前",
timeOffsetToken="[string]タイムオフセットトークン",
})Acquire Action
入手アクション
Gs2JobQueue:PushByUserId
ユーザーIDを指定してジョブを登録
ユーザーのジョブキューに1つ以上のジョブを登録します(最大10件)。
各ジョブには実行する GS2-Script、引数、最大リトライ回数を指定します。
ネームスペースで enableAutoRun が有効な場合、ジョブは登録後に即座に非同期で実行され、レスポンスの autoRun フラグが true になります。
enableAutoRun が無効な場合、ジョブはキューに追加され Run API で手動実行する必要があり、autoRun フラグは false になります。
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| jobs | List<JobEntry> | 0 ~ 10 items | 追加するジョブの一覧 | |||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2JobQueue:PushByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"userId": "[string]ユーザーID",
"jobs": [
{
"scriptId": "[string]スクリプトGRN",
"args": "[string]引数",
"maxTryCount": "[int]最大試行回数"
}
],
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2JobQueue:PushByUserId
request:
namespaceName: "[string]ネームスペース名"
userId: "[string]ユーザーID"
jobs:
- scriptId: "[string]スクリプトGRN"
args: "[string]引数"
maxTryCount: "[int]最大試行回数"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("jobQueue").acquire.push_by_user_id({
namespaceName="[string]ネームスペース名",
userId="[string]ユーザーID",
jobs={
{
scriptId="[string]スクリプトGRN",
args="[string]引数",
maxTryCount="[int]最大試行回数"
}
},
timeOffsetToken="[string]タイムオフセットトークン",
})