問題タブ [event-sourcing]

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 投票する
1 に答える
187 参照

c# - EventSourcing で MessageBox を確認しますか?

CQRSでは、イベントソーシングが唯一の真の情報源であり、読み取りデータモデルを決して信頼しないでください。たとえば、「ユーザーXの最後の10アクション」などを表示する確認メッセージボックスを表示する必要がある場合、どのアプローチを使用する必要がありますか?

1 - 最後の 10 個のアクションを集計に照会するコマンドを送信し、集計はユーザーのアクションを含む UI で処理する 10 個のイベントを発行しますか?

2 - または単に、私の Read モデルをクエリしますか?

私の場合、CQRSは何と言っていますか?

みんなありがとう。

ジョンスミス

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

cqrs - JOliverのEventStore:ServiceStackシリアライザーを使用しているときにイベントを読み取ることができません

ServiceStackを使用する場合、EventMessage.Bodyは逆シリアル化されて元のオブジェクトに戻されません。代わりに、EventMessage.BodyはJSON文字列です。

再現するには:

  1. EventStoreプロジェクトを開き、EventStore.Exampleプロジェクトに移動します
  2. EventStore.Serialization.Json参照をEventStore.Serialization.ServiceStackへのプロジェクト参照に置き換えます
  3. EventStore.Exampleプロジェクトでアセンブリ署名をオフにします
  4. MainProgram.WireupEventStoreを.UsingServiceStackJsonSerialization()に変更します
  5. MainProgram.Main()の終わり近くに次のコードを追加します。

-

0 投票する
6 に答える
42990 参照

cqrs - RDBMS をイベント ソーシング ストレージとして使用する

RDBMS (SQL Server など) を使用してイベント ソーシング データを格納する場合、スキーマはどのようになりますか?

いくつかのバリエーションが抽象的な意味で語られているのを見たことがありますが、具体的なものは何もありません.

たとえば、「製品」エンティティがあり、その製品への変更は、価格、コスト、および説明の形式で行われるとします。次のことを行うかどうかについて混乱しています。

  1. 製品のすべてのフィールドを含む「ProductEvent」テーブルを用意します。各変更は、そのテーブルの新しいレコードを意味し、必要に応じて「誰が、何を、どこで、なぜ、いつ、どのように」(WWWWWWH) を加えます。コスト、価格、または説明が変更されると、製品を表すためにまったく新しい行が追加されます。
  2. 製品のコスト、価格、および説明を、外部キー関係を使用して製品テーブルに結合された個別のテーブルに格納します。これらのプロパティが変更された場合は、必要に応じて WWWWH を使用して新しい行を書き込みます。
  3. WWWWWH と、イベントを表すシリアル化されたオブジェクトを "ProductEvent" テーブルに格納します。つまり、特定の製品のアプリケーション状態を再構築するには、アプリケーション コードでイベント自体をロードし、シリアル化解除して再生する必要があります。 .

特に、上記のオプション 2 が心配です。極端に言えば、製品テーブルはプロパティごとにほぼ 1 つのテーブルになり、特定の製品のアプリケーション状態をロードするには、各製品イベント テーブルからその製品のすべてのイベントをロードする必要があります。このテーブルの爆発は、私には悪いにおいがします。

「場合による」と確信しており、単一の「正解」はありませんが、何が受け入れられ、何がまったく受け入れられないかを感じようとしています。また、NoSQL がここで役立つことも認識しています。ここでは、イベントを集約ルートに対して保存できます。つまり、オブジェクトを再構築するためのイベントを取得するためのデータベースへの単一の要求のみを意味しますが、NoSQL データベースを使用していませんその瞬間、私は代替案を探しています。

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

cqrs - EventStore を使用して、praxis で新しいアプリケーション ビューを構築する方法は?

はい、似たようなことが少なくとも数回前に尋ねられました。したがって、答えはわかります。単純に、新しいハンドラーでイベントを再生するだけです。しかし、実際に実装してみると、いくつかの疑問が生じます。

私はJOlivierのEventStoreを使っています。手始めに、SnapShots の概念を無視して、イベントを取得する方法だけを見ていきます。私ができるのは、次のコードだけです。

もちろん、ここでの最初の質問は次のとおりです。これはそれを行う方法ですか?「GetFrom」のパラメーターの使用に問題があります。これは単なる DateTime であり、すべてのサーバーが時間的に同期されているかどうかを確認できないからです。あるサーバーの時計が別のサーバーの時計より 1 分遅れている場合はどうなりますか? それとも1時間半?私は NServiceBus も使用しているので、新しいハンドラー キューは特定の時点からイベントを積み上げます。新しいアプリケーション ビューが開始時に完全に同期していることを 100% (99% ではありません) 確認しながら、EventStore からイベントを取得する方法を教えてください。

また: コードに特別なインポート メソッドを作成しますか? つまり、新しいアプリケーションのハンドラーが「SomeDomainEvent」を処理するときに電子メールを送信するとします。10,000 件の古いイベントすべてについてメールを送信したくありません。praxis/codeでこの「インポート」をどのように行いますか?

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

cqrs - JOliviers の CommonDomain と EventStore を使用して集計のリストを取得するには?

CommonDomain のリポジトリは、「GetById()」のみを公開します。たとえば、ハンドラーが顧客のリストを必要とする場合はどうすればよいでしょうか?

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

nservicebus - CommonDomain と NEventStore でインターフェイスをイベントとして使用するには?

NServiceBusでJOlivers CommonDomain と EventStore を使用してテストを行っています。Aggregate で次のようにイベントを発生させる必要があります。

そして後で私はこのハンドラーを持っています:

残念ながら、これは機能しません。「CommonDomain.Core.HandlerForDomainEventNotFoundException: タイプ 'Phone' の集合体がタイプ 'IPhoneNumberChanged' のイベントを発生させましたが、メッセージを処理するハンドラーが見つかりませんでした。」.

ここでの問題は、「bus.CreateInstance」から作成されたオブジェクトです。これは、純粋な具体的なクラスで動作するためです。しかし、インターフェイスとしてイベントが必要です。これは解決できますか?

編集:注意してください-オブジェクトを作成するために「bus.CreateInstance」を使用する必要はありません。現在「IPhoneNumberChanged」を上げる必要がある最も簡単な(唯一の)方法です。ハンドラーに引数としてインターフェイスがある限り、他の方法も素晴らしいでしょう。

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

domain-driven-design - イベントソーシング: 他者をトリガーするイベントと状態の再構築

特にイベントが他のイベントの発生をトリガーする可能性がある場合に、EventStore からイベントを再生してモデルを再構築するときに何が起こるべきかについて頭を悩ませています。

たとえば、10 回購入したユーザーを優先顧客に昇格させ、特定のプロモーションを提供する電子メールを受け取る必要があります。

そのユーザーのモデルを再構築するたびに電子メールが送信されるのは明らかに望ましくありませんが、10 番目の を再生するときに、これが発生しないようにするにはどうすればよいPurchaseMadeEventでしょうか?

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

cqrs - 古いNSBを実行しているNES(.NETイベントソーシング)は大丈夫ですか?

NSB2.0で実行されている古いインストールがあります。NESが2.5でリリースされていることは知っていますが、それは単なるレイヤーであるため、NSB2.0でNESを試すことができるはずです。また、さまざまな理由から、お客様は、3.0に達するまでNSBをアップグレードすることを望んでいません。だから私はこの特定の顧客のためにNESを使って評価しています、そしてそれはサンプルをコンパイルして起動するようです。

しかし、NSB 2.0でNESを使用しないやむを得ない理由はありますか?

ヴェルナー

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

cqrs - CQRSとイベントソーシングを備えたSOスタイルの評判システム

私はCQRSとイベントソーシングを使って最初の試みに飛び込んでいます。いくつかのガイダンスが必要です。SOスタイルのレピュテーションシステムを実装したいと思います。これは、このアーキテクチャに最適のようです。

例としてSOを維持します。質問が賛成されたとすると、UpvoteCommandこれにより質問の合計スコアが増加し、が発生しますQuestionUpvotedEvent

著者のユーザーアグリゲートはQuestionUpvotedEvent、レピュテーションスコアを上げる可能性のあるサブスクライブする必要があるようです。しかし、このサブスクリプションをいつ/どのように行うかは私にはわかりませんか?Greg Youngsの例では、イベント/コマンドの処理はglobal.asaxに組み込まれていますが、これには集約IDに基づくルーティングは含まれていないようです。

QuestionUpvotedEventすべてのユーザーアグリゲートが正しくないと思われるすべてをサブスクライブするように見えます。そのようなスキームを機能させるには、イベントハンドラーは、そのユーザーが投票されたばかりの質問を所有しているかどうかを識別する動作を示す必要があります。Greg Youngは、これをイベントハンドラーコードに含めるべきではなく、単に状態の変更を伴うべきであると示唆しました。

ここで何が間違っているのですか?

どんなガイダンスでも大歓迎です。

編集

ここで話しているのは、質問とユーザーの集合体間の集合体間の通信だと思います。私が見ることができる1つの解決策は、QuestionUpvotedEventがサブスクライブされていることです。これによりReputationEventHandler、対応するユーザーARをフェッチし、このオブジェクトで対応するメソッドを呼び出すことができますYourQuestionWasUpvoted。これにより、ユーザー固有のUserQuestionUpvotedイベントが生成され、将来の再生機能が維持されます。これは正しい方向に向かっていますか?

編集2

こちらのグーグルグループに関する議論も参照してください。

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

cqrs - NES(.NETイベントソーシング)サンプル例外(NServiceBus 2.0を使用)

箱から出して動作するNESサンプルを使用しています。次に、NServiceBus 2.5バージョンを古い2.0と交換しましたが、MVCアプリケーションの起動時に次のエラーが発生します。

"オブジェクト参照がオブジェクト インスタンスに設定されていません。" NES.EventConverterFactory..ctor()atNES.DI。<。cctor>b_ 6()in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES\DI。 cs:line 24 at NES.DependencyInjectionContainer.ResolveTService in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ DependencyInjectionContainer.cs:line 20atNES.DependencyInjectionContainer。<>c _DisplayClass4 2.<Register>b__3() in C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:line 45 at NES.DependencyInjectionContainer.Resolve[TService]() in C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:line 20 at NES.DependencyInjectionContainer.<>c__DisplayClassa4.b_9()in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ DependencyInjectionContainer.cs:line 59 at NES.DependencyInjectionContainer.ResolveTService in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ DependencyInjectionContainer.cs:line 20atNES.DependencyInjectionContainer。<>c_DisplayClass4`2.b__3()in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ DependencyInjectionContainer.cs:line 45 at NES.DependencyInjectionContainer.ResolveTService in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ DependencyInjectionContainer.cs:line 20 at NES.UnitOfWorkFactory.Begin()in C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ src \ NES \ UnitOfWorkFactory.cs:C:\ Users \ werner \ Downloads \ elliotritchie-NES-9a56ad8 \ elliotritchie-NES-9a56ad8 \ srcのNES.NServiceBus.MessageModule.HandleBeginMessage()の18行目\ NES \ NServiceBus \ MessageModule.cs:line 10 at NServiceBus.Unicast.UnicastBus.TransportStartedMessageProcessing(Object sender、EventArgs e)atNServiceBus.Unicast.Transport.Msmq.MsmqTransport。NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Process()のReceiveFromQueue()

これは、Global.asax.csが「AreaRegistration.RegisterAllAreas();」にヒットしたときに発生します。最終的に、エラーは「EventConverterFactory.cs」の13行目で発生し、静的コンストラクターはnullである「Global.TypesToScan」を反復しようとします。

このサンプルを実行する方法を知っている人はいますか?まったく同じコードがNSB2.5アセンブリで機能するように見えるのは奇妙です...

ヴェルナー