微服务和 Kafka:耦合还是不耦合

Microservices & Kafka: To couple or not to couple

我在思考我们目前正在设置的可能正常的微服务和 Kafka 设置时遇到了问题。

我们在 Kafka 中有一个主题,多个消费者通过不同的消费者组阅读该主题。 但不知何故,我认为这可能会导致微服务耦合,因为我们有两个消费者从同一个主题读取准确的数据。此外,我们没有任何消息保留时间,因此我将 Kafka 视为某种数据存储。所以我认为我们应该将消息复制到另一个 Service/consumer 自己的主题中。

我们对这是如何耦合或去耦合有不同的看法,我想听听你对我错在哪里的看法,因为我觉得我错了。感谢您的支持!

在我看来,使用 Kafka 主题供多个服务或应用使用是正确的方法,只要您的服务不重复依赖它。这意味着服务应该读取队列一次,将数据转换成它需要的任何数据,并在需要时自行存储。通过这种方式,主题不会成为永久数据存储,而是一种解耦的输入数据方式(就好像您要直接使用 raw 数据调用服务,但通过允许服务以更加解耦的方式随时以所需的频率阅读该主题)。这会增加整个系统的弹性。

还有一个耦合,也就是raw数据。但从我的角度来看,多个服务完全可以理解相同的数据格式(主题)——只要它的格式基本稳定。这里的假设是这是 raw 数据,每个服务都必须将其转换为对自身有用的形式。您只需确保 raw 数据格式在需要更改时正确版本化。为了让服务继续工作,您可能必须同时交付多个版本,直到所有服务都支持最新版本。这种类型的架构风格被许多大型系统和作品使用,只要您没有需要要求 raw 数据格式以使其与您的不兼容的方式非常频繁地更改的场景服务设计。 (如果是这种情况,您可能需要下面的另一层稳定元模型来描述动态原始数据。)