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