我目前正在研究使用 NServiceBus 来解决以下问题。我只是想确保我不会因此而陷入困境。
我有一个基于 CQRS 架构的解决方案。本质上,我通过 NServiceBus 将一系列命令传递到端点,我执行一些处理以更改聚合根的状态,然后触发一系列事件以通知系统的其余部分更改。
我遇到的问题是,这一切都在一个线程上运行良好,我无需担心在更改状态时锁定任何给定的聚合根。
我们已经到了一个线程不会切断它的地步,我需要开始研究使用多个工作线程/进程来处理消息。
基于我可以同时处理多个聚合根的事实,有一个自然的任务分解,但是我不能同时为同一个聚合根处理多个消息,因为这将导致高度争用,因为接收消息的速度。
我试图避免需要锁定特定聚合根 ID 而是将聚合根分配给队列/线程/进程的情况,这将确保同步处理来自同一聚合根的所有消息。
我正在使用带有 NServiceBus 的 Pub/Sub 模型来发布事件。据我所知,问题是这些事件需要从同一个端点发布,即使该消息的处理可能会委托给另一个端点。即,我需要诱使系统认为消息是从“MyDomainQueue”发布的,而实际上该消息是在“MyDomainQueue-Worker1”上处理的。
我的计划是创建一个自定义分发器,它允许主端点将消息处理委托给工作端点。分发器将以循环方式将队列分配给任何给定的聚合根。主端点将向这些工作人员发送命令,进行处理,工作人员将回复一个事件列表。然后主端点将事件发布回总线。
我正在寻找有关这种方法的一些反馈。感觉就像我正在努力让它工作,我只是想检查是否有其他人处理过类似的问题。也许 NServiceBus 是适合这项工作的错误工具,或者我的方法可能是错误的。欢迎任何和所有反馈。
谢谢,
PS - 我也担心上述解决方案所需的配置量。