3

我们有 1 个服务,它从数据库中选择 som id,然后按顺序使用一些业务逻辑处理它们。我们希望横向扩展并并行执行的处理,而不创建大量内部线程。

我的问题是:

如果我想使用 Distributor 进行横向扩展,我应该如何以及如何做到这一点?

解决方案1: 服务拆分为2:

  1. 原始服务被修改为仅从数据库中选择 id,然后将它们发送给工作人员。这将是分发器 (RunDistributorWithNoWorkerOnItsEndpoint)。
  2. 一个新的服务,它将保存业务逻辑并作为工作人员处理每个传入的 id。如果我想要更多的工人,我只需多次启动相同的过程。

方案2: 服务拆分为3:

  1. 原来的服务被修改为只从数据库中选择id,然后发送给distributor。
  2. 一个新的服务,分发器 (RunDistributorWithNoWorkerOnItsEndpoint),它只处理工作人员的负载平衡。
  3. 一个新的服务,worker(s),它将保存业务逻辑并处理每个传入的 id。

方案3: 服务拆分为2:

  1. 原来的服务被修改为只从数据库中选择id然后发送。作为发件人运行。
  2. 一个新的服务,它将保存业务逻辑并充当工作者和分发者,处理每个传入的 id 或分发它们。

解决方案 1 对我来说很有意义,但使用它意味着分销商会以某种方式承担 2 个责任:

  1. 选择标识。
  2. 将 ID 分发给工作人员。

但是当我查看 NSB 文档中的 ScaleOut 示例时,我不确定这是否可能,甚至可能是反模式。

在再次阅读文档和 ScaleOut 示例之后,我认为我应该采用解决方案 3,但我还不太确定。

我试图通过与 NSB 分销商进行横向扩展来解决管道问题,我更愿意自己进行托管,而不是使用 NServiceBus.Host.exe,但这不是严格的要求。

编辑: 我最终使用了解决方案 3,因为如果您使用默认队列命名,它的优势(在我看来)配置队列的任务比解决方案 2 中的小。

亲切的问候

4

1 回答 1

1

我们在过去的版本中使用解决方案 2 完成了此操作。原因是我们使分发器保持一致且高度可用。将来我们很可能会让 Distributor 做一些工作,否则它只会相对闲置。这个解决方案对我们很有帮助。

于 2013-03-07T18:28:14.367 回答