1

私は最近 DDD に慣れ、重要な概念を把握しようとしています。ローカル サブスクライバーのドメイン イベントを発行する場合のクエリがあるので、イベント発行者が AQMP を介してリモート サブスクライバーへの発行の両方を処理すると想定できますか?また、オブザーバブルを活用してローカルのサブスクライバーに公開しますが、これはスケーラブルなソリューションですか? または、これを処理するおなじみのパターンはありますか? (prblm に対する反応的な解決策があるかどうかもアドバイスします。RxJava などの可能性があります)

4

1 に答える 1

3

ローカルまたはリモートのサブスクライバの場所は、発行イベントを発生させるドメイン エンティティに対して完全に透過的である必要があります。

あなたの考えは私が使っているデザインと非常に似ています。私はローカル イベント パブリッシャーの非常に原始的なバージョンを使用します。これは、メッセージング ミドルウェアを介して通信します (イベントを他のすべてのローカル パブリッシャーに伝達する AMQP)。

私はJavaでそれを行っていませんが、実際、ローカルイベント「バス」にはRx.Netを使用しています(リアクティブ拡張にはすべての言語でほぼ同じAPIがあるため、RxJavaは機能します)

トランザクション サポートを取り除いた単純化されたバージョンは次のようになります。

public class EventHub 
{
    private readonly ISubject<object, object> _messages;
    public EventHub()
    {
        var _subject = new Subject<object>();
        m_messages = Subject.Synchronize(_subject);
    }

    public void Publish<T>(T message)
    {
        m_messages.OnNext(message);
    }

    public IObservable<T> AsObservable<T>()
    {
        return m_messages
            .ObserveOn(ThreadPoolScheduler.Instance)
            .OfType<T>()
            .Synchronize()
            .AsObservable();
    }
}

リモート機能を追加すると、別のサブスクライバーが追加され、すべてのイベントをサブスクライブして他のローカル EventHub にルーティングし、他のイベントハブをリッスンしてローカル ハブでイベントを発行します。EventHub コンポーネントは変更されません。

于 2016-01-19T15:30:58.337 に答える