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