当前位置: 首页 > 知识库问答 >
问题:

微服务架构-在顺序无关紧要时通过服务传递消息

谭繁
2023-03-14

tl;博士:“我如何通过一堆异步、无序的微服务推送消息,并知道该消息何时通过每个微服务?”

我正在努力为特定的微服务体系结构找到合适的消息传递系统/协议。这不是一个“哪个是最好的”问题,而是一个关于我的设计模式/协议选项的问题。

  • 我在开始队列上有一条消息。假设带有序列化JSON的RabbitMQ消息
  • 我需要该消息通过任意数量的微服务
  • 这些微服务中的每一个都是长时间运行的,必须是独立的,并且可以用多种语言实现
  • 消息经过的服务顺序并不重要。事实上,它不应该是同步的。
  • 每个服务都可以将数据附加到原始消息中,但其他服务会忽略该数据。不应该有合并冲突(每个服务都写入一个唯一的密钥)。任何服务都不会更改或销毁数据。
  • 一旦轮到所有服务,消息应该发布到第二个RabbitMQ队列,其中包含原始数据和新数据。
  • 微服务不会有其他副作用。如果这一切都在一个单体应用程序中(并且使用相同的语言),函数式编程将是完美的。

所以,问题是,通过各种服务管理该消息的适当方式是什么?我不想一次做一个,而且顺序也不重要。但是,如果是这样的话,系统如何知道所有服务何时都已完成,并且最终消息可以写入到结束队列中(以便让下一批服务完成)。

我唯一能想到的半优雅的解决方案是

  1. 要让第一个遇到消息的服务将该消息写入公共存储(例如mongoDB)
  2. 让每个服务做它的事情,标记它已完成该消息,然后检查是否所有服务都已轮到它们
  3. 如果是这样,最后一个服务将发布消息

但这仍然要求每个服务都知道所有其他服务,并要求每个服务都留下自己的印记。这两个都不是我们想要的。

我愿意接受某种“牧羊人”服务。

我很感激我错过的任何选择,并愿意承认它们可能是一个更好的基本设计。

非常感谢。

共有2个答案

翟棋
2023-03-14

我会遵循常见的存储想法。

让每个微服务在公共存储中注册自己。让每个微服务注册它处理消息标识符的时间。

您可以计算出哪些n个服务应该处理它,以及n个服务中有多少个已经处理了它。

没有服务需要相互了解。

上官飞
2023-03-14

管理长时间运行的流程(或涉及多个微服务的流程)有两种方法:编排和编排。有很多文章描述了它们。

长话短说:在编排中,您有一个跟踪流程状态的微服务,在编排中,所有微服务都知道下一条消息发送到哪里和/或流程何时完成。

本文解释了这两种风格的好处和权衡。

编排优势

  • 提供了一种在有同步处理时控制应用程序流的好方法。例如,如果服务A需要在调用服务B之前成功完成

业务流程权衡

>

  • 将服务耦合在一起,创建依赖关系。如果服务A关闭,则永远不会调用服务B和C。

    如果所有请求都有一个orchestrator的中央共享实例,则orchestrator是一个单点故障。如果下降,所有处理都会停止。

    利用阻止请求的同步处理。在此示例中,端到端的总流转时长是调用服务A服务B服务C所需的时间之和。

    编排优势

    >

  • 启用更快的端到端处理,因为服务可以并行/异步执行。

    更容易添加/更新服务,因为它们可以轻松插入/退出事件流。

    与敏捷交付模型非常一致,因为团队可以专注于特定服务而不是整个应用程序。

    控制是分布式的,因此不再有单个编排器作为故障的中心点。

    有几种模式可以与反应式体系结构一起使用,以提供额外的好处。例如,事件源是指事件流存储所有事件并启用事件重播。这样,如果一个服务在事件仍在生成时宕机,当它重新联机时,它可以重播这些事件以进行备份。此外,还可以应用命令查询责任分离(CQRS)来分离读写活动。这使得每一个都可以独立地进行缩放。如果您的应用程序读得重,写得轻,或者读得重,写得轻,那么这就很方便了。

    舞蹈设计权衡

    >

  • 异步编程通常是开发人员的重大思维转变。我倾向于认为它类似于递归,您无法通过查看它来弄清楚代码将如何执行,您必须考虑在特定时间点可能是真的所有可能性。

    复杂性发生了变化。流控制现在被分解并分布在各个服务中,而不是集中在编排器中。每个服务都有自己的流逻辑,该逻辑将根据事件流中的特定数据确定其何时以及如何做出反应。

  •  类似资料:
    • Kubernetes 设计之初就是按照 Cloud Native 的理念设计的,Cloud Native 中有个重要概念就是微服务的架构设计,当将单体应用拆分微服务后, 随着服务数量的增多,如何微服务进行管理以保证服务的 SLA 呢?为了从架构层面上解决这个问题,解放程序员的创造性,避免繁琐的服务发现、监控、分布式追踪等事务,Service mesh 应运而生。 微服务 下图是Bilgin Ibr

    • 我听说亚马逊使用HTTP作为其基于微服务的架构。另一种方法是使用RabbitMQ或Solace Systems这样的消息传递系统。我个人对基于Solace的微服务架构有经验,但从未使用过REST。 知道像Amazon、Netflix、UK Gov等各种大联盟实现使用什么吗? 其他方面是,在微服务中,还需要以下东西(除了其他东西): *模式匹配 *异步消息传递。接收系统可能已关闭 *发布订阅 *缓存

    • 我读了一些文章,看了一些视频,但在为这些微服务提供服务方面,没有找到具体的建议。我的理解是,他们应该使用自己的应用程序服务器。 我的问题是它们应该部署在不同的服务器上,还是没关系。 当它们在同一台服务器(计算机)上提供服务时,不会有端口冲突吗?

    • 我正在计划开发一个基于微服务的架构应用程序,当我阅读Ronnie Mitra的书《微服务架构》时,我决定使用Kafka进行内部通信;马特·麦克拉蒂;迈克·阿蒙森;伊拉克利·纳达雷什维利说: 让微服务直接与消息代理(如RabbitMQ等)交互很少是个好主意。如果两个微服务通过消息队列通道直接通信,那么它们共享一个数据空间(通道),我们已经详细讨论了两个微服务共享一个数据空间的弊病。相反,我们可以做的

    • 大家好, 我试图找出如何基于Wildfly中运行的模块(war)移动我当前的系统架构。现在所有的基础资源都放在JNDI树中,比如数据源、JMS等等。。。我的项目框架是Spring 4和family,它允许我查找这些资源和其他内容。 我的目标是使用Spring Boot和Spring Cloud Netflix创建一个微服务架构,其中每一个WAR都是一个通过总线服务集成的新的独立应用程序。 但我的疑

    • 让我们讨论一下微服务环境的体系结构。我们正在公司内部进行讨论,我想得到一些反馈。我认真考虑的是编排层(代码复制、更多移动部件改变api)。 网络应用- 原料药- 在这种情况下,服务不允许相互对话。业务流程层中的聚合服务 网络应用- 原料药- 这里允许服务相互对话,这里存在聚合服务。 账单属于哪里