我相信在这个问题上存在误解,因为您认为事件驱动的体系结构无法在HTTP之上实现。
事件驱动的体系结构可以以许多不同的方式实现,并且(当体系结构是分布式系统时),可以在许多不同的协议之上实现。
它也可以使用消息代理(即Kafka,RabbitMQ,ActiveMQ等)来实现。但是,这只是一个选择,当然不是唯一的方法。
例如,重要著作Building Microservices由山姆·纽曼,在第4章:集成,基于事件实现异步协作下称:
“另一种方法是尝试使用HTTP作为传播的一种方式 事件。 ATOM是一个符合REST的规范,它定义了用于发布资源提要的语义 (等等)。许多客户端存在 库,这些库允许我们创建和使用这些供稿。所以 当我们的客户服务发生变化时,我们的客户服务可能会将活动发布到这样的订阅源。我们的消费者只是轮询饲料, 寻找变化。一方面,我们可以重复使用现有的ATOM规范和任何相关库的事实很有用,我们知道HTTP处理能够很好地扩展。然而,HTTP不是 擅长于低延迟(一些消息代理商擅长),我们仍然需要处理消费者需要跟踪他们看到的消息并管理他们自己的轮询时间表的事实。
我看到人们度过一个时代实现你得到的开箱即用适当的消息 经纪人才能ATOM工作了一段用例的 行为越来越多。例如,竞争消费者模式描述了一种方法,通过这种方法,您可以调用多个工人实例来竞争消息,这可以很好地工作来扩大工作人员的数量,以处理独立的 作业列表。但是,我们希望避免两个或更多工作人员看到相同消息的情况,因为我们最终会完成比 需要更多的相同任务。使用消息代理,标准队列将处理这个问题。 通过ATOM,我们现在需要管理我们自己在所有 工作人员之间的共享状态,以尽量减少复制工作的机会。如果您的 已经拥有可用的良好弹性消息代理,请考虑使用它来处理发布和订阅事件。但是 如果你还没有一个,请给ATOM一看,但要注意沉没成本谬误。如果您发现自己希望获得消息代理提供的越来越多的支持,那么在某个时候,您可能想要改变您的方法 。”
同样的,如果你的设计采用事件驱动架构的消息代理,然后我不知道是否需要一个断路器,因为在这种情况下,消费应用控制的速率事件消息正在从队列中消耗。生产者应用程序可以按照自己的速度发布事件消息,消费者应用程序可以添加尽可能多的竞争消费者,以便跟上这一步伐。如果服务器应用程序关闭,则客户端应用程序仍然可以继续使用队列中剩余的任何消息,并且一旦队列为空,它们将继续等待更多消息到达。但是这并没有给生产者应用带来任何负担。在这种情况下,生产者和消费者应用程序是分开的,断路器在其他情况下所做的所有工作都将由消息代理应用程序解决。
可以说服务发现功能有些类似。由于生产者和消费者之间并不直接对话,而只能通过消息中介,所以你需要发现的唯一服务就是消息中介。