为什么在 Rebus 系统中使用多个端点?

Why use more than one endpoint in a Rebus system?

在 Rebus 服务总线中,每个端点有一个 message transport queue。一个端点可以处理多个消息,并且系统中可能只有一个端点。

除了消息的吞吐量,在 Rebus 服务总线系统中使用多个端点还有什么原因?

问得好! :) 您可能希望同时激活多个 Rebus 端点的原因有很多。

一个明显的原因是您可能希望在单独的进程中托管端点,以便您可以彼此独立地更新它们。但由于这个原因非常明显,我假设您正在考虑 可能希望在同一进程中托管多个 Rebus 端点的原因

让我提几点(*):

并发要求

一个端点可能正在托管经历争用的数据,因此无法从并发处理消息中获益 - 这个端点可能只有几个线程和低并行度,可能是 1/1。

另一个端点可能正在进行基于流的数据处理(例如,将 blob 从一个地方加载到另一个地方,从 Web 服务下载数据等),这可以通过一个非常高的吞吐量和低资源需求来完成线程和高水平的并行性——例如1/20.

另一个端点可能会做很多 serialization/deserialization,这通常是 CPU-bound,因此可能会受益于 运行 在一个有很多 worker 的多核盒子上线程和匹配的并行性——例如10/10.

如您所见,端点执行的任务类型可能需要与任务性质相匹配的配置。

SLA

一个端点可能被指定用于处理低优先级的后台内容,例如将数据移动到冷存储,优化历史数据存储等

另一个端点可能正在处理消息,其中低延迟是最重要的质量属性。

如果这两个使用同一个队列,低优先级后台内容有时会阻塞队列,阻碍其他消息的低延迟处理。

逻辑分离

我有很多次都是从在同一个进程中托管多个 Rebus 端点开始的,因为这在开发过程中很容易处理,同时保持端点分离,因为它们实现了不同的业务功能。

这样很容易在一段时间后将它们分开,从而实现更高程度的分离和独立。


(*) Udi Dahan 使用概念 "business components" 和 "autonomous components" 其中第一个是业务能力的实现,第二个是业务组件被分解成什么,主要是为了技术原因。

我想你可以说我提到的前两个原因是 "autonomous component" 原因导致的不同端点,而第三个原因是分离,因为事物属于不同的业务组件。

Udi 对这些与系统的物理组成方式完全正交的概念保持非常严格的看法,但我几乎总是以逻辑分离和物理分离之间的高度收敛告终。