Events 用于CQRS事件发布设置的NServiceBus

Events 用于CQRS事件发布设置的NServiceBus,events,nservicebus,cqrs,neventstore,Events,Nservicebus,Cqrs,Neventstore,我们目前正在建立一个基于CQRS的项目。每个Web项目实例都运行NEventStore,但是所有实例都共享相同的EventStore持久性(底层数据库) 现在,我们想要发布存储的事件:不仅发布到我们的ReadModel(每个Web项目实例一个),还发布到其他事件使用者(例如,遗留应用程序,它们还需要以某种方式从我们的系统通知事件,等等) 因此,我们有x个事件消费者(=事件处理程序)和y个事件发布者,但只有一个事件的“真正来源”(底层EventStore数据库) Q1:现在是否有通过发布/订阅连接

我们目前正在建立一个基于CQRS的项目。每个Web项目实例都运行NEventStore,但是所有实例都共享相同的EventStore持久性(底层数据库)

现在,我们想要发布存储的事件:不仅发布到我们的ReadModel(每个Web项目实例一个),还发布到其他事件使用者(例如,遗留应用程序,它们还需要以某种方式从我们的系统通知事件,等等)

因此,我们有x个事件消费者(=事件处理程序)和y个事件发布者,但只有一个事件的“真正来源”(底层EventStore数据库)

Q1:现在是否有通过发布/订阅连接这些系统的最佳实践

我们考虑通过NServiceBus从EventStore发布事件。所有消费者都应该订阅他们需要的事件类型-因此每个消费者还需要订阅可能不止一个发布者-Q2:这可能吗?我们已经了解到,您不能在多个位置订阅同一事件,请参阅:“一旦您在QueueName@WebServer1,您也将无法订阅来自的Message1QueueName@WebServer2."

其他开放性问题: Q3:如何检测消费者已永久关闭(如果消费者未成功取消总线订阅)。->队伍排满了?!如何将其与仅断开一点网络连接的情况区分开来

Q4:如果订阅服务和EventStore之间的连接不可靠且出现故障,会发生什么情况?消费者在订阅服务上成功注册,但EventStore不知道新订阅,也不传递消息


Q5:一般情况:NServiceBus如何处理队列?当消费者长时间(例如几天)无法联系时会发生什么情况?

Q1:这在某种程度上取决于您订阅邮件的方式。NServiceBus是在存在无法共享数据的业务服务(有界上下文)的情况下构建的。然而,在CQR中,您有包含大量数据的fat事件,这些事件被发布,以便订阅者可以将信息存储在其读取模型中。例如,在用户界面中,此读取模型不可用。通过普通UI或复合UI(从多个业务服务收集信息)。所以这取决于你在找什么

问题2:可以订阅多个事件。但是,事件只有一个逻辑发布服务器。因此,“CustomerWasBilled”事件不能来自ComponentA和ComponentB。但是,您可以订阅许多不同的事件,每个发布者当然可以有许多不同的订阅者

[Udi]一个给定的发布服务器可以跨多个服务器扩展,NServiceBus将为您处理此问题-无需订阅每台机器

问题3:我认为这是纯粹的行政管理。如果它保持在线并接收消息,队列将被填满。如果它应该永久关闭/脱机,并且没有处理消息,那么在组件关闭后,您很快就会知道。但我强烈建议记录哪些订阅者和发布者彼此连接,以及如果更改消息或组件会发生什么

[Udi]如果是有序关机,则应包括取消订阅。如果它是一个临时崩溃,那么您可以使用标准监控(WMI)来检测它。为了保护队列不被填满,可以使用TimeToBeReceived属性定义何时丢弃消息

问题4:这在NServiceBus中处理。它将订阅存储在数据存储中,数据存储可以是SQL Server、RavenDB和InMemory。但它也会将订阅保存在内存中,并定期检查是否添加了新订阅。NServiceBus不应该有问题

问题5:MSMQ本身在本质上是可靠的。当然,如果您的整个服务器崩溃,并且所有消息都在被炸的硬盘上,那就是一个问题。如果一个组件在更长的时间内无法访问,那么这取决于SLA是否会发生。您可以监视传入队列或错误队列中的消息计数。也不要忘记死信队列。但NServiceBus还允许您监控消息处理所需的时间

当组件长时间(如几天)无法访问时,业务部门应决定如何操作。如果处理重要的消息,则引入集群等


希望这有帮助

谢谢你的回答。还有一些问题:问题2:我只有一个订阅服务,但有多个EventStore实例?或者NServiceBus如何处理扩展?Q4:如果EventStore检测到它无法再访问订阅服务(在其定期检查期间?)会发生什么情况?Q5:Q2:你是说,一个中央订阅服务?如果是,则不是。多个组件可以发布事件,但从逻辑上讲,每个事件只有一个发布者。因此,正如Udi所指出的,您可以扩展到多台机器。但在不向外扩展的情况下,只有单个组件可以发布事件。但是如果你有两个活动,你可以很容易地有两个出版商。每个事件一个。问题4:我不太熟悉EventStore,但您可能有代码将事件提交到EventStore并“通知”订阅服务。但是,将事件提交到EventStore的代码也将使用(例如)NServiceBus发布事件本身。问题2:“逻辑上”是什么意思,NServiceBus如何知道两个进程是否“逻辑上”相同?在您的设计中,逻辑上是指纸面上的。可能在大多数情况下,这意味着您也只有一个技术部署。但是,如果您想要扩展,使用NServiceBus,您可能会使用分发服务器(随NServiceBus提供),这将在服务器上生成相同的组件