Kafka Msg VS REST通话

时间:2019-09-09 11:01:32

标签: rest apache-kafka microservices kafka-consumer-api spring-kafka

如今,在微服务世界中,当您在微服务之间使用rest api调用可以获得类似的结果时,我在工作场所中看到了很多使用kafka消息的设计。从技术上讲,您可以完全停止使用rest api调用,而可以使用kafka消息传递。我真的想知道最佳实践,它的优缺点,何时在微服务之间使用api调用,何时使用kafka消息传递。

让我们举一个真实的例子:

我有一个库存服务和一个供应商服务。日常供应商服务会调用供应商API来获取新项目,这些新项目需要移入库存服务。项目数最多可以达到10,000个对象。

对于此用例,最好:

  1. 从供应商API获取新数据后,调用库存服务的REST API来存储新项目。

  2. 从供应商API获取新数据后,将其作为消息发送给kafka主题,供库存服务使用

您会选择哪种方式以及要考虑的因素

4 个答案:

答案 0 :(得分:0)

有几篇文章使您容易理解Kafka在微服务中的作用。

microservices-apache-kafka-domain-driven-design

journey-to-event-driven

building-a-microservices-ecosystem-with-kafka

build-services-backbone-events

如果您需要其他帮助,请告诉我。乐意提供帮助。

答案 1 :(得分:0)

微服务架构主张可以独立运行的独立和自主服务。让我们了解为什么需要消息队列?

HTTP协议已同步

人们普遍认为HTTP是异步的。 Http是同步协议,但您的客户端可以异步处理。例如。当您使用http调用任何服务时,您的http客户端将安排在后端线程(异步)上。但是,http调用将一直等待,直到超时或响应返回为止,在此期间,http调用链一直在同步等待。现在,如果您一次有数百个请求,则可以想象同步调度了多少个http调用,并且可以运行套接字。

AMQP

在微服务架构中,我们更喜欢AMQP(高级消息队列协议)。这意味着服务将消息放入队列中,然后将其忽略。这是真正的异步传输协议,因为您的服务一旦将消息放入队列中就完成了,有兴趣的服务会选择它们。

首选这种类型的协议,因为即使其他服务停止运行,您也可以放心扩展,因为它们最终将获得消息/事件/数据。

因此,这实际上取决于您的具体情况。 HTTP易于实现,但您无法很好地扩展它们。消息服务面临着诸如消息顺序和工作程序之类的挑战,但这使体系结构可伸缩并且是首选方式。对于写操作,始终首选队列;对于读操作,您可以使用HTTP,但要确保您没有在一条服务正在调用另一服务而又在调用另一服务的长链中进行操作。

希望有帮助!

答案 2 :(得分:0)

要点(对于只需要要点的人)

  1. Kafka -发布和订阅(只需处理管道,作业完成后会通知)

    REST -请求并等待响应(按需)


  1. Kafka -发布一次-订阅 n 次(通过 n 组件)。

    REST -请求一次,获取一次响应。交易结束。


  1. Kafka -数据存储在主题中。每次都想来回(偏移量),直到保留该主题为止。

    REST -响应结束后,响应结束。手动使用数据库来存储处理后的数据。


  1. Kafka -拆分处理,将中间数据存储在中间主题中(用于速度和容错)

    REST -获取数据,立即处理所有数据,或者如果您希望对其进行分解,请不要忘记照顾您的OWN 中间数据存储


  1. Kafka -发出请求的人 通常 响应不感兴趣(除了响应(如果发送了消息)

    REST -我发出请求意味着我 通常 期望得到答复(不仅仅是收到请求的答复,而是一些对我有意义的东西,例如一些计算结果!)

问与答风格

  

您的数据流吗?

如果数据持续增长,并且您有一条管道可以执行,那么Kafka是最好的。

  

您是否需要一个请求-响应模型?

如果用户请求某些东西并且他等待响应,那么REST就是最好的。

Kafka(或任何其他流媒体平台)通常用于管道,即我们有前向流的数据。

数据进入Kafka,然后从那里通过 component1, component2 等,最后(通常是 )到达数据库中。

按需获取信息,我们需要一个数据存储(数据库),可以在其中查询和获取它。在这种情况下,我们提供了一个REST接口,用户可以调用该接口并获取他想要的数据。


关于您的示例,

  

每天供应商服务都会调用供应商API来获取新商品,   这些需要转移到库存服务中

问题与解答

  

您的供应商API是否使用REST?

然后您需要数据并将其到Kafka。 从那里,您的库存服务(或之后的其他任何服务)将订阅该主题并执行其处理逻辑。

这样做的好处是,您可以将任何需要将卖方数据作为使用者的其他服务添加到卖方主题。

此外,即使在库存服务处理完之后,供应商数据也始终会为您提供。

如果为此使用REST,则需要为每个需要供应商数据的组件调用供应商API,当与Kafka一起使用时,供应商数据变得不重要

  

是否要查询库存?

在通过Kafka处理后将其存储在数据库中,并在此之上提供REST。这是必需的,因为Kafka通常是一个日志,要使数据可查询,您将需要一些数据库。

答案 3 :(得分:0)

kafka的主要优点:

通过对每个服务的直接REST调用-如果您有N个都需要互相通信的服务,则大约有N ^ 2/2个连接。您可能还需要在一些会收到大量请求的服务之前构建一些负载均衡器,也许还需要在服务中建立一个排队/缓冲系统以将其请求排队(大声笑)

使用kafka,您只需要N个主题。根据定义,它已经提供了其排队系统。

kafka的主要缺点:

服务不等待请求响应。一旦响应确实出现在主题中,就很难将响应与请求相关联。