gpt4 book ai didi

java - 异步消息传递和微服务

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:28 24 4
gpt4 key购买 nike

我正在计划开发一个基于微服务的架构应用程序,并且在阅读 Ronnie Mitra 的微服务架构一书时,我决定使用 kafka 进行内部通信;马特·麦克拉蒂;迈克·阿蒙森; Irakli Nadareishvili 他们说:

letting microservices directly interact with message brokers (such as RabbitMQ, etc.) is rarely a good idea. If two microservices are directly communicating via a message-queue channel, they are sharing a data space (the channel) and we have already talked, at length, about the evils of two microservices sharing a data space. Instead, what we can do is encapsulate message-passing behind an independent microservice that can provide message-passing capability, in a loosely coupled way, to all interested microservices.

enter image description here

我使用 Netflix Eureka 进行服务注册和发现,使用 Zuul 作为边缘服务器和 Hystrix。话虽如此,在实践中,我该如何实现那种微服务呢?如何使我的微服务独立于通信 channel (在本例中为 Kafka)?实际上我直接与 channel 交互,所以我的发布者/订阅者和 kafka 之间没有额外的层。

更新 06/02/2018

更准确地说,我们有几个微服务:一个在某个主题(activemq、kafka...)上发布新闻,另一个微服务订阅该主题并对通过的消息执行一些操作.因此,我们将这些服务耦合到消息代理(到 channel )......我们将消息代理的 api“嵌入”在我们的代码中,例如,如果我们想要更改消息代理,我们必须更改所有使用消息代理 API 的微服务。因此,他们建议使用微服务(在图片中我假设是事件中心),它是各种消息的“调度程序”。通过这种方式,它是唯一与 channel 交互的组件。

最佳答案

一般性前言 - 如果不需要,请不要这样做。如果您正在处理大量事件和事件备份问题等,那么引入队列系统可能是一个很大的改进。但是如果您没有遇到任何问题,那么直接服务通信的复杂性可能会更好。

回到您的问题 - 听起来您想抽象化与队列的通信,因为您担心用不同的系统替换队列的工作量 - 对吗?

在这种情况下,您可以按照您的建议进行 - 在中间开发一项新服务。这伴随着物理服务的所有包袱(包括部署、扩展等)。

或者第二种选择是编写一个客户端库,以您想要的方式抽象队列,并允许您在需要参与队列的所有服务中重用它。这样您就不必为此目的物理部署另一个服务,但您仍然可以完全控制您的队列接口(interface)应该是什么样子,并且您有一段代码来合并更改(至少朝着队列)。如果您确定库的面向应用程序的一面足够稳定,这将有效。

但是,再次重申,当您不确定是否需要所有复杂性时,不要在第一次迭代中执行任何这些操作。 (过度工程是一件危险的事情)

关于java - 异步消息传递和微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48624757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com