トランザクション
Qmonus SDKは、複雑なワークフローやATOMオブジェクトメッセージングを安全で一貫性のあるものにするためにトランザクションをリソースとして管理しています。
トランザクションは、次の状態マシンによって管理されています。
トランザクションが保有する属性
-
xid
: トランザクションを一意に識別するIDです。原則、自動付与されるため、開発者が指定することはできません。 -
xname
: トランザクションを一意に識別する名前です。開発者によって指定されます。指定しない場合、xidと同じ値が設定されます。xname
の自動生成のために後述するCounter
サービスを利用することできます。 -
xdomain
: トランザクションの実行ドメイン名を指定します。指定しない場合、Default
が設定されます。後述するxtype
と同様に、トランザクションクォータ制限のキーワードとして使用できます。 -
xtype
: トランザクション実行タイプを指定します。指定しない場合、Default
が設定されます。xdomain
と同様に、トランザクションクォータ制限のキーワードとして使用できます。 -
timeout
: トランザクション実行タイムアウト値です。ATOMメッセージングトランザクションの場合は自動的に拡張されます。タイムアウトを超えると、トランザクションは自動的に中断(abort)されます。ScenarioやATOMトランザクションが走行中にScenarioサーバがダウンした場合、プラグインアプリケーションから自律的なabort要求が発行できないため、本タイムアウトによってTransactionサーバ側で中断(abort)に移行することができます(サイレント障害の検知)。尚、デフォルトでは起動パラメータ--transaction_timeout
に従います。起動パラメータのデフォルトは600
秒が設定されています。 -
expire_callout
: トランザクションが有効期限切れとなった際にWebhookを送信できます。完了したトランザクション情報が完全に消滅する際のイベントであるため、ほとんどのユースケースでは使用されない機能です。 -
checkpoint_recovery
: リカバリ操作のモードを指定します。原則、開発者が指定する必要はなく、常にlastone
が設定されます。Scenarioサーバ相当の機能を独自に開発する方向けの高度な設定です。 -
checkpoint_cancel
: キャンセル操作のモードを指定します。原則、開発者が指定する必要はなく、常にall
が設定されます。Scenarioサーバ相当の機能を独自に開発する方向けの高度な設定です。 -
xglobals
: トランザクション保護スコープのユーザ名前空間が保存されます。開発者は意識する必要がありません。プラグインアプリケーションのバグによって誤ったグローバル変数を保存してしまった場合など、この名前空間の変数を修正して復旧するようなオペレーションもトランザクション管理画面から実施できます。フォールトトレランスを最大化する柔軟性を提供します。 -
callback
: トランザクションの最終状態が決定されたときに実行されるWebhookを登録できます。
Tip
トランザクションは非同期で実行されるため、最終状態を取得してなんらかの処理を実行したい場合は、トランザクションの開始後に発行されたxid
によってステータスをポーリングするか、この設定を使用してコールバックトリガーで駆動させるか、起動パラメータ--job_transaction_event=True
を設定してイベントを発行させ、対応するJob
プラグインを駆動させるか3つの選択択があります。
-
transitions
: トランザクションの開始から状態の決定までのすべての操作は、タイムスタンプとともに履歴保存されます。トランザクションサービスによって提供されるaborthook
サービスは、この情報を使用して、オペレータが実行する必要のあるrecovery
およびcancel
実行を自動化できます。 -
create
: トランザクションが生成されたときのタイムスタンプを格納します。 -
expires
: トランザクションの有効期限を保存します。これは、timeout
値から自動的に計算されます。 -
lock
: トランザクションの独立性を維持するためにロックを設定します。トランザクション走行中にロックを追加したり部分的に解除することも可能です。ただしデッドロックが発生しないような排他設計が必要です。
排他制御
トランザクションの排他制御は、ロック情報を使用して実現されます。ロックは、/
で区切られた文字列として表されます。ロックはツリーで管理され、前方一致が排他されます。また、ロックは、トランザクションがコミットされると自動的に解放されます。シナリオの開発者は、排他的制御のために複雑なプログラミングを必要としないため、ロックするリソースのみを宣言します。
Tip
テナント配下のネットワークリソースをロックする例
Tenant/eeaf1ad05f2711e98c6a000c293aa0bf/Network/f998ab505f2711e98c6a000c293aa0bf
上記のロックを保持しているトランザクションの実行中は、以下のロックを取得できません。
Full overlap
Tenant/eeaf1ad05f2711e98c6a000c293aa0bf/Network/f998ab505f2711e98c6a000c293aa0bf
Top duplicate
Tenant/eeaf1ad05f2711e98c6a000c293aa0bf
or Tenant
Quota
トランザクションはクォータ制限を設定できます。トランザクションクォータサービスは、次のパラメータを使用して制限を管理し、超過した場合に新しいトランザクションの開始を拒否します。
-
xdomain
: トランザクションドメイン名を指定します。 -
xtype
: トランザクションタイプを指定します。 -
quota
: 指定したxdomainとxtypeが一致するトランザクションの同時実行上限数を指定します。超過すると、409 Conflict
がトランザクションの要求元に返却されます。
Abort hook
Abort hook
は、トランザクションの進行状況を監視し、Abortedに遷移したトランザクションを検出した場合の自律アクションを設定できる機能です。
Abortedとなったトランザクションの遷移情報を判定してrecovery
やcancel
操作を自動化することでオペレータ作業を自動化できます。トランザクション状態マシンの外側にオペレータとしてのメンテナンス状態マシンを追加できる強力な機能です。
Abort hook
には以下の設定項目があります。
-
reason
: Abort hookを適用する理由を指定します。トランザクション管理画面に表示されるユーザーラベルであり、何が起こって適用されたかを区別する情報と捉えて設定してください。 -
xdomain
: Abort hookが適用されるトランザクションドメイン名を指定します。 -
xtype
: Abort hookが適用されるトランザクションタイプを指定します。 -
action
: Abort hookのアクションを指定します。選択できるアクションは、recovery
、force_recovery
、cancel
、およびforce_cancel
のいずれかです。 -
cancel_mode
: キャンセルアクションでは、シナリオのコマンドで設定されたcancelable
オプションに従うか無視するかを指定できます。follow
の場合、操作はcancelable
オプションに従いますが、breakthrough
が指定されている場合は無視されます。 -
guard_time
: Abort hookを適用するまでの遅延時間を指定します。Aborted遷移直後にアクションを実行しても、ネットワーク障害などの復旧に時間がかかっている場合があり、アクションしてもAbortedがフラップするような状況では、余計に切り分けを複雑にしてしまう可能性があります。このようなケースが想定される場合には、このパラメータを適切な遅延時間で設定します。デフォルトは3秒に設定されています。 -
conditions
: 1ライナーのPythonコードでAbort hookを適用するための複合条件を記述します。条件はAND条件であり、すべての条件がTrue
の場合にアクションが適用されます。条件を記述するスクリプトスペースでは、トランザクション情報は変数x
に格納されています。
Tip
前回の操作がrecovery
でない場合にrecovery
を実行する例
"recovery" not in list(x.transitions[-1].keys())
Abortedの発生が3回を超えた場合にcancel
を実行する例
len([transition for transition in x.transitions if "abort" in transition]) > 3
これらのAbort hookを設定することにより、トランザクションの状態マシンは次のように拡張されます。