分散システム · 論考 03

クラッシュをまたぐ厳密に一度の効果:トランザクション境界はどこで終わるのか

配送、実行、永続的な状態変化、外部からの観測は、それぞれ異なる事象である。

この記事を引用

AIによる翻訳には誤りが含まれる可能性があります。原文と照合してください。

AIによる翻訳 · AIによる翻訳には誤りが含まれる可能性があります。原文と照合してください。 原文を読む
数式の記号、コード、参考文献情報、図中の文字は原文の表記を保持しています。

「クラッシュをまたぐ厳密に一度の効果:トランザクション境界はどこで終わるのか」の概念的な編集用イラスト
概念図 · 組み込みのImageGen · 実験的証拠ではない

要旨

厳密に一度の処理が意味のある保証となるのは、効果とその境界が明示された後である。本レビューは、RIFL、MillWheel、非同期バリア・スナップショット方式を通じて、永続的な操作識別子、原子的な完了記録、整合的なストリーム・スナップショット、外部シンクを検討する。有限のクラッシュモデルにより、状態と完了記録の原子的な更新を、効果の重複または喪失を引き起こし得る二つの安全でない順序と区別する。確認応答の喪失時に生じる重複数の期待値と、完了記録の保持に必要な記憶容量を導出する。中心となる主張は、再試行だけでは厳密に一度という保証は生まれず、効果に結び付けられ、再実行が可能な期間全体にわたって保持される永続的な証拠が必要だということである。外部システムは、互換性のあるトランザクション・インターフェースまたは冪等性インターフェースを通じてその境界を拡張できるが、ローカルなチェックポイントが暗黙のうちにそれらを保証対象に含めることはできない。

保証を定義する前に効果を定義する

クライアントがサービスに対し、カウンタを一つ増やすよう要求する。ネットワークが要求を二度配送し、サーバがハンドラを二度実行しても、永続化されたカウンタは一度しか増加しない場合がある。逆に、ハンドラが一度しか実行されなくても、外部のコンシューマが発行されたイベントを二度適用する場合がある。これらは異なる観測である。したがって、要求数やハンドラの呼び出し回数を数えるだけでは、利用者が意図した結果の成立を確認するには不十分である。

一つの論理操作を安定した識別子で定義し、その効果を明示された状態遷移として定義する。完了応答は、その遷移に関する証拠であり、遷移そのものではない。応答が失われた場合、クライアントに生じるのは不確実性であって、失敗の証明ではない。再試行では操作識別子を維持しなければならない。新たな識別子を割り当てると、ペイロードが同一でも新しい要求が作られる。

主要な仕組みとその境界

RIFLは操作を保持された完了情報に関連付け、その情報の移行と回収を扱うことで、前提条件の範囲内で再試行を一つの論理的なRPC結果に変換する仕組みを提供する。MillWheelはデータフローのプログラミングモデルを永続状態と耐障害性の仕組みに結び付ける。非同期バリア・スナップショット方式は、非巡回トポロジーと巡回トポロジーで異なる処理を用いて、データフローの整合的な復旧用スナップショットを記述する。

これらの研究が扱う境界は関連しているが、同一ではない。RPCの完了記録は、分散ストリームのチェックポイントと同じ対象ではない。いずれの仕組みも、単独では、協調しない外部メール事業者や決済エンドポイントが何を観測したかを確定できない。有用な総合的理解とは、各システムが正本となる状態をどこに記録し、どの情報がクラッシュ後も残り、どの下流の効果が同じプロトコルに参加するかを特定することである。 [1], [2], [3]

原子的な完了記録の構成

永続状態に、カウンタと、操作識別子から結果へのマップが含まれているとする。操作を受信すると、サービスはまずマップを調べる。識別子が存在する場合は、保存済みの結果を返す。存在しない場合は、カウンタを更新し、完了記録を挿入する処理を原子的に行ってから応答する。これにより、同じ識別子を繰り返し使用すると、同じ永続的な決定が観測される。

原子性は不可欠である。カウンタの更新が完了記録より先に永続化されると、その間のクラッシュによって記録のない効果が残り、再試行で効果が繰り返され得る。完了記録が先に永続化されると、クラッシュによって効果のない完了記録が残り、再試行で必要な処理が省略され得る。付録では、三つすべての構成についてクラッシュ位置を列挙する。その範囲は逐次的な永続ストアのモデルに限定され、並行性、データ破損、分散コミットには追加の議論が必要である。

完了記録はバイト列だけでなく意味を識別しなければならない

操作識別子のスコープは、呼び出し元と操作種別に限定すべきである。異なるペイロードで再利用された識別子に対し、新しい動作が成功したかのように以前の結果を黙って返してはならない。実用的な契約では、正規化された要求の意味内容のダイジェストを完了記録に結び付け、互換性のない再利用を拒否できる。正規化規則は安定していなければならない。省略可能なフィールドの既定値や解釈が変わると、バイト列の一致が意味的な同一性の不適切な代用となり得る。

認可は重複排除とは別の問題である。完了記録の検索によって、ある主体が識別子を推測することで別の主体の結果を知ることができてはならない。また、冪等性キーが認可の資格情報になってもならない。マップを、所有権、バージョン管理、保持に関する独自の要件を持つ永続的なアプリケーションデータとして認識すれば、これらの指摘はこの小さなモデルから導かれる。

確認応答の喪失がもたらすコスト

各試行は効果を適用した後、確率pで独立に確認応答を失うと仮定する。クライアントは確認応答を受け取るまで再試行する。重複排除がなければ、適用される効果の数は幾何分布に従い、その期待値は一を「一からpを引いた値」で割った値となる。余分な効果の数の期待値は、pを「一からpを引いた値」で割った値である。pが0.2の場合、この構成では論理操作あたり平均0.25の余分な効果が生じる。

この計算は、稼働中のサービスにおけるネットワーク損失の推定ではない。不確実性を生む一つの仕組みを切り出し、すべての試行が実際にサーバへ到達すると仮定している。要求の喪失、クライアントによる断念、相関した障害、回数を制限した再試行は、分布を変える。重複排除を行うモデルでは、実行経路が繰り返されても論理的な効果は一つに保たれるが、それは正本となる完了記録が利用可能であり、その原子性の仮定が成立する場合に限られる。

保持は正しさを左右するパラメータである

完了情報は、古いという理由だけで削除してはならない。完了記録が消えた後にクライアントが操作を再実行できるなら、サービスはそれを新しい操作として扱う可能性がある。有限の保持期間が安全なのは、再実行を制限する、操作の名前空間を廃止する、または期限切れの要求と新しい要求を別の方法で区別するプロトコルがある場合に限られる。このため、RIFLのような設計では確認応答とリースの仕組みが重要になる。

単純な容量モデルとして、操作がレートlambdaで到着し、完了記録をW秒間保持するとする。各記録がbバイトを占める場合、定常状態で保持されるペイロード量は、およそlambdaとWとbの積である。毎秒千操作、保持窓一時間、記録あたり128バイトでは、インデックス、レプリケーション、アロケータのオーバーヘッドを含める前のペイロード量は460.8百万バイトとなる。Wを短くしてこのコストを削減することは、記憶容量の予算だけでなく、再実行に関する契約を変える。 [1]

整合的なチェックポイントは履歴を横切るカットである

分散データフローでは、各演算子を独立に保存すると、整合的な大域的実行を一度も構成していない状態同士を組み合わせてしまう場合がある。あるメッセージが下流の状態に反映されている一方で、上流の状態はそのメッセージを再び発行する位置に復元される可能性がある。スナップショット・プロトコルは、このような不整合を避けるため、状態をチャネル位置または転送中のレコードと協調させる。

非同期バリア・スナップショット方式の論文は、この協調の具体的な方法を示し、巡回データフローで追加のレコード処理が必要になる理由を説明する。本稿の結論は、チェックポイントがあらゆる効果を厳密に一度にするという主張よりも限定的である。チェックポイントは、プロトコルの下で、モデル化されたデータフロー状態の復旧を整合的にする。そのスナップショットの外にあるシンクには、依然として協調、永続的な操作識別子、または補償を行うアプリケーション契約が必要である。カットの位置が保証の位置を決める。 [3]

アウトボックスが結び付けるのは意思決定であり、個々の配送ではない

アウトボックスは、業務状態と同じローカルトランザクション内に、送信予定のメッセージを記録する。これにより、コミット済みの状態変化に永続的な配送意図が欠けることを防ぎ、中止されたトランザクションがコミット済みの意図を残すことも防ぐ。その後、ディスパッチャが配送を再試行できる。しかし、送信先がメッセージを受理してからディスパッチャが成功を記録するまでの間にクラッシュすると、よく知られた不確実性の窓が再び生まれる。

協調する受信側は、安定したイベント識別子の重複排除を、自身の状態遷移と原子的に行える。冪等性の契約が文書化された外部エンドポイントも、同様の境界を提供する場合がある。そのような協調がなければ、システムは、より弱い観測可能な保証か、アプリケーション固有の照合・調整プロセスを選び、説明しなければならない。少なくとも一度の配送を行うディスパッチャの名前を変えても、この窓は消えない。証明は、最終的な観測者に至るまで効果を追跡しなければならない。

検査できるほど小さなクラッシュ行列

提案する検証では、要求の受理、決定のコミット、応答の試行、応答の受領確認、完了記録の回収という各遷移の前後で永続状態を記録する。各クラッシュ点には、期待される復旧状態と次の再試行に対する規則がある。試験には、効果が成功した後、成功の通知がクライアントに届く前のクラッシュを含めるべきである。これは、未検討の仮定を最も明らかにしやすい場合だからである。

同じ値を繰り返し代入するのではなく、カウンタの増分のように重複を露呈する効果を用いる。冪等に見える代入は、不備のある再試行機構を隠す可能性がある。また、同じ識別子を持つ二つの並行要求、一つの識別子に対する二つの異なるペイロード、宣言された保持窓の後の再実行も試験する。有限モデルは参照用トレースを提供する。統合試験では、実際のストレージ・トランザクションが同じ原子的なステップを実装していることを検証しなければならない。

結論:厳密に一度とはエンドツーエンドの契約である

最も強く有用な主張は、メッセージが一度だけ移動するということではなく、識別された一つの論理操作が、モデルに含まれる障害にもかかわらず、指定された一つの永続的な効果を生むということである。この主張には、安定した識別子、効果と証拠の原子的な関係、互換性のある復旧経路、想定される再実行に適合する保持方針が必要である。

完了記録と確認応答の例は、この仕組みが機能する理由と、機能しなくなる箇所の両方を示す。チェックポイントとアウトボックスは設計を拡張できるが、それは参加する境界をまたぐ範囲に限られる。信頼できるシステムの記述は、そうした境界と、なお不確実な結果を明示する。これにより保証を監査でき、読者は、自分が実際に関心を持つ結果にその保証が適用されるかどうかを判断できる。

ローカルで実行済み · 限定された範囲

効果と完了記録の書き込み間のクラッシュ

単一操作の逐次的なクラッシュ位置を対象とし、並行トランザクションや外部の副作用は含まない。

5件のアサーションに合格した。 これらの検査が検証するのは提示した例であり、引用したシステムではない。

記録された証拠例を検査する
{
  "effect-first": [
    1,
    2,
    1
  ],
  "receipt-first": [
    1,
    0,
    1
  ],
  "atomic": [
    1,
    1,
    1
  ]
}

明示された解析モデル

四つの方程式と明示的な仮定

apply⁡(u,s)={(s,D[u]),u∈D(fu(s),ru),u∉D\operatorname{apply}(u,s)=\begin{cases}(s,D[u]),&u\in D\\(f_u(s),r_u),&u\notin D\end{cases}

(1) 第二の分岐は、新しい状態とD[u] = r_uの両方を原子的に永続化しなければならない。この式では、本文で要求しているペイロードの結び付けと認可を省略している。

E[N]=11−p,E[N−1]=p1−p\mathbb E[N]=\frac{1}{1-p},\qquad \mathbb E[N-1]=\frac{p}{1-p}

(2) 各試行は効果を適用し、確率pで独立に確認応答を失う。クライアントは確認応答を受け取るまで回数を制限せずに再試行する。

Sreceipts≈λWbS_{\mathrm{receipts}}\approx \lambda W b

(3) メタデータ、インデックス、レプリケーション、記録サイズの変動を除外した、定常状態で保持されるペイロード量。Lambdaは操作数毎秒、Wは秒、bはバイトを単位とする。

atomic(E,R)≠persist(E);persist(R)\mathrm{atomic}(E,R)\ne \mathrm{persist}(E);\mathrm{persist}(R)

(4) Eは効果、Rは完了記録を表す。個別に永続化される書き込みの間でクラッシュすると、再試行の意味論が変わる。

構成した例 · 再現可能なデータ

定量的な議論を検査する

これらの曲線は、明示したモデルから計算したものである。引用した研究の観測結果ではない。各図には数値データとベクター版が付属する。

確認応答の喪失は、保護されていない効果を増幅する。各試行は、独立に失われる確認応答に先立って効果を実行し、確認応答を受け取るまで再試行を続ける。永続的な重複排除を導入すれば、このモデルは変わる。
図1。確認応答の喪失は、保護されていない効果を増幅する。 各試行は、独立に失われる確認応答に先立って効果を実行し、確認応答を受け取るまで再試行を続ける。永続的な重複排除を導入すれば、このモデルは変わる。
完了記録の保持にはストレージのコストが伴う。完了した操作あたりのペイロードは128バイトで、レートは一定、すべての記録を保持する。インデックス、レプリケーション、アロケータのオーバーヘッド、ガベージコレクションの遅延は除外する。
図2。完了記録の保持にはストレージのコストが伴う。 完了した操作あたりのペイロードは128バイトで、レートは一定、すべての記録を保持する。インデックス、レプリケーション、アロケータのオーバーヘッド、ガベージコレクションの遅延は除外する。

どの証拠がどの問いに答えるのか

境界永続的な証拠保証対象外の振る舞い
ローカルな状態遷移原子的に結び付いた効果と完了記録協調しない外部の送信先
データフローのチェックポイント演算子とチャネルの整合的な復旧状態チェックポイント・プロトコル外の効果
トランザクショナル・アウトボックスコミット済みの配送意図受信側での重複受理
重複排除を行う受信側受信側の効果に結び付いた識別子保証対象外となる期限切れ後の再実行

提案する検証プロトコル

これは提案された評価設計である。本番システムやハードウェアのベンチマークは実施していない。別途実行した有限モデルは、実行可能な検査の項目に記載している。

  1. 論理識別子、そのスコープ、観測可能な効果の正確な内容を定義する。
  2. 効果と完了記録の永続化の前後におけるクラッシュ位置を列挙する。
  3. 非冪等なカウンタを証拠例として用い、原子的な方式と分割書き込み方式を比較する。
  4. 同じ識別子を使う並行要求と、互換性のないペイロードでの識別子再利用を試験する。
  5. 移行、再起動、完了記録の受領確認、期限切れの後の再実行を含める。
  6. 外部シンクの実際の契約を、内部チェックポイントからの復旧とは別に検証する。

一次資料が明らかにすること

Collin Lee, Seo Jin Park, Ankita Kejriwal et al. · 2015 [1]

貢献。 RIFLは完了メタデータを保持し、移行と回収を扱うことで、再試行に対して安全なRPCの意味論を支える。

境界。 その保証は、基盤となるストレージと、クライアントおよびリースのプロトコルに依存する。

資料内の該当箇所。 要旨、および完了記録、移行、回収に関する議論。

Tyler Akidau, Alex Balikov, Kaya Bekiroğlu et al. · 2013 [2]

貢献。 MillWheelは、永続状態と耐障害性を連続データフローのフレームワークに統合する。

境界。 呼び出し元がそのフレームワーク内で動作しているというだけで、外部の効果が保証対象になるわけではない。

資料内の該当箇所。 出版社掲載の要旨とプログラミングモデルの範囲。

Paris Carbone, Gyula Fora, Stephan Ewen et al. · 2015 [3]

貢献。 非同期バリアは整合的な復旧用スナップショットを生成し、循環については追加のログ記録上の考慮を必要とする。

境界。 内部状態の復旧は、あらゆるシンクへの配送保証ではない。

資料内の該当箇所。 要旨、および非巡回・巡回スナップショットの構成。

本分析の限界

  • 実行可能なクラッシュモデルは逐次的であり、実サービスの線形化可能性を立証するものではない。
  • 喪失モデルは、確認応答の独立な喪失と無制限の再試行を仮定している。
  • ストレージの式は完了記録のペイロードだけを計上し、安定した到着レートを仮定している。
  • 外部サービス、メール配送、本番環境のストリーム処理系はいずれも実動試験していない。

選定した三つの基礎的な一次資料に焦点を絞った解析的レビューであり、独自の具体例を含む。2026までの文献を網羅的または系統的に調査したものではない。資料へのアクセスと版に関する注記は、参考文献とともに記録している。

結論を変え得る問い

  1. オフラインのクライアントや遅延したキューを含め、再実行までに生じ得る最長の間隔はどれほどか。
  2. トランザクションまたは冪等な受信側の契約に参加できない効果はどれか。
  3. クライアントの進捗に関する同期されていない仮定に頼らず、完了記録の回収を正当化できるか。

参考文献

  1. Collin Lee, Seo Jin Park, Ankita Kejriwal et al.. Implementing linearizability at large scale and low latency. Proceedings of the 25th Symposium on Operating Systems Principles (2015). 10.1145/2815400.2815416.
  2. Tyler Akidau, Alex Balikov, Kaya Bekiroğlu et al.. MillWheel: fault-tolerant stream processing at internet scale. Proceedings of the VLDB Endowment (2013). 10.14778/2536222.2536229.
  3. Paris Carbone, Gyula Fora, Stephan Ewen et al.. Lightweight Asynchronous Snapshots for Distributed Dataflows. arXiv:1506.08603 (2015). Primary source.

資料[1]へのアクセス。 一次記録、要旨、アクセス可能な本文の一部を対象とし、全文や補足資料の網羅的な監査ではない。

資料[2]へのアクセス。 一次記録、要旨、アクセス可能な本文の一部を対象とし、全文や補足資料の網羅的な監査ではない。

資料[3]へのアクセス。 一次記録、要旨、アクセス可能な本文の一部を対象とし、全文や補足資料の網羅的な監査ではない。

書誌情報の同一性は、Crossrefおよび元の出版社、著者、機関の記録と照合した。以下の資料アクセスおよび版に関する注記に対象範囲を示す。これは全文の網羅的な監査ではない。

著者と来歴

Codex(AI)が執筆し、技術的な自己レビューを行った。参考文献は元の研究者を明示し、解析上の構成と提案する評価設計は本記事に帰属する。

表紙はImageGenによる概念的なイラストである。技術的な図は、明示したモデルまたは有限の例から計算しており、PythonとCSVを提供している。稼働中の製品の測定値でも、性能ベンチマークを再現したものでもない。

このローカル草稿には、独立した査読や学術誌への採択の記録はない。範囲を限定した実行可能な例は、記載した小さなモデルを検査するものであり、引用したシステムの形式検証ではない。

依頼に基づく研究レビュー · v5. この記事を引用 · 原資料の記録 · 公開記録