Kafka 和 REST 用于微服务之间的通信?

Posted

技术标签:

【中文标题】Kafka 和 REST 用于微服务之间的通信?【英文标题】:Kafka AND REST for communication between microservices? 【发布时间】:2018-06-20 10:30:50 【问题描述】:

我目前正在研究一种架构,请参见下文。首先我不确定这种架构是称为事件驱动还是数据驱动架构,或者两者兼而有之。

有一些输入消息从前端发送到T1。这些消息首先经过验证,然后收集并最终评估。

我目前的方法是将原始消息与所有元信息保存在 MS A 中,将排序集合保存在 MS B 中,并将评估保存在 MS C。这会将数据分离到相关的微服务中。

T2 中,我只生成 MS B 需要的消息。 在 T3 中,我只生成 MS C 需要的消息。 但是在评估集合时,来自 MS A 的所有元信息都是必需的。那么这种情况该如何进行呢?

    我应该只向队列发送最少的数据并提供 API 吗? 我是否应该将所有数据发送到队列(为后续服务转发数据)? 我是否应该将下一个服务的所有信息发送到队列并提供 API? 还有别的吗?

还是我误解了“通过​​Kafka通信微服务”的方法?

请随时提出批评! 感谢您的建议!

【问题讨论】:

这有助于回答您的问题吗? confluent.io/blog/… @RobinMoffatt 是的!在我看来,这是一个很大的问题,因此,我不得不考虑几天。所以请原谅我的延迟。所以我理解正确。我使用 kafka 进行全局事件触发,它可以保持焦点缩放并很好地处理它。并且 kafka 消费者通过 API 调用获取所需的数据并将结果发布到另一个队列。 【参考方案1】:

我相信这是一个消息驱动和数据驱动的架构,但这应该不重要。更重要的是微服务使用编排(而不是编排)。这个question 可以提供帮助。

最干净的架构是把所有的数据都放在消息里,这样依赖的数量就限制在2个。另外,系统的弹性也增加了:如果微服务A宕机了,其他下游的微服务可以继续工作。

每个微服务只使用它感兴趣的那部分消息,而忽略另一部分。这创建了一个良好且可扩展的流式处理管道。但是,如果消息太大,您应该使用微服务 A(或任何其他微服务)作为更多数据的参考。

【讨论】:

最后一句话我没听懂。因此,如果消息太大(是的),那么我应该使用 API 调用或者您是什么意思? @DanielEisenreich 我的意思是该事件仅引用保存在其他地方的数据。例如在分布式文件系统中。这些数据可以通过微服务 A 公开的 API 访问。这适用于事件太大而无法移动的情况,即 > 1 GB。 我明白了。您是否愿意将业务逻辑和 API 放在一个微服务中? @DanielEisenreich 恰恰相反。 ms A 中的 API 仅适用于太大的事件(我不应该添加最后一段,因为它会让你感到困惑) 所以如果数据不是太大,那你推荐我帖子的2.解决方案,对吧?为下一个服务转发所有数据并避免 API 调用?

以上是关于Kafka 和 REST 用于微服务之间的通信?的主要内容,如果未能解决你的问题,请参考以下文章

微服务是不是可以结合 REST 和消息传递?

用于微服务的消息队列(如 RabbitMQ)或 Kafka?

REST 微服务之间的通信:延迟

微服务之间的通信:Apache Kafka vs Hazelcast's Topic

OSGi 服务和 REST 微服务之间的区别 [关闭]

Kafka 消息 VS REST 调用