我正在尝试使用Kafka实现请求/回复模式。我正在与将消息发送到那些服务的命名服务和未命名的客户端一起使用,客户端可能希望得到答复。许多(10s-100s)客户可以与单个服务或服务的消费者组进行交互。
策略一:过滤邮件
第一个想法是每个服务有两个主题-“ HelloWorld”服务将使用“ HelloWorld”主题,并产生对“ HelloWorld-Reply”主题的答复。客户将使用该回复主题,并根据唯一的消息ID进行过滤,以了解与他们相关的回复。
缺点是,当许多客户端与一项服务进行交互时,它可能为客户端创建不必要的工作以过滤掉大量潜在的不相关消息。
策略二:临时主题
第二个想法是为每个客户端创建一个唯一的ID,并将该ID与消息一起发送。客户将使用他们自己的唯一主题“ [ClientID]”,并且服务将在收到回复后发送到该主题。这样,客户就不必过滤不相关的消息。
客户的缺点可能是使用寿命短,例如它们可能是一次性脚本,因此必须事先创建主题,然后再删除主题。如果客户端在处理过程中死亡,则可能需要一些额外的过程来清除未使用的客户端主题。
其中哪个似乎是更好的主意?
答案 0 :(得分:2)
我们在生产中使用Kafka作为基于事件的消息和请求/响应消息的处理程序。我们实施请求/响应的方法是您的第一个策略,因为随着客户数量的增长,您必须创建许多主题,其中一些主题完全没有用。选择第一种策略的另一个原因是我们的主题命名准则,即每个服务应只属于一个主题。但是,Kafka并非用于请求/响应消息,但我建议采用第一种策略,因为:
,但您必须注意自己的消费群体。可能导致数据丢失。
一种更好的方法是将第一种策略与一个主题(服务)中的许多分区一起使用,每个客户端使用唯一的密钥发送和接收其消息。 Kafka保证所有具有相同密钥的消息都将进入特定分区。这种方法不需要过滤不相关的消息,并且可能是两种策略的组合。
更新:
就像@ValBonn在建议的方法中所说的那样,您始终必须确保the number of partitions >= number of clients
。