使用 ESB(即 MassTransit)时,微服务如何才能真正独立?
How can microservices be truly independent when using an ESB (i.e. MassTransit)?
我正在对使用 MassTransit 分解当前的单体系统进行初步调查。我使用基于队列的 ESB 的主要原因是我首先处理的一组功能是使用共享数据库,本质上是一个队列。
我也一直在阅读 "Building Microservices" 虽然我还没有读完,但核心原则之一似乎是微服务本质上应该是独立的。
我如何协调使用必然共享消息库(或至少合同)的 MassTransit 以及这些服务不必 "know" 彼此有任何关系的事实?
问题实际上是关于耦合的。您的各种服务的耦合程度如何? 'Standalone' 意味着一定程度的松散耦合,但为了互操作,需要 一些 耦合程度。挑战在于尽可能松耦合,同时保持互操作性,让您的组件协同工作以实现您想要的结果。
通过消息契约的耦合是松耦合。这只需要您的每个服务都知道并理解它们之间传递的数据(消息)的'shape'。这些服务不需要共享任何代码、主机甚至平台。
使用 ESB 时,这种消息共享知识是您的服务彼此 'know' 唯一需要的东西。根据您使用的传输类型,您可能还需要为每个服务提供其他服务的位置 (URI) 知识,但同样,这是一个非常松散的耦合(空间耦合),可以进一步松散,例如域名系统。如果您选择使用代理传输,例如像 RabbitMQ 这样的集中式队列技术,那么这种空间耦合可以被移除,但这伴随着其他权衡。
请记住,MassTransit 并不是 .NET 中可用的唯一选项 space。例如。一个流行的选择是 NServiceBus(完全披露:我为 Particular Software 工作,NSB 是我们的产品之一)。
我正在对使用 MassTransit 分解当前的单体系统进行初步调查。我使用基于队列的 ESB 的主要原因是我首先处理的一组功能是使用共享数据库,本质上是一个队列。
我也一直在阅读 "Building Microservices" 虽然我还没有读完,但核心原则之一似乎是微服务本质上应该是独立的。
我如何协调使用必然共享消息库(或至少合同)的 MassTransit 以及这些服务不必 "know" 彼此有任何关系的事实?
问题实际上是关于耦合的。您的各种服务的耦合程度如何? 'Standalone' 意味着一定程度的松散耦合,但为了互操作,需要 一些 耦合程度。挑战在于尽可能松耦合,同时保持互操作性,让您的组件协同工作以实现您想要的结果。
通过消息契约的耦合是松耦合。这只需要您的每个服务都知道并理解它们之间传递的数据(消息)的'shape'。这些服务不需要共享任何代码、主机甚至平台。
使用 ESB 时,这种消息共享知识是您的服务彼此 'know' 唯一需要的东西。根据您使用的传输类型,您可能还需要为每个服务提供其他服务的位置 (URI) 知识,但同样,这是一个非常松散的耦合(空间耦合),可以进一步松散,例如域名系统。如果您选择使用代理传输,例如像 RabbitMQ 这样的集中式队列技术,那么这种空间耦合可以被移除,但这伴随着其他权衡。
请记住,MassTransit 并不是 .NET 中可用的唯一选项 space。例如。一个流行的选择是 NServiceBus(完全披露:我为 Particular Software 工作,NSB 是我们的产品之一)。