RDBMSイベントストア:注文を確認します(シングルスレッドライター)

レイキンゴ

セットアップに関する簡単な説明:

RDBMS(私の場合はPostgres)を使用して、「基本的な」イベントストア/イベントソーシングアプリケーションを実装しようとしています。イベントは、のようなだけでいくつかの基本的なフィールドを持つ汎用イベントですeventtimelocationaction、XMLとしてフォーマット。この一般的な構造により、便利な方法でそれらを分割する方法があります。イベントはJavaアプリケーションを介してキャプチャされ、Javaアプリケーションはイベントを検証してから、イベントテーブルに格納します。各イベントにはなりますuuidし、recordtimeそれが捕獲されたとき。

さらに、外部アプリケーションへのサブスクリプションが存在する可能性があり、カスタム基準に一致するすべてのイベントを取得する必要があります。新しい一致するイベントがキャプチャされると、そのイベントはサブスクライバーにプッシュされる必要があります。サブスクライバーがイベントを見逃さないようにするために、現在、キャプチャプロセスをシングルスレッドにするように強制しています。新しいイベントが発生すると、ロックが設定され、イベントはrecordtime現在の時刻に割り当てられ、イベントは最終的にDBテーブルに挿入されます(明示的にコミットを待機します)。その後、ロックが解除されます。たとえば5秒ごとにスケジュールされて実行されるサブスクリプションのrecordtime場合、最後に送信されたイベントを追跡し、などの新しいイベントのクエリを実行しますwhere recordtime > subscription_recordtime一致するイベントがサブスクライバーに正常にプッシュsubscription_recordtimeされると、はイベントmaxに設定されますrecordtime

すべてが実際に機能していますが、ご想像のとおり、シングルスレッドのキャプチャプロセスはあまり拡張性がありません。したがって、主な質問は次のとおりです。これを最適化して、たとえば複数のキャプチャプロセスを並行して実行できるようにするにはどうすればよいですか。

recordtime挿入時にDB自体にを設定することはすでに考えていましたが、コミットの順序が保証されない(JVMが一時停止する)ため、2つのキャプチャトランザクションがほぼ同時に実行されているとイベントが失われる可能性があると思います。DBが生成したタイムスタンプを正しく理解すると、実際のコミットのに設定されます。こうしてとのトランザクションrecordtime T2がすでにサブスクリプションのクエリに見えることができる、との別のトランザクションがrecordtime T1T1 < T2)、まだ進行中であるので、コミットされていません。recordtimeサブスクリプションのは次のように設定され、T2、トランザクション1からイベントが失われますので...

イベントがキャプチャ/コミットされた順序で表示されるように、DBレベルで順序を保証する方法はありますか?新しく表示されるすべてのイベントには、前のイベントよりも後のタイムスタンプが必要です(厳密に単調に増加します)。フルテーブルロックについては知っていますが、そうすると、以前と同じパフォーマンスペナルティが発生すると思います。

シングルスレッドライターを使用するようにDBを設定することは可能ですか?次に、各キャプチャプロセスは、別の書き込みTXが完了するのを待機しますが、DBレベルでは、単一のインスタンス/スレッド化されたキャプチャアプリケーションよりもはるかに優れています。または、現在の状態を追跡するために別のフィールド/ IDを使用できますか?通常のシーケンスIDにも同じ理由があります。

CPerson

イベントがキャプチャ/コミットされた順序で表示されるように、DBレベルで順序を保証する方法はありますか?

イベントのグローバルな順序について心配する必要はありません。イベントにはVersionプロパティが含まれている必要があります。イベントを作成するときは、特定のアグリゲート/ストリームIDに対して常に単調に増加するバージョン番号挿入する必要があります挿入するときに重要な順序は、これだけです。得意先ABCの場合、イベント1、2、3、および4では、イベント5のみを書き込む必要があります。

データベーストランザクションは、上記のルールを使用して、ストリーム内で正しい順序を保証できます。

たとえば5秒ごとにスケジュールされて実行されるサブスクリプションの場合、最後に送信されたイベントのレコード時間を追跡し、recordtime> subscription_recordtimeのような新しいイベントのクエリを実行します。

イベントを読むことは少し異なる話です。まず、イベントを一意に識別するためのシリアル列がある可能性があります。それはあなたに注文を与え、あなたがすべてのイベントを読んだかどうかを決定することを可能にします。ストアからイベントを読み取るときに、シーケンスのギャップを検出した場合。これは、最新のイベントを読んだときに挿入物が飛行中であった場合に発生します。この場合、データを再度読み取り、ギャップがなくなったかどうかを確認します。これには、サブスクリプションがインデックス内での位置を維持する必要があります。代替的または追加的に、少なくともNミリ秒前のイベントを読み取ることができます。ここで、Nは、トランザクションの遅延(500または1000など)を補正するのに十分な高さのしきい値です。

また、プロセスで使用または活用できるオープンソースのRDBMSイベントストアがあることにも注意してください。

マーテンhttp//jasperfx.github.io/marten/documentation/events/

SqlStreamStorehttps//github.com/SQLStreamStore/SQLStreamStore

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

.on()イベントハンドラーの前に確認ダイアログチェックを追加します

分類Dev

ドラッグスタートイベントはシーケンスを中断します

分類Dev

Paypalサンドボックスエンドポイントでのトランザクションは成功していますか?アップグレード基準を満たしていることを確認します

分類Dev

Rシャイニーダッシュボード:ローカルファイルとオンラインデータベース(Googleスプレッドシートなど)の両方からデータをアップロードします

分類Dev

連続するアルファベットとハイフンをカウントし、ランレングスとしてエンコードします

分類Dev

FirestoreルールはFlutterクライアントでタイムスタンプを確認します

分類Dev

クラスはKotlinまたはJavaでリフレクションを使用して、インターフェイスからデフォルトのメソッドをオーバーライドしているかどうかを確認する方法?

分類Dev

スタンドアロンサーバーのグリッドインフラストラクチャをインストールした後、Oracle11gでRDBMSのリスナーを再起動する方法

分類Dev

フルカレンダーのドラッグイベントにクラスを追加します

分類Dev

HTMLヘッドでアイコン<link>タグを注文するためのベストプラクティス

分類Dev

cpanelを使用して、ライブサイト(ドメインのメールアドレス)から確認メールを送信します

分類Dev

ショッピングカート確認済み注文データベース

分類Dev

AWSのIPアドレスに基づいてトラフィックをさまざまなインスタンスにルーティングします

分類Dev

Slickgridスプレッドシートプラグインはすべてのフィルターをクリアします

分類Dev

djangoタグを使用して、インストールされているdjangoアプリを確認します

分類Dev

複数のファイルをAzureストレージBLOBにアップロードするタイミングをASP.NETで確認する方法

分類Dev

セレンウェブドライバーを使用してアンカータグのJavaScriptで `onclick`イベントを確認する方法

分類Dev

SQLのドメインイベントストレージ... JSONシリアル化を使用しますか?

分類Dev

プロットサンキーダイアグラムでラベルを追加し、ノードをカスタマイズします

分類Dev

Android-URLアドレスにpingしてインターネット接続を確認する

分類Dev

非ドキュメントベースのアプリでフォルダをドラッグしてアイコンをドッキングします

分類Dev

InnoSetupのオンラインリストに対してIPアドレスを確認します

分類Dev

リストアイテムをループして、インラインの幅を確認します

分類Dev

イベントハンドラーをシームレスにしますか?

分類Dev

cssを使用したレスポンシブライトルームスタイルのグリッド?

分類Dev

インラインテキストフィールドをアクションにレールします

分類Dev

ログインステータスを確認し、ログインセッションを保存します(PHP)

分類Dev

スレッドスリープブロッキングシリアルポートデータイベントハンドラ

分類Dev

グーグルマップアイドルイベントリスナーを停止します

Related 関連記事

  1. 1

    .on()イベントハンドラーの前に確認ダイアログチェックを追加します

  2. 2

    ドラッグスタートイベントはシーケンスを中断します

  3. 3

    Paypalサンドボックスエンドポイントでのトランザクションは成功していますか?アップグレード基準を満たしていることを確認します

  4. 4

    Rシャイニーダッシュボード:ローカルファイルとオンラインデータベース(Googleスプレッドシートなど)の両方からデータをアップロードします

  5. 5

    連続するアルファベットとハイフンをカウントし、ランレングスとしてエンコードします

  6. 6

    FirestoreルールはFlutterクライアントでタイムスタンプを確認します

  7. 7

    クラスはKotlinまたはJavaでリフレクションを使用して、インターフェイスからデフォルトのメソッドをオーバーライドしているかどうかを確認する方法?

  8. 8

    スタンドアロンサーバーのグリッドインフラストラクチャをインストールした後、Oracle11gでRDBMSのリスナーを再起動する方法

  9. 9

    フルカレンダーのドラッグイベントにクラスを追加します

  10. 10

    HTMLヘッドでアイコン<link>タグを注文するためのベストプラクティス

  11. 11

    cpanelを使用して、ライブサイト(ドメインのメールアドレス)から確認メールを送信します

  12. 12

    ショッピングカート確認済み注文データベース

  13. 13

    AWSのIPアドレスに基づいてトラフィックをさまざまなインスタンスにルーティングします

  14. 14

    Slickgridスプレッドシートプラグインはすべてのフィルターをクリアします

  15. 15

    djangoタグを使用して、インストールされているdjangoアプリを確認します

  16. 16

    複数のファイルをAzureストレージBLOBにアップロードするタイミングをASP.NETで確認する方法

  17. 17

    セレンウェブドライバーを使用してアンカータグのJavaScriptで `onclick`イベントを確認する方法

  18. 18

    SQLのドメインイベントストレージ... JSONシリアル化を使用しますか?

  19. 19

    プロットサンキーダイアグラムでラベルを追加し、ノードをカスタマイズします

  20. 20

    Android-URLアドレスにpingしてインターネット接続を確認する

  21. 21

    非ドキュメントベースのアプリでフォルダをドラッグしてアイコンをドッキングします

  22. 22

    InnoSetupのオンラインリストに対してIPアドレスを確認します

  23. 23

    リストアイテムをループして、インラインの幅を確認します

  24. 24

    イベントハンドラーをシームレスにしますか?

  25. 25

    cssを使用したレスポンシブライトルームスタイルのグリッド?

  26. 26

    インラインテキストフィールドをアクションにレールします

  27. 27

    ログインステータスを確認し、ログインセッションを保存します(PHP)

  28. 28

    スレッドスリープブロッキングシリアルポートデータイベントハンドラ

  29. 29

    グーグルマップアイドルイベントリスナーを停止します

ホットタグ

アーカイブ