事件驱动的微服务?
跟随这篇深入探讨微服务为什么不能用今天的技术进行 "事件驱动 "的研究。
当谷歌Apigee API管理产品的产品总监Vikas Anand在最近的2022年EDA峰会上发表 "统一API和事件策略的案例 " 的演讲时, 我再次被演讲内容中一个闪亮的错误所震惊。"微服务在提供大量优势的同时,也带来了你需要管理的复杂性。我们基本上可以通过提供一个解决方案来更好地管理这个问题,这个解决方案被称为事件驱动架构。这为这个问题提供了一个解决方案,即微服务和规模化的解决方案,它提供了在你的应用程序中减少依赖性和复杂性的能力,同时仍然允许创建越来越多的微服务。"
虽然我真的不知道这句话是什么意思,但在相关的幻灯片中还是出现了一个明显的错误。
在这里,Vikas显然决定简单地忘记微服务总是作为 "竞争的消费者 "被部署,不断地相互竞争工作负荷。然而,如果我们仔细看一下Vikas的vanilla-EDA幻灯片,就会发现这个重要的细节无处可寻,也没有任何支持。相反,我们看到的是一个单一的 "事件通道",并被告知 "多个订阅者订阅它",这意味着多个微服务。这显然是他声称EDA方法 "允许创建越来越多的微服务 "的原因。
没有解释的是,为什么该图中显示的三个微服务中的每一个--三个 "竞争的消费者 "中的每一个--在它们各自从它们都订阅的完全相同的渠道接收完全相同的事件时,不会都执行完全相同的任务。事实上,在上面的例子中,任何事件都会很明显地导致同一任务被执行3次,这完全没有任何竞争性消费者的概念。
尽管如此,Vikas告知我们,"事件驱动的微服务"仍然是未来的趋势。"这对微服务的这个问题产生了一个解决方案,也是一个规模化的解决方案,它提供了减少你的应用程序中的依赖性和复杂性的能力。"似乎Vikas建议通过简单地忽略这些复杂性来减少 "你的应用中的复杂性"。如果我们认真思考这些复杂性,我们应该理解的是,微服务不能使用今天的技术 "事件驱动"--只能 "面向事件"(例如,通过使用消息代理和其目标特定的消息队列,而不是事件代理和其可公开访问的主题)。这正是我在2020年中期建议EDA社区应该掌握一个新概念的原因。 宏服务.
宏服务--与今天的微服务 不同 --可以是 "事件驱动的",因为它们不代表 "竞争的消费者"。相反,它们的工作量是由一个单一的 "软件组件 "管理的,它有一个单一的数据库,只要有一个可用的 "工作进程"(如果服务器的尺寸正确,这应该是大部分时间),就会启动各个宏服务操作。这样的宏服务方法类似于超高性能的Node.js事件循环,今天很多开发者都在向这种方法转变。这种方法要求的复杂性和成本只是微服务景观的一小部分,也许这就是Uber在2020年4月公开开始放弃微服务的原因(见@GergelyOrosz的推文)。
事实上,在维卡斯的 "事件驱动的微服务 "这个勇敢的新世界里,还有第二个闪亮的错误。正是因为消费者的竞争约束,今天的微服务端点是同步触发的。另一方面,事件总是以异步方式交付:经纪人必须首先确定一个主题是否有任何订阅者,然后才能真正交付任何新的事件--没有特定的顺序--给所有主题订阅者。
为了避免给人留下抨击谷歌的印象--尽管所讨论的遗漏很严重--我宁愿提到我们在EDA峰会赞助商Solace的首席技术官的演讲中看到了完全相同的错误。Shawn McAllister在他的演讲 "用PubSub+平台为你的实时、事件驱动的企业提供动力 " 中告诉我们,零售业也在向 "事件驱动的微服务 "发展,并为我们提供了下面这张幻灯片,在这里,我们再次得到这样的印象:"事件驱动的微服务 "在完美的和谐与合作中并肩工作,同时又是完全独立于对方的。我们再次被要求相信,相互竞争的微服务只需要订阅 "事件网 "上的相同主题,而这些自主的事件消费者中的每一个都会以某种方式知道哪些事件已经或尚未被其竞争的消费者同行异步处理。
与其仅仅向谷歌和Solace指出他们的 "事件驱动的微服务 "演示根本无法计算,事实上,为他们提供一点帮助是相对容易的。微服务--相互竞争的消费者--不可能为其工作负载订阅同一个频道/主题。相反,每个人都需要自己的专用主题,就像消息代理的专用消息队列一样,但有一个重大的转折:需要有一个专用的主题,每个微服务向其发布可用性--这在今天的消息代理世界中似乎没有对应的东西(通常在次优的、轮流的基础上分配工作负载)。一旦任何可能的工作者--"微服务 "或其他--上线,它只需要向工作负载调度器发布其可用性。随着新工作的出现,工作负载调度器--就像Node.js的事件循环--只需要按顺序消费发布到 "工作者可用性 "主题的事件,将任何新的工作负载发布到最新的Worker.Available 事件中提名的专用工作者主题。
虽然我毫不怀疑操作系统开发者几十年来一直在使用几乎相同的方法(鉴于任何内核显然都需要了解工作进程的最新可用性),但这种以经纪人为中心的方法可能被认为是革命性的,因为那些向 "工作者可用性 "主题发布其可用性的工作者不再需要在相同的硬件上运行,这与以前的工作进程不同。事实上,很容易想象你的家庭工作负载在你未被充分利用的PC、笔记本电脑、手机、电视和冰箱的CPU之间并行分享:每个人都以自己的节奏完美地协调工作。