使用 apache kafka 请求回复模式实现
request reply patter implementation with apache kafka
如何使用 Apache Kafka 实施 request/reply 模式?实施还应该与服务实例的缩放一起使用(f.e。pods 在 kubernetes 中)。
在兔子中,我可以为每个接收来自其他服务的响应的实例创建临时的非持久唯一队列。当连接丢失时(当服务实例关闭时),此队列将自动删除。
如何使用 Kafka 执行此操作?如何扩展此解决方案?
我使用节点js
鉴于您的 Rabbit 示例仅讨论接收响应的通道(忽略发送请求),最实用的是(因为 Kafka 不能很好地处理动态主题 creation/deletion)用于响应该服务的单个主题,无论您需要多少分区来满足您的吞吐量目标。请求者实例将随机选择一个分区来使用(多个实例可以使用同一个分区),并将该分区和唯一的相关 ID 与请求进行通信。然后对选定的分区产生响应,并使用相关 ID 进行键控。请求者跟踪他们正在等待的一组相关 ID,并忽略不在该组中的密钥的响应。
可以通过让请求者相互协调(可能使用 etcd/zookeeper/consul 之类的东西)来减轻相关 ID 中发生冲突的风险。
这不是 Kafka 非常适合的消息传递模式(它绝对不是最好的),但它是可行的。
如何使用 Apache Kafka 实施 request/reply 模式?实施还应该与服务实例的缩放一起使用(f.e。pods 在 kubernetes 中)。
在兔子中,我可以为每个接收来自其他服务的响应的实例创建临时的非持久唯一队列。当连接丢失时(当服务实例关闭时),此队列将自动删除。
如何使用 Kafka 执行此操作?如何扩展此解决方案?
我使用节点js
鉴于您的 Rabbit 示例仅讨论接收响应的通道(忽略发送请求),最实用的是(因为 Kafka 不能很好地处理动态主题 creation/deletion)用于响应该服务的单个主题,无论您需要多少分区来满足您的吞吐量目标。请求者实例将随机选择一个分区来使用(多个实例可以使用同一个分区),并将该分区和唯一的相关 ID 与请求进行通信。然后对选定的分区产生响应,并使用相关 ID 进行键控。请求者跟踪他们正在等待的一组相关 ID,并忽略不在该组中的密钥的响应。
可以通过让请求者相互协调(可能使用 etcd/zookeeper/consul 之类的东西)来减轻相关 ID 中发生冲突的风险。
这不是 Kafka 非常适合的消息传递模式(它绝对不是最好的),但它是可行的。