Kafka 消息 VS REST 调用
Kafka Msg VS REST Calls
如今在微服务世界中,我在我的工作场所看到很多使用 kafka 消息传递的设计,而您可以使用微服务之间的休息 api 调用实现类似的结果。从技术上讲,您可以完全停止使用 rest api 调用,而是使用 kafka 消息传递。我真的很想知道最佳实践、利弊、何时在微服务之间使用 api 调用、何时使用 kafka 消息传递。
让我们举一个现实生活中的例子:
我有库存服务和供应商服务。供应商服务每天都会呼叫供应商 API 获取新物品,这些物品需要转移到库存服务中。项目数最多可达 10,000 个对象。
对于这个用例,是否更好:
从供应商 API 获取新数据后,调用库存服务的 REST API 来存储新项目。
从供应商 API 获取新数据后,将它们作为消息发送到 kafka 主题,以供库存服务使用
你会选择哪种方式,有什么考虑
有几篇文章可以轻松理解 Kafka 在微服务中的作用。
microservices-apache-kafka-domain-driven-design
building-a-microservices-ecosystem-with-kafka
build-services-backbone-events
如果您需要任何进一步的帮助,请告诉我。乐于助人。
微服务架构提倡独立自主的服务,可以自行运行。让我们理解为什么我们需要消息队列?
HTTP协议同步
人们普遍错误地认为 HTTP 是异步的。 Http 是同步协议,但您的客户端可以异步处理它。例如。当您使用 http 调用任何服务时,您的 http 客户端将安排在后端线程(异步)上。但是,http 调用将一直等待,直到超时或响应返回,在此期间,http 调用链一直在同步等待。现在,如果您一次有数百个请求,您可以想象有多少 http 调用是同步安排的,并且您可能 运行 个套接字。
AMQP
在微服务架构中,我们更喜欢 AMQP(高级消息队列协议)。这意味着该服务会将消息丢弃在队列中并忘记它。这是真正的异步传输协议,因为一旦将消息放入队列并且感兴趣的服务就会选择这些消息,您的服务就完成了。
这种类型的协议是首选,因为即使其他服务出现故障,您也可以毫无顾虑地进行扩展,因为它们最终会 message/event/data。
所以这真的取决于你的具体情况。 HTTP 很容易实现,但你不能很好地扩展它们。消息服务有自己的挑战,比如消息的顺序和工作者,但这使得架构可扩展并且是首选方式。对于写操作总是喜欢队列,对于读操作你可以使用 HTTP 但要确保你没有做一个长链,其中一个服务调用另一个服务又调用另一个服务。
希望对您有所帮助!
要点(对于那些只想要要点的人)
-
Kafka - 发布和订阅(只处理管道,工作完成后会通知)
REST - 请求并等待响应(按需)
-
Kafka - 发布一次 - 订阅 n 次(按 n 组件)。
REST - 请求一次,响应一次。交易结束。
-
Kafka - 数据存储在主题中。随时来回查找 (offsets),直到保留主题。
REST - 一旦响应结束,就结束了。手动使用数据库存储处理后的数据。
-
Kafka - 拆分处理,将中间数据存储在中间主题中(为了速度和容错)
REST - 获取数据,一次处理所有数据,或者如果您想分解它,请不要忘记处理 你自己的个中间数据存储。
-
Kafka - 发出请求的人通常是对响应不感兴趣(除了消息发送后的响应)
REST - 我提出请求意味着我 通常 期待一个响应(不仅仅是你收到请求的响应,而是对我有意义的东西,例如一些计算结果!)
问答方式
你的数据流吗?
如果数据源源不断,你有一个管道要执行,卡夫卡是最好的。
您需要请求-响应模型吗?
如果用户请求某些东西并等待响应,那么 REST 是最好的。
Kafka(或任何其他流媒体平台)通常用于管道,即我们有 前向流 数据。
数据到达 Kafka,然后从那里经过 component1, component2 等等,最后(通常) 登陆数据库。
要按需获取信息,我们需要一个数据存储(数据库),我们可以在其中查询和获取信息。在这种情况下,我们提供了一个 REST 接口,用户可以调用该接口并获取他们想要的数据。
关于你的例子,
Everyday vendor service calls the vendor API to get new items and
these need to be moved into inventory service
问题与解答
您的供应商API使用 REST 吗?
然后你需要pull数据并push到Kafka。
从那里您的库存服务(或此后的任何其他服务)将订阅该主题并执行它们的处理逻辑。
这里的优点是您可以将需要供应商数据的任何其他服务作为消费者添加到供应商主题。
此外,即使在您的库存服务处理之后,供应商数据也始终存在。
如果为此使用 REST,则需要为每个需要供应商数据的组件调用供应商 API,这在与 Kafka 一起使用时变得微不足道
是否要查询库存?
通过Kafka处理后存入数据库,并在此之上提供REST。这是必需的,因为 Kafka 通常是一个日志,要使数据可查询,您需要一些数据库。
kafka 的主要优势:
通过对每个服务的直接 REST 调用 - 如果您有 N 个服务都需要相互通信,那么大约有 N^2/2 个连接。您可能还需要在一些接收大量请求的服务之前构建一些负载均衡器,并且可能需要在服务中构建一个 queuing/buffering 系统来排队请求 (lol)
有了kafka,你只需要N个主题。根据定义,它已经提供了排队系统。
kafka 的主要缺点:
服务未等待请求响应。一旦响应出现在主题中,就很难将响应与请求相关联。
如今在微服务世界中,我在我的工作场所看到很多使用 kafka 消息传递的设计,而您可以使用微服务之间的休息 api 调用实现类似的结果。从技术上讲,您可以完全停止使用 rest api 调用,而是使用 kafka 消息传递。我真的很想知道最佳实践、利弊、何时在微服务之间使用 api 调用、何时使用 kafka 消息传递。
让我们举一个现实生活中的例子:
我有库存服务和供应商服务。供应商服务每天都会呼叫供应商 API 获取新物品,这些物品需要转移到库存服务中。项目数最多可达 10,000 个对象。
对于这个用例,是否更好:
从供应商 API 获取新数据后,调用库存服务的 REST API 来存储新项目。
从供应商 API 获取新数据后,将它们作为消息发送到 kafka 主题,以供库存服务使用
你会选择哪种方式,有什么考虑
有几篇文章可以轻松理解 Kafka 在微服务中的作用。
microservices-apache-kafka-domain-driven-design
building-a-microservices-ecosystem-with-kafka
build-services-backbone-events
如果您需要任何进一步的帮助,请告诉我。乐于助人。
微服务架构提倡独立自主的服务,可以自行运行。让我们理解为什么我们需要消息队列?
HTTP协议同步
人们普遍错误地认为 HTTP 是异步的。 Http 是同步协议,但您的客户端可以异步处理它。例如。当您使用 http 调用任何服务时,您的 http 客户端将安排在后端线程(异步)上。但是,http 调用将一直等待,直到超时或响应返回,在此期间,http 调用链一直在同步等待。现在,如果您一次有数百个请求,您可以想象有多少 http 调用是同步安排的,并且您可能 运行 个套接字。
AMQP
在微服务架构中,我们更喜欢 AMQP(高级消息队列协议)。这意味着该服务会将消息丢弃在队列中并忘记它。这是真正的异步传输协议,因为一旦将消息放入队列并且感兴趣的服务就会选择这些消息,您的服务就完成了。
这种类型的协议是首选,因为即使其他服务出现故障,您也可以毫无顾虑地进行扩展,因为它们最终会 message/event/data。
所以这真的取决于你的具体情况。 HTTP 很容易实现,但你不能很好地扩展它们。消息服务有自己的挑战,比如消息的顺序和工作者,但这使得架构可扩展并且是首选方式。对于写操作总是喜欢队列,对于读操作你可以使用 HTTP 但要确保你没有做一个长链,其中一个服务调用另一个服务又调用另一个服务。
希望对您有所帮助!
要点(对于那些只想要要点的人)
-
Kafka - 发布和订阅(只处理管道,工作完成后会通知)
REST - 请求并等待响应(按需)
-
Kafka - 发布一次 - 订阅 n 次(按 n 组件)。
REST - 请求一次,响应一次。交易结束。
-
Kafka - 数据存储在主题中。随时来回查找 (offsets),直到保留主题。
REST - 一旦响应结束,就结束了。手动使用数据库存储处理后的数据。
-
Kafka - 拆分处理,将中间数据存储在中间主题中(为了速度和容错)
REST - 获取数据,一次处理所有数据,或者如果您想分解它,请不要忘记处理 你自己的个中间数据存储。
-
Kafka - 发出请求的人通常是对响应不感兴趣(除了消息发送后的响应)
REST - 我提出请求意味着我 通常 期待一个响应(不仅仅是你收到请求的响应,而是对我有意义的东西,例如一些计算结果!)
问答方式
你的数据流吗?
如果数据源源不断,你有一个管道要执行,卡夫卡是最好的。
您需要请求-响应模型吗?
如果用户请求某些东西并等待响应,那么 REST 是最好的。
Kafka(或任何其他流媒体平台)通常用于管道,即我们有 前向流 数据。
数据到达 Kafka,然后从那里经过 component1, component2 等等,最后(通常) 登陆数据库。
要按需获取信息,我们需要一个数据存储(数据库),我们可以在其中查询和获取信息。在这种情况下,我们提供了一个 REST 接口,用户可以调用该接口并获取他们想要的数据。
关于你的例子,
Everyday vendor service calls the vendor API to get new items and these need to be moved into inventory service
问题与解答
您的供应商API使用 REST 吗?
然后你需要pull数据并push到Kafka。 从那里您的库存服务(或此后的任何其他服务)将订阅该主题并执行它们的处理逻辑。
这里的优点是您可以将需要供应商数据的任何其他服务作为消费者添加到供应商主题。
此外,即使在您的库存服务处理之后,供应商数据也始终存在。
如果为此使用 REST,则需要为每个需要供应商数据的组件调用供应商 API,这在与 Kafka 一起使用时变得微不足道
是否要查询库存?
通过Kafka处理后存入数据库,并在此之上提供REST。这是必需的,因为 Kafka 通常是一个日志,要使数据可查询,您需要一些数据库。
kafka 的主要优势:
通过对每个服务的直接 REST 调用 - 如果您有 N 个服务都需要相互通信,那么大约有 N^2/2 个连接。您可能还需要在一些接收大量请求的服务之前构建一些负载均衡器,并且可能需要在服务中构建一个 queuing/buffering 系统来排队请求 (lol)
有了kafka,你只需要N个主题。根据定义,它已经提供了排队系统。
kafka 的主要缺点:
服务未等待请求响应。一旦响应出现在主题中,就很难将响应与请求相关联。