1

我最近熟悉了 DDD 并试图掌握关键概念,并且我有一个查询是否要为本地订阅者发布域事件,所以我可以假设事件发布者通过 AQMP 负责向远程订阅者发布同时还利用 observable 将其发布给本地订阅者,这是一个可扩展的解决方案吗?还是有一个熟悉的模式来处理这个?(如果有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,并且还会侦听其他 eventthub 并将其事件发布到本地集线器上。它不会更改 EventHub 组件。

于 2016-01-19T15:30:58.337 回答