基于微服务的应用程序如何结合使用服务网格和事件驱动架构?

How can microservice based applications use Service Mesh and Event Driven Architecture together?

我遇到了一些应用程序,他们说他们使用事件驱动架构在微服务(Kafka 作为事件代理)和服务网格 (LinkerD) 之间进行通信

有几个问题我还没有找到答案:

  1. 当我读到服务网格的主要特性之一时(在这种情况下 linkerD)是为了帮助服务到服务的通信(服务 发现、重试、熔断、..)。如果应用程序使用 kafka作为微服务间通信的事件代理,如何 Service Mesh 出现了吗?

假设我们有 ServiceAServiceB(都有多个部署/节点)。如果 ServiceA 想要与 ServiceB 对话,它可以生成一个 Kafka 主题, ServiceB 可以订阅。服务网格如何存在于 这种沟通,以及如何改善沟通?

  1. 如果由于负载原因我们有多个ServiceB部署,如何 负载平衡发生在这里吗?如果每个部署都有一个“sidecar” 代理,他们如何决定如何从 Kafka 中读取,以及 分区特定节点读取?他们作为消费者运作吗 组?

服务网格和 event-driven 方法(至少像 Kafka 中那些围绕持久日志构建的方法)是互补的,因为它们从根本上有助于不同的通信模式。所以简短的回答是服务网格与 Kafka 无关,反之亦然(一个例外可能是你决定通过网格发现 Kafka 代理)。

服务网格主要关注时间耦合通信:通信者同时 运行。这种模式有助于对话交流(例如 request-response)。对于 event-driven 方法来说它不是那么有效(因为您通常需要了解当您不是 运行 时发生的事件),除非您的服务本身实际上是重新实现 Kafka(例如,通过 websocket 或 grpc 或其他方式流式传输事件)。

相反,Kafka 非常适合您不关心接收方何时收到消息的通信(扩展到不关心消息被接收了多少次,甚至可能甚至不关心消息是否被接收)已收到)。试图在 Kafka 中实现 request-response 是一种“疯狂 and/or 点燃大量资源”之类的事情。

所以在你的第一种情况下,服务A和服务B不太可能使用服务网格来方便他们使用Kafka(但仍然可以自由地将服务网格用于其他目的)。在你的第二种情况下,通常的 Kafka 分区和消费者组方法将是最有可能进行负载平衡(和故障处理等)的方法。

课程用马等等。