Architecture 每个事件生成器一个主题,而多个生成器消息传递体系结构共享一个主题
这是一个有点普遍性的问题,因为它不仅适用于我的场景(使用Azure Service Bus),而且适用于发布/订阅服务器与事件上下文中的任何事件总线 问题是:是否倾向于采用一种体系结构/拓扑结构,在这种结构/拓扑结构中,主题不能在制作者之间共享? 换句话说:每个事件制作人一个主题,而多个制作人共享一个主题 我有一个明确的偏好:一个主题只能由一个制作人拥有和访问,如果是其他制作人的话。但我似乎是团队中唯一持这种观点的人,而其他人似乎在不同的活动制作人之间“为了简单”分享同一主题方面没有任何问题,而且我也无法就技术可行性进行真正的争论 我希望从更技术的角度找到有价值的答案和良好的实践,因为我的推理是从更商业/组织的角度出发的,因为我来自DDD背景,而其他人则不是Architecture 每个事件生成器一个主题,而多个生成器消息传递体系结构共享一个主题,architecture,azureservicebus,event-bus,azure-servicebus-topics,message-bus,Architecture,Azureservicebus,Event Bus,Azure Servicebus Topics,Message Bus,这是一个有点普遍性的问题,因为它不仅适用于我的场景(使用Azure Service Bus),而且适用于发布/订阅服务器与事件上下文中的任何事件总线 问题是:是否倾向于采用一种体系结构/拓扑结构,在这种结构/拓扑结构中,主题不能在制作者之间共享? 换句话说:每个事件制作人一个主题,而多个制作人共享一个主题 我有一个明确的偏好:一个主题只能由一个制作人拥有和访问,如果是其他制作人的话。但我似乎是团队中唯一持这种观点的人,而其他人似乎在不同的活动制作人之间“为了简单”分享同一主题方面没有任何问题,而
- 主题是一对多通信的输出框(我将其解释为一个事件发布者、多个订阅者)
- 一个主题可以处理不同类型的事件消息,只要它们以某种方式相关(当然,这是非常相对的)
- 在DDD中,有一个有界上下文的概念,我喜欢将微服务/模块视为实现这些有界上下文的一种方式。因此,即使其他一些服务“认为”它们想要发布相关的内容,并且想要访问共享主题进行发布,我认为它们属于不同的有界上下文,它们应该有自己的主题
- 如果多个生产者确实属于相同的有界上下文,那么我认为只有一个服务(或infra模块)负责发布在有界上下文中发生的事件
- 一个制作者可能也想使用来自其他制作者的事件(它也是一个订阅者)。制作人订阅同一主题,并且必须根据消息是由自己还是他人生成来区分消息,这是没有意义的
更新1:我不知道NServiceBus,但我与MassTransit有过一些合作,并且在利用拓扑创建MassTransit时(这是afaik的唯一方法),它不仅为每个制作人,而且为每个消息类型创建了不同的主题。只是为了补充一些原因,我认为我们应该尽可能多地为每个制作人使用一个主题:
- 如果多个生产者将同一事件发布到同一主题,则该事件没有明确的所有权和权限。这与您在有界上下文上的观点类似
- 当多个生产者发布同一事件时,会在这些生产者之间创建事件模式的耦合。现在,事件模式不能在不同时影响所有生产者的情况下发展。这些生产者可以使用事件模式版本控制,但当多个生产者更新同一事件模式(并生成不同版本的事件模式)时,仍然存在争用