我正在尝试使用Kafka作为消息代理来实现RPC体系结构。使用Kafka代替其他消息代理解决方案的决定由当前上下文决定。
实际的实现包含两种不同类型的服务:
主题中发布的请求/响应消息与消息键相关。
接收器实现非常简单:启动时,它会创建“请求”和“响应”主题,然后开始使用带有服务组ID的请求主题(接收器的许多实例将共享相同的组ID,以实现适当的请求平衡)。当请求到达时,服务将处理该请求,然后在响应主题中发布响应。
我的问题在于呼叫者的实现,尤其是在消耗响应队列中的响应时。
使用以下假设:
每个单线程/服务都必须在响应主题中接收所有消息,以便找到具有相应请求密钥的消息。
作为一个例子,假设两个 receiver 服务产生两个消息,分别带有键 1 和 2 。这些消息将在收件人主题中发布并进行处理。然后,响应将发布在主题 receiver-responses 中。如果两个接收者服务共享相同的组ID,则可能是响应 1 到达了发布消息 2 的服务,反之亦然,导致HTTP超时。
为避免此问题,我设法考虑了以下可能的解决方案:
希望我让自己足够清楚-我必须承认我是Kafka的初学者-我的问题是:
哪种解决方案比其他解决方案更昂贵?还是有另一个主题/组配置可以实现假设 3 ?
谢谢。
答案 0 :(得分:0)
我认为我已经找到了可能的解决方案。当偏移量在一段时间内没有更新时,动物园管理员将自动删除该组,这取决于配置 offsets.topic.retention.minutes 。
应该通过设置配置 offsets.retention.check.interval.ms 来设置偏移量更新时间检查。
这样,当消费者连接到响应主题以搜索答复消息时,创建的组可以被放弃,而动物园管理员稍后将其删除。