如何配置Kafka RPC调用者主题和组

时间:2019-03-25 17:43:48

标签: apache-kafka

我正在尝试使用Kafka作为消息代理来实现RPC体系结构。使用Kafka代替其他消息代理解决方案的决定由当前上下文决定。

实际的实现包含两种不同类型的服务:

  • 接收者:此服务从Kafka主题接收消息,该主题将进行消费,处理这些消息,然后将响应消息发布到响应主题;
  • 呼叫者:该服务接收HTTP请求,然后将消息发布到接收者主题,使用接收者服务的响应主题作为响应消息,然后将其作为HTTP响应返回。
  • li>

主题中发布的请求/响应消息与消息键相关。

接收器实现非常简单:启动时,它会创建“请求”和“响应”主题,然后开始使用带有服务组ID的请求主题(接收器的许多实例将共享相同的组ID,以实现适当的请求平衡)。当请求到达时,服务将处理该请求,然后在响应主题中发布响应。

我的问题在于呼叫者的实现,尤其是在消耗响应队列中的响应时。

使用以下假设:

  1. 必须同时管理HTTP请求;
  2. 此呼叫者服务可能有多个实例。

每个单线程/服务都必须在响应主题中接收所有消息,以便找到具有相应请求密钥的消息。

作为一个例子,假设两个 receiver 服务产生两个消息,分别带有键 1 2 。这些消息将在收件人主题中发布并进行处理。然后,响应将发布在主题 receiver-responses 中。如果两个接收者服务共享相同的组ID,则可能是响应 1 到达了发布消息 2 的服务,反之亦然,导致HTTP超时。

为避免此问题,我设法考虑了以下可能的解决方案:

  1. 为每个请求创建一个新的(编辑:但是无法通过代码删除一个组,因此有必要使用其他服务从这些组中清理动物园管理员);
  2. 为每个请求创建一个新的主题,然后将其删除。

希望我让自己足够清楚-我必须承认我是Kafka的初学者-我的问题是:

哪种解决方案比其他解决方案更昂贵?还是有另一个主题/组配置可以实现假设 3

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为我已经找到了可能的解决方案。当偏移量在一段时间内没有更新时,动物园管理员将自动删除该组,这取决于配置 offsets.topic.retention.minutes

应该通过设置配置 offsets.retention.check.interval.ms 来设置偏移量更新时间检查。

这样,当消费者连接到响应主题以搜索答复消息时,创建的组可以被放弃,而动物园管理员稍后将其删除。