トランザクション

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となったトランザクションの遷移情報を判定してrecoverycancel操作を自動化することでオペレータ作業を自動化できます。トランザクション状態マシンの外側にオペレータとしてのメンテナンス状態マシンを追加できる強力な機能です。 Abort hookには以下の設定項目があります。

  • reason: Abort hookを適用する理由を指定します。トランザクション管理画面に表示されるユーザーラベルであり、何が起こって適用されたかを区別する情報と捉えて設定してください。

  • xdomain: Abort hookが適用されるトランザクションドメイン名を指定します。

  • xtype: Abort hookが適用されるトランザクションタイプを指定します。

  • action: Abort hookのアクションを指定します。選択できるアクションは、recoveryforce_recoverycancel、および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を設定することにより、トランザクションの状態マシンは次のように拡張されます。