我们目前正在建立一个基于 CQRS 的项目。每个 Web 项目实例都运行 NEventStore,但都共享相同的 EventStore 持久性(基础数据库)。
现在我们要发布存储的事件:不仅发布到我们的 ReadModel(每个 Web 项目实例一个),还发布到其他事件消费者(例如遗留应用程序,它们也需要以某种方式从我们的系统中获知事件,以及许多更多的)。
因此,我们有 x 个事件消费者(= 事件处理程序)和 y 个事件发布者,但只有一个“真正的事件源”(底层 EventStore 数据库)。
Q1:现在有通过发布/订阅连接这些系统的最佳实践吗?
我们考虑通过 NServiceBus 从 EventStore 发布事件。所有消费者都应该订阅他们需要的事件类型 - 因此每个消费者还需要订阅可能不止一个发布者 - Q2:这甚至可能吗?我们了解到您不能在多个位置订阅同一事件,请参阅:David Boike “一旦您在 QueueName@WebServer1 订阅 Message1,您将无法订阅来自 QueueName@WebServer2 的 Message1。”
其他未解决的问题: Q3:如何检测消费者已永久关闭(如果它没有成功从总线退订)。-> 队列满了?!如何将此与仅丢失网络连接的情况区分开来?
Q4:订阅服务和EventStore的连接不可靠,失败了怎么办?消费者在订阅服务上注册成功,但 EventStore 不知道新订阅,也不传递消息......
Q5:一般来说:NServiceBus 是如何处理队列的?当消费者长时间(例如几天)无法联系到时会发生什么?