2017-02-03 10 views
0

EntityCreatedまたはEntityModifiedのようなイベントを含むカフカイベントバスを当社のアプリケーションに導入して、システムの他の部分がそれから消費できるようにしたいと考えています。メインアプリケーションは、フードの下にRDMS(すなわちポストグル)を使用して、エンティティおよびそれらの関係を格納する。RDMSとKafkaをどのように同期させておくのですか?

ここで問題は、RDFに正常に保存した場合にのみ、EntityCreatedイベントをKafkaで送信することです。これが正しいかどうかを確認しないと、消費者に不一致が生じます。私はどれも説得力がありませんそのうち3つのソリューション、見

  1. は気にしないでください:非常に危険な、RDMSに挿入する際に間違って何かがあることができます。
  2. エンティティを保存するときは、送信するメッセージを独自のテーブルに保存してください。次に、この表から消費し、カフカに発行し、この表から成功した後に別のプロセスを作成します。これは実装するには静かで複雑で、アンチパターンのようにも見えます。
  3. RDFSに挿入して、(SQL-)トランザクションを開いて、Kafkaに正常に書き込み、コミットするまで開いてください。問題は、潜在的にRDMSトランザクションをしばらく開いたままにすることです。問題の大きさは分かりません。
  4. 実際のCQRSは、RDMSにまったく保存せずに、KafkaキューからRDMSを構築することを意味します。これは理想的な方法だと思われますが、サービスを改装することは困難です。また、レイテンシによる不一致にも問題があります。

私はインターネット上で優れたソリューションを見つけることが困難でした。

多分、この質問は広範囲に及ぶかもしれません。

+0

アプリケーションの真実の源は何ですか?イベントまたはRdms? –

答えて

0

エンティティを保存するときは、送信するメッセージを独自のテーブルに保存してください。次に、この表から消費し、カフカに発行し、この表から成功した後に別のプロセスを作成します。これは実装するには静かで複雑で、アンチパターンのようにも見えます。

これは、実際にはUdi Dahan氏が講演した解決策です。信頼できるMessaging without Distributed Transactionsです。実際には "ベストプラクティス"にかなり近いです。なぜそれが反パターンだと思うのかを調べる価値があるかもしれません。

実際のCQRSは、RDMSにはまったく保存せずに、KafkaキューからRDMSを構築することを意味します。

Noooo!それはモンスターが隠れている場所です! (下記参照)。

「本当のCQRS」を実行していた場合、主な使用例は作家があなたの記録簿でイベントを耐久性にさせ、消費者が定期的に更新をポーリングすることです。エントリとエントリの順序が不変であるという追加的な制約を伴い、 "Atom Feed"と考えてください。イベントとイベントのページを共有できます。状態が変化しないので、イベント表現は「永遠に」有効であるため、キャッシュ無効化は問題ではない。

これには、消費者がメッセージの順序を気にする必要がないという利点もあります。消費者は、の文書をよく読んでおり、これまでの文書とそれ以降の文書を指し示しています。

さらに、同じイベントのN種類の表現をブロードキャストするのではなく、1つの表現を送信して、消費者があなたを投票したときにコンテンツをネゴシエートするというバージョニングストーリーの解決策を得ました。

今、ポーリングにはレイテンシの問題があります。更新のアナウンスをブロードキャストし、新しいイベントが利用可能であることをコンシューマに通知することによって、遅延を減らすことができます。

偽ポーリングの頻度を減らしたい場合(気にしないイベントの消費者を覚醒させる)、通知に情報を追加して、消費者が更新プログラムを取得します。

"ウェイクアップと多分ポーリング"は、単独のイベントでトリガーされるプロセスであることに注意してください。 「目を覚ましてこのメ​​ッセージだけをポーリングする」というのは同じアイデアのもう一つのバリエーションです。私たちはEmailDeliveryScheduledの薄いバージョンをブロードキャストしました。それを担当するサービスは、電子メールの作成に必要な詳細を電子メール/イベントの拡張バージョンに依頼します。

これらは「通知を受信して​​消費する」という特殊化です。ポーリングに必要な待ち時間が余裕のないユースケースがある場合は、分離イベントの表現でその状態を使用できます。

しかし、情報が共有可能な共有可能なドキュメントとして既に公開されている場合、順序付けられた一連のイベントを再現しようとしています...これはかなり珍しい使用例です。私はそれを解決するための一般的な問題として心配しません - 私の推測では、これらのケースはまれであり、容易に一般化されないということです。上記のすべてを約メッセージングある

注意、ない程度カフカ。メッセージングとイベントの調達は異なるuse casesとして文書化されています。 Jay Krepsは、私はそれが意味論について多くの、より具体的であり、あなたがAに必要なものの非常に近い記述ので、代わりに「メッセージ・システム」または「パブサブ」のここでの「ログイン」という用語を使用します(2013)

を書きましたデータ複製をサポートするための実用的な実装。

あなたは耐久性を保証してメッセージングシステムの一種として機能するよう、ログを考えることができ

と強い発注セマンティクス

レコードの本は、イベントメッセージの順序のための唯一の権威である必要があります。注文を気にする消費者は、順序付けられていない書類を読んで注文を再構築するのではなく、注文書を読んで読書するべきです。あなたの現在の設計では

....

さて、問題はあなたが成功しRDMSに保存された場合にのみ、カフカのEntityCreatedイベントを送信することを確認してください方法です。

RDBMSが記録の書籍(「真実」のソース)である場合、Kafkaログは(まだ)存在しません。

ここからは、いくつかの穏やかな手順を経てそこに行くことができます。大まかに言えば、既存のデータベースにイベントを追加し、既存のデータベースからkafkaのログに書き込むことです。既存のRDBMSのレプリカを作成し、読み込みユースケースをレプリカに移行し、書き込みユースケースをkafkaに移行し、レガシーデータベースを廃止するとします。

カフカのログは、あなたが望むレコードの本かもしれません。 Greg Youngはかなりの期間Get Event Storeを開発しており、has enumerated some of the tradeoffs(2016)を開発しています。コースの馬 - 私はログを、よく書かれたコードベースでこれらのうちの1つから別のものに切り替えるのは難しいとは思っていませんが、発生するかもしれない追加の結合については全く話すことができません。

関連する問題