微服务请求/回复模式的kafka主题过滤与短暂主题

m1m5dgzv  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(360)

我正在尝试用kafka实现一个请求/应答模式。我正在使用命名服务和向这些服务发送消息的未命名客户机,客户机可能希望得到答复。许多(10-100个)客户机可能与单个服务或服务的使用者组进行交互。
策略一:过滤信息
第一个想法是每个服务有两个主题-“helloworld”服务将使用“helloworld”主题,并生成对“helloworld reply”主题的回复。客户端将使用该回复主题并筛选唯一的消息ID,以了解与它们相关的答复。
缺点是,当许多客户机与一个服务交互时,它可能会为客户机过滤掉大量不相关的消息而产生不必要的工作。
策略二:昙花一现的主题
第二个想法是为每个客户机创建一个唯一的id,并将该id与消息一起发送。客户机将使用自己独特的主题“[clientid]”,服务在收到回复时将发送到该主题。因此,客户机不必过滤不相关的消息。
缺点是,客户机的生命周期可能很短,例如,他们可能是一次性脚本,他们必须事先创建主题,然后将其删除。如果客户机在处理过程中死亡,可能需要一些额外的进程来清除未使用的客户机主题。
以下哪一个似乎是更好的主意?

jjjwad0x

jjjwad0x1#

我们在产品中使用kafka作为基于事件的消息和请求/响应消息的处理程序。我们实现请求/响应的方法是您的第一个策略,因为当客户机数量增加时,您必须创建许多主题,其中一些主题完全没有用。选择第一种策略的另一个原因是我们的主题命名准则,即每个服务应该只属于一个主题。但是,kafka不是针对请求/响应消息而设计的,但我建议使用第一种策略,因为:
几个主题
更好的服务跟踪
更好的主题命名
但你必须小心你的消费者群体。可能导致数据丢失。
更好的方法是使用第一种策略,在一个主题(服务)中使用多个分区,每个客户机使用唯一的密钥发送和接收其消息。kafka保证具有相同密钥的所有消息都将转到特定的分区。这种方法不需要过滤不相关的消息,也许是两种策略的结合。
更新:
正如@valbonn在建议的方法中所说的,您必须始终确保 the number of partitions >= number of clients .

相关问题