Apo*_*llo 8 architecture design-patterns message-queue rabbitmq microservices
Tl;博士:"我如何通过一堆异步,无序的微服务推送消息,并知道该消息何时通过它们?"
我正在努力为特定的微服务架构找到合适的消息传递系统/协议.这不是"哪个是最好的"问题,而是关于我对设计模式/协议的选择的问题.
那么,问题是,通过各种服务管理该消息的适当方式是什么?我不想一次做一个,订单并不重要.但是,如果是这种情况,那么系统如何知道所有服务何时发生了重击并且最终消息可以写入结束队列(以使下一批服务完成它们).
我能想到的唯一,半优雅的解决方案是
但是,这仍然需要每个服务都知道所有其他服务,并要求每个服务留下其标记.这些都不是必需的.
我对某种"牧羊人"服务持开放态度.
我很感激我错过的任何选择,并且愿意承认他们可能是一个更好的,基本的设计.
谢谢.
Con*_*enu 12
管理长时间运行的流程(或涉及多个微服务的处理)有两种方法:编排和编排.有很多文章描述它们.
简而言之:在Orchestration中,您有一个跟踪过程状态的微服务,在编排中,所有微服务都知道下一个消息发送的位置和/或过程何时完成.
此文章解释了两种风格的好处和tradeofs.
协调优势
业务流程权衡
将服务结合在一起创建依赖关系.如果服务A关闭,则永远不会调用服务B和C.
如果所有请求都有一个orchestrator的中央共享实例,则协调器是单点故障.如果它发生故障,所有处理都会停止.
利用阻止请求的同步处理.在此示例中,总端到端处理时间是服务A +服务B +服务C被调用所花费的时间的总和.
编舞的好处
由于可以并行/异步执行服务,因此可以实现更快的端到端处理.
更容易添加/更新服务,因为它们可以轻松地插入/插入事件流.
与敏捷交付模型很好地协调,因为团队可以专注于特定服务而不是整个应用程序.
控制是分布式的,因此不再有单个协调器作为中心故障点.
可以将几种模式与反应式架构一起使用以提供额外的好处.例如,Event Sourcing是事件流存储所有事件并启用事件重放的时间.这样,如果服务在事件仍然产生时停止,当它重新联机时,它可以重播这些事件以便恢复.此外,可以应用命令查询责任隔离(CQRS)来分离读取和写入活动.这使得每个都可以独立缩放.如果您的应用程序读取繁重且写入较轻,反之亦然,则此功能非常有用.
编排权衡
异步编程通常是开发人员的重要思想转移.我倾向于认为它类似于递归,在那里你无法通过查看它来弄清楚代码将如何执行,你必须考虑在特定时间点可能存在的所有可能性.
复杂性发生了变化.流控制现在被分解并分布在各个服务中,而不是将流控制集中在协调器中.每个服务都有自己的流逻辑,该逻辑将根据事件流中的特定数据确定何时以及如何响应.