如何在 Kafka 中实现请求-回复(同步)消息传递范式?

Ara*_*syh 5 python synchronous apache-kafka kafka-python

我将在我的应用程序中使用 Kafka 作为消息代理。此应用程序完全使用 Python 编写。对于此应用程序的一部分(登录和身份验证),我需要实现一个请求-回复消息传递系统。换句话说,生产者需要同步地从消费者那里得到生产消息的响应。使用 Kafka 及其 Python 库 (kafka-python, ...) 是否可行?

小智 1

我面临着同样的问题(在我的例子中,HTTP命中的请求回复)我的第一个赌注是(100% python):

  1. 启动一个消费者线程,
  2. 发布请求消息(包含request_id)
  3. 加入消费者线程
  4. 从消费者线程获取答案消费者线程订阅回复主题(寻求结束)并处理收到的消息,直到找到request_id(模数超时)

如果它适用于基本测试,不幸的是,创建 KafkaConsumer 对象是一个缓慢的过程(约 300 毫秒),因此对于大流量的系统来说,它不是一个选择。此外,如果您的系统处理并行请求-回复(例如,像Web服务器一样的多线程),您将需要创建一个专用于request_id的KafkaConsumer(基本上通过使用request_id作为consumer_group)以避免回复线程 A 发布的请求被线程 B 消耗(并忽略)。所以你不能在这里回收你的 KafkaConsumer 并且必须支付每个请求的创建时间(除了后端的处理时间)。如果您的请求-回复处理不可并行化,您可以尝试保持 KafkaConsuser 对象可用于开始获取答案的线程

目前我能看到的唯一解决方案是使用数据库(关系型/noSQL):

  1. 请求者将 request_id 存储在数据库中(尽可能本地) aznd 在 kafka 中发布请求
  2. 请求者轮询数据库,直到找到 request_id 的答案 并行地,消费者进程从回复主题接收消息并将结果存储在数据库中

但我不喜欢轮询......它会在大流量系统中对数据库产生沉重的负载

我的2CTS