問題タブ [eventstoredb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1790 参照

domain-driven-design - 随時接続 CQRS システム

問題:

2 人の従業員 (A と B) が同時にオフラインになり、顧客 #123、たとえばバージョン #20 を編集している間、オフラインで変更を続けています...

シナリオ:

1 - 2 人の従業員が顧客番号 123 を編集し、1 つ以上の同一の属性を変更します。

2 - 2 人の従業員が顧客番号 123 を編集しますが、同じ変更は行いません (2 人は触れずに互いに交差します)。

...その後、両方がオンラインに戻り、最初に従業員 A が追加され、それによって顧客がバージョン #21 に変更され、次に従業員 B が引き続きバージョン #20 に変更されます

質問:

シナリオ 1 で保持するのは誰の変更ですか?

シナリオ 2 でマージを行うにはどうすればよいですか?

環境:

1 - CQRS + イベント ソーシング スタイル システム

2 - イベント ソーシング データベースをキューとして使用する

3 - 読み取りモデルの結果整合性

4 - RESTful API

視覚的に傾いているための図。 これは MS ダイアグラムのマッシュアップであり、いくつかの点が変更されています

EDIT-1:これまでの回答に基づく説明:

きめの細かいマージを実行するには、たとえば、フォームのフィールドごとに 1 つのコマンドが必要ですか?

ここに画像の説明を入力

上記の、ChangeName、ChangeSupplier、ChangeDescription などのきめ細かいコマンドは、それぞれ独自のタイムスタンプを持ち、イベント A と B の両方が ChangedName? を更新した場合に自動マージを可能にします。

編集-2: 特定のイベント ストアの使用に基づくフォローアップ:

イベントストリームの永続化のために @GetEventStore を利用するようです。

次のように、楽観的同時実行性を利用します。

  • ストリーム内のイベントごとに、ストリーム バージョンが 1 ずつインクリメントされます

  • 書き込みでは、ライターの ES-ExpectedVersion ヘッダーを使用して、期待されるバージョンを指定できます

    • -1 は、ストリームが存在しないことを指定します

    • 0 以上はストリーム バージョンを指定します

    • ストリームがそのバージョンにない場合、書き込みは失敗します。期待される新しいバージョン番号で再試行するか、動作を再処理して、必要に応じて問題ないと判断します。

  • ES-Expected Version が指定されていない場合、楽観的同時実行制御は無効になります

  • このコンテキストでは、オプティミスティック コンカレンシーはメッセージ ID だけでなく、イベント # にも基づいています。

0 投票する
1 に答える
853 参照

eventstoredb - EventStore で有効な eventId は何ですか?

eventId なしでイベントを投稿しようとすると、次のようになります。

HTTP/1.1 400 空の eventId が提供されました。

eventId にランダムなものを入力すると、次のようになります。

HTTP/1.1 400 書き込みリクエストの本文が無効です

サーバーの標準出力には、次のように表示されます。

値「foo」を「System.Guid」型に変換中にエラーが発生しました

有効な EventId を取得するには何が必要ですか?

指図:

イベント.json:

私は .NET 言語を使用していません。

0 投票する
0 に答える
483 参照

cqrs - EventStore - 作成時間によるイベントの読み取り

たとえばイベント番号 123 から EventStore ( http://geteventstore.com/ ) ストリームを読み取りたい場合は、単純に ReadStreamEventsForwardAsync を使用して、ストリームの開始位置を指定します (この場合は 123 に設定します)。

ユーザーが指定した日付以降に作成されたすべてのイベントを読み取ることができる同様の機能があるかどうか疑問に思っています (たとえば、2014 年 12 月 20 日以降に作成されたすべてのイベントが必要です)。

単純な実装では、ストリーム全体を読み取り、ResolvedEvent の「Created」フィールドで結果をフィルタリングするだけです。

編集:単純なソリューションを実装したところ、新しい関数が「StreamEventsSlice」ではなく「ResolvedEvent []」を返すようになり、不要な矛盾が発生することに気付きました。

0 投票する
3 に答える
268 参照

event-sourcing - 集合体間通信

現在、集約ルートごとに 1 つのイベント ストリームと 2 つの集約ルートがRoomありRoomTypeます。

の動作は、それがRoom何であるかによって異なりRoomTypeます。両方の集計を分離するために、TheRoomTypeは集計で roomTypeId として表されRoomます。の変更はRoomType、イベントによって表されRoomTypeChangedます。

RoomTypes個別に管理でき、別のアグリゲートにある必要があります。

ここで、次の使用例を検討してください。

ユーザーが を無効にするRoomTypeと、すべてRoomsRoomtypeフォールバックに切り替わるはずRoomTypeです。

私はいくつかのアプローチを考えましたが、それらはすべて問題があるようです:

  1. イベント リスナーに -event をリッスンさせ、それを持つすべての-aggregatesRoomTypeInvalidatedに を送信します。どうすればこれを行うことができますか?私のreadmodelにアクセスしない限り、どの集計がそれを持っているかを知る方法はありません。これは間違っているようです。すべての集約をロードする場合でも、(geteventstore を使用して) すべてのストリームのサブセットをロードできないため、そのタイプの集約のみをロードする方法はありません。SwitchToFallbackRoomTypeRoomRoomtypeRoomtype

  2. RoomTypeChanged-events を集計に再適用するときは、単に適用するのではなく、まだ存在するRoomかどうかを確認しますが、どれが存在するかを確認するにはどうすればよいでしょうか(1 と同じ状況になりますが、逆になります)。 ? また、イベントの再適用にロジックを入れるのは間違っているようです。それらは状態の変化を表すだけでよいと思います。RoomTypeRoomTypes

これをどのように解決しますか?

0 投票する
2 に答える
556 参照

eventstoredb - Event Store で特定のカテゴリの予測を取得するにはどうすればよいですか?

Event Store で次のプロジェクションを作成しました。

特定のストリームの結果を取得するにはどうすればよいですか? ストリーム ID は次のとおりです。「Ping-255.1」、「Ping-255.2」....「Ping-255.1000」

見て: http://localhost:2113/projection/stats-cont 私は得る:

以下は機能していません: http://localhost:2113/projection/stats-cont/state?partition=255.1

前もって感謝します。

0 投票する
1 に答える
231 参照

node.js - rxjs を使用した統合テスト geteventstore には競合状態があります

申し訳ありませんが、これは少し面倒です。私のプロジェクトはnodejsにあります。私はモカでテストをしています。その中で、geteventstore への接続を開き、ストリームをサブスクライブします。これにより、基本的にイベントの発行が開始されます。

そのイベント サブスクリプションを rxjs オブザーバブルでラップし、コンソールに書き込みます。

半分の時間はイベントでいっぱいのストリームを受け取りますが、半分の時間は受け取りません。

イベントループがリッスンを開始し、何も聞こえず、geteventstore がイベントで爆発を開始する前に閉じているように感じます。

私は少し途方に暮れています。geteventstore がデータを送信していることがわかります。データを取得する時間の半分です。私の理解では、誰かがイベントにサブスクライブしている限り、たとえばイベントリスナーがいる限り、ループは開いたままになります。

おそらく問題はrxjsにありますか?

わかりませんが、どんな助けでも大歓迎です。

- - 編集

参考になるかわかりませんが、テストはこんな感じです。

したがって、mut は geteventstore への接続であり、rx は rxjs であり、サブスクリプション オブジェクトは geteventstore からデータを送り出すイベント エミッターです。

この問題は、geteventstore と rxjs という、少なくとも 2 つのやや変わった製品を扱っているという事実によって混同されていることを理解しています。

つまり、gesConnection とサブスクリプションが実際に接続され、発行されていることを確信しています。さらにテスト/調査する方法がわかりません。

ありがとう