Service Fabric 可靠服务管道设计

Posted

技术标签:

【中文标题】Service Fabric 可靠服务管道设计【英文标题】:Service Fabric Reliable Services Pipeline design 【发布时间】:2016-02-17 00:52:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我也一直在研究这个话题(将应用于我为NServiceBus 和MessageHandler 所做的工作),并想就此事发表我的看法。但是我还没有确定最好的模型是什么。

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

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

如果您从简单的角度来看,我会按照以下方式对其进行分类

A) 每个服务的输入队列:由于消息源需要主动将消息路由到给定的目标队列,因此使用路由模式实现业务流程或工作流(我假设您的管道将代表)相当简单(使用路由滑动模式的静态路由或动态 fe C) 存储和转发:同样,路由是您实现的显式部分,因此静态和动态路由模式都是可能的,但是实际实现更加困难,因为您需要构建和管理从传输中传输消息的消息泵队列(输出)到目标队列以及相关的需要将上下文从消息源流到消息泵中。 (无耻插件:NServiceBus 是一个框架,可以为你消除复杂性,让这个场景像 A 一样简单) B) 每个服务的输出队列:每个服务都需要设置为从另一个队列中显式读取,这种方法只允许静态路由,因为路由规则嵌入在您仅读取的位置(这严重限制了您的功能观点)

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

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

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

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

【讨论】:

伊夫,我从来没有见过这么详细的答案,你帮了很多忙!现在我肯定在考虑 C(存储和转发)模型。毕竟这是一种关注点分离。我仍然不喜欢使用其他 Azure PaaS 服务。我将通过新的这些新指南深入研究 SF。谢谢! 顺便说一句IReliableQueue 正是我的想法。现在我发现它有缺点。 我希望开发团队能解决这些缺点,对于某些/许多场景来说,本地传输将非常有吸引力。 这一个读写器的东西,这会扩展到整个事务吗?如果是这样,天哪。 如果 Azure ServiceFabric 团队中的某个人能在此处插话,那就太好了。我不得不想象竞争消费者模式将成为使用 ServiceFabric 进行扩展的最常见用例之一。真的是 IReliableQueue 的实现不支持它,最好使用类似 Azure ServiceBus 的东西吗?

以上是关于Service Fabric 可靠服务管道设计的主要内容,如果未能解决你的问题,请参考以下文章

Azure Service Fabric 可靠参与者与可靠服务

在同一 Service Fabric 可靠服务中同时使用 WCF 服务和 Web Api

Azure Service Fabric 可靠集合和内存

azure service fabric 有状态服务可靠集合现在是不是支持将数据卸载到磁盘?

在调用 Service Fabric 传输中的可靠服务时传递用户和审核信息

使用 Azure DevOps 部署具有不同名称的 Service Fabric 服务