我们有 1 个服务,它从数据库中选择 som id,然后按顺序使用一些业务逻辑处理它们。我们希望横向扩展并并行执行的处理,而不创建大量内部线程。
我的问题是:
如果我想使用 Distributor 进行横向扩展,我应该如何以及如何做到这一点?
解决方案1: 服务拆分为2:
- 原始服务被修改为仅从数据库中选择 id,然后将它们发送给工作人员。这将是分发器 (RunDistributorWithNoWorkerOnItsEndpoint)。
- 一个新的服务,它将保存业务逻辑并作为工作人员处理每个传入的 id。如果我想要更多的工人,我只需多次启动相同的过程。
方案2: 服务拆分为3:
- 原来的服务被修改为只从数据库中选择id,然后发送给distributor。
- 一个新的服务,分发器 (RunDistributorWithNoWorkerOnItsEndpoint),它只处理工作人员的负载平衡。
- 一个新的服务,worker(s),它将保存业务逻辑并处理每个传入的 id。
方案3: 服务拆分为2:
- 原来的服务被修改为只从数据库中选择id然后发送。作为发件人运行。
- 一个新的服务,它将保存业务逻辑并充当工作者和分发者,处理每个传入的 id 或分发它们。
解决方案 1 对我来说很有意义,但使用它意味着分销商会以某种方式承担 2 个责任:
- 选择标识。
- 将 ID 分发给工作人员。
但是当我查看 NSB 文档中的 ScaleOut 示例时,我不确定这是否可能,甚至可能是反模式。
在再次阅读文档和 ScaleOut 示例之后,我认为我应该采用解决方案 3,但我还不太确定。
我试图通过与 NSB 分销商进行横向扩展来解决管道问题,我更愿意自己进行托管,而不是使用 NServiceBus.Host.exe,但这不是严格的要求。
编辑: 我最终使用了解决方案 3,因为如果您使用默认队列命名,它的优势(在我看来)配置队列的任务比解决方案 2 中的小。
亲切的问候