我目前正在调查使用NServiceBus解决以下问题。我只是想确保我不会在这个兔子洞里走。多线程CQRS与NServiceBus
我有一个基于CQRS架构的解决方案。本质上,我有一系列命令通过NServiceBus传递给端点,我执行一些处理来改变聚合根的状态,然后发出一系列事件来通知系统其余部分的变化。
我的问题是,这一切都很好的一个线程,我不需要担心锁定任何给定的聚合根,而我改变状态。
我们已经到了一个线程不会削减它的地步,我需要开始研究使用多个工作线程/进程来处理消息。
根据我可以同时处理多个聚合根的事实,有一个自然的任务分解,但是我不能同时处理同一个聚合根的多个消息,因为这会导致高由于收到消息的速度而导致的争用。
我想避免这种情况,我需要锁定一个特定的聚合根ID,而是将一个聚合根分配给队列/线程/进程,这将确保来自同一聚合根的所有消息都被同步处理。
我正在使用NServiceBus的Pub/Sub模型发布事件。就我所看到的问题而言,这些事件需要从同一端点发布,即使该消息的处理可能委托给另一个端点。即当我实际上在“MyDomainQueue-Worker1”上处理消息时,我需要欺骗系统认为消息是从“MyDomainQueue”发布的。
我的计划是创建一个自定义分配器,它允许主端点将消息处理委托给工作端点。分发者将以循环方式为任何给定的聚合根分配一个队列。主要端点将向这些工作人员发送命令,处理将发生,并且工作人员将回复一系列事件。主要终端会将这些事件重新发布到公交车上。
我在寻找一些关于这种方法的反馈。感觉就像我正在努力工作一样,我只想检查是否有其他人处理了类似的问题。也许NServiceBus是这个工作的错误工具,或者我的方法可能是错误的。任何和所有的反馈是受欢迎的。
谢谢,
PS - 我也有在其周围将需要上述的溶液中的构型的量的担忧。
你看看内置的分销商吗?有关3/4下面的内容,请参阅下面的页面,它描述了一个扩展的Pub/Sub模型。 http://nservicebus.com/DistributorV3.aspx –