Service Fabric Reliable Services 管道设计

Service Fabric Reliable Services Pipeline design

如果 Service Fabric 的 Reliable Services,我需要实施管道,并且我需要一些指南,从可靠性简单性和简单良好的设计的角度来看,这些方法中哪些是更可取的:

我也一直在研究这个主题(将应用于我 NServiceBus and MessageHandler 的工作),并想提供我对此事的看法。但是我还没有确定最好的模型是什么。

如果您忽略 ServiceFabric 的实际实施,我会在可靠性方面按以下顺序对建议的方法进行分类:

  • C) 在服务间通信方面,存储转发模型可能是 3 种模型中最好的,所有服务都可以彼此独立工作,并且绝不会受到网络中断的影响(增加的缺点是延迟)
  • A) 每个服务的输入队列:每个服务都不受网络中断的影响,因为它自己的工作。但是,当它希望将消息发送到另一个服务时,它可能会受到网络中断的影响,并且需要内置重试以适应这种情况。
  • B) 每个服务的输出队列:可能是 3 个模型中最少的一个,因为每个服务都直接依赖于其他服务的资源,这导致节点之间对网络可用性的依赖性很大。

如果从简单的角度来看,我会这样分类

  • A) 每个服务的输入队列:由于消息源需要主动将消息路由到给定的目标队列,因此使用路由模式(静态路由或动态路由 f.e。使用路由单模式
  • C) 存储和转发:同样,路由是你实现的一个显式部分,所以静态和动态路由模式都是可能的,但是实际的实现更难,因为你需要构建和管理一个消息泵来传输消息传输队列(输出)到目标队列以及相关的需要将上下文从消息源流到消息泵。 (不要脸的外挂:NServiceBus是一个可以为你带走复杂性,让这个场景简单如A的框架)
  • B) 每个服务的输出队列:每个服务都需要设置为明确地从另一个队列中读取,这种方法只允许静态路由,因为路由规则嵌入在你只读的地方(这严重限制了你从功能角度)

如果我们考虑到 ServiceFabric 的实现细节,那么我假设您想使用 IReliableQueue 实现?但是这个实现有一些缺点,这让我想知道这些模式是否真的可以在 ServiceFabric 的本地存储基础设施上正确实现。

  1. 存储基础设施仅在有状态服务上可用,因此无状态服务(如 Rest API 或其他协议终止网关)不能成为管道的一部分(通常您希望其中之一作为入口点)
  2. 只有1个线程可以同时访问一个可靠的队列,所以不可能同时从同一个队列写入和读取。这严重限制了队列的吞吐量。
  3. 访问可靠队列需要本地事务,但这些事务仅限于单个分区。因此,也不可能扩展您的全状态服务来创建竞争性消费者模式。

考虑到这些缺点,我仍然倾向于为 SF 服务使用另一种队列基础结构,而不是 SF 的持久性模型,例如 Azure 服务总线或 Azure 存储队列(NserviceBus 也允许)。

简而言之,我将同时支持 A 和 C,略微偏向于 C,但在解决这些缺点之前,我不相信使用可靠队列作为实现。