一貫性の保証をきめ細かく制御できるメッセージバスの実装を知っている人はいますか? 完全な ACID は遅すぎますが、ACID はどれも間違っていません。
現在、メッセージには Rhino ESB ラッピング MSMQ を使用しています。分散トランザクションで永続的なトランザクション メッセージングを使用する場合、MSMQ は、I/O の完了を待機する間、かなりの時間コミットをブロックする可能性があります。
私たちのメッセージは、ビジネス ロジックと非正規化という 2 つの一般的なカテゴリに分類されます。後者は、メッセージ バス トラフィックのかなりの割合を占めています。
ビジネス ロジック メッセージには完全な ACID の保証が必要であり、MSMQ はこれに十分適していることが証明されています。
非正規化メッセージ:
- 耐久性がなければなりません。
- 元のトランザクションが完了するまで処理してはなりません。
- 複数回処理される場合があります。
- 2) が守られている限り、元のトランザクションがロールバックされても処理される場合があります。
(いくつかの特定のケースでは、おそらく耐久性の要件が緩和される可能性がありますが、それらのケースをルールの例外として特定して処理すると、複雑さが増します。)
非正規化メッセージはすべてインプロセスで処理されるため、IPC は必要ありません。
プロセスが再開された場合、すべてのトランザクションが完了 (コミットまたはロールバック) したと見なされ、まだ処理されていないすべての非正規化メッセージを回復する必要があります。すでに処理された非正規化メッセージを再生することは許容されます。
私が知る限り、トランザクションを処理するメッセージング システムは、完全な ACID を使用するか、何も使用しないかの選択肢を提供する傾向があり、ACID はパフォーマンスの低下をもたらします。送信されたメッセージの数によっては、TransactionScope#Commit() の呼び出しに数百ミリ秒かかる場合があります。
非トランザクション メッセージ キューを使用すると、元のトランザクションが完了する前にメッセージが処理されるため、一貫性の問題が発生します。
同様の一貫性要件を持つが複雑さの低いシステムの別の部分では、トランザクション ログに似たもののカスタム実装を既に使用しています。 、同時実行、耐久性、トランザクショナル メッセージング システムを自分で作成する必要がない場合:P
不思議に思っている人のために説明すると、非正規化メッセージの持続性を要求する理由は、非同期の検出と非同期の修正がそれぞれ非常に難しく、非常にコストがかかる可能性があるためです。何かがわずかに間違っていて、ページを更新しても修正されない場合、人々は気付くので、非同期化を無視することはできません。