DDD 中供本地使用的领域事件
Domain events for local consumption in DDD
我最近正在熟悉 DDD 并试图掌握关键概念,我有一个关于为本地订阅者发布域事件的查询,所以我可以假设事件发布者负责发布通过 AQMP 向远程订阅者发送消息,同时还利用 observable 将其发布给本地订阅者,这是一个可扩展的解决方案吗?或者是否有一个熟悉的模式来处理这个问题?(如果有 prblm 的响应式解决方案,也请告知,可能是 RxJava 或类似的)
订阅者的位置,本地或远程,应该对引发发布事件的域实体完全透明。
你的想法和我用的设计很像。我使用一个相当原始的本地事件发布者版本,它通过消息传递中间件(AMQP 将事件传播到所有其他本地发布者)进行通信。
我在 Java 中没有这样做,但实际上,对于本地事件 "bus" 我使用 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 并在本地集线器上发布它们的事件。它不会更改 EventHub 组件。
我最近正在熟悉 DDD 并试图掌握关键概念,我有一个关于为本地订阅者发布域事件的查询,所以我可以假设事件发布者负责发布通过 AQMP 向远程订阅者发送消息,同时还利用 observable 将其发布给本地订阅者,这是一个可扩展的解决方案吗?或者是否有一个熟悉的模式来处理这个问题?(如果有 prblm 的响应式解决方案,也请告知,可能是 RxJava 或类似的)
订阅者的位置,本地或远程,应该对引发发布事件的域实体完全透明。
你的想法和我用的设计很像。我使用一个相当原始的本地事件发布者版本,它通过消息传递中间件(AMQP 将事件传播到所有其他本地发布者)进行通信。
我在 Java 中没有这样做,但实际上,对于本地事件 "bus" 我使用 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 并在本地集线器上发布它们的事件。它不会更改 EventHub 组件。