我在做一个项目,这实际上将是一个旧项目的更好的版本。我们希望它具有可扩展性,能够处理高负载。所以我们决定使用微服务而不是单片服务。然后我开始研究微服务,它们是如何通信的,常见的设计模式和其他一些东西。因为我希望我的服务是可伸缩的,所以基于事件的通信对我来说是有意义的。所以我决定用Kafka来达到这个目的。
我们在系统中有更多的服务,但是为了简化我的问题,假设我有两种类型的服务,即工作节点和主节点。我希望它们都是可伸缩的。目前他们正在通过Kafka进行交流。
我的问题是:对于一个案例,我想从主节点发布一个事件(生成一个主题的消息),并从所有工作节点获取该事件(从主题消费)。但对于另一种情况,我需要向特定的工作节点发送消息。为了能够涵盖第一种情况,所有我的工作节点在kafka中都有不同的组id,当一个主题上发布消息时,它们都会得到该消息。我知道我无法用Kafka向特定消费者发送信息。因为我的节点是可伸缩的,它们的数量可以根据负载的不同而增减,所以为每个节点创建一个主题似乎不是一个好主意。我的第一个解决方案是在消息中添加工作节点id。因此其他工作节点可以忽略该消息。好吧,这是有效的,但我认为这不是一个好的解决办法。我的第二个解决方案是,如果要向特定节点发送消息,则发送http请求。但我不知道混合两种沟通方式是一个好的解决方案。
你们觉得这个问题怎么样。有没有更好的解决方案,我错过了?或者我的整个设计出了问题?
2条答案
按热度按时间kknvjkwl1#
我想你应该可以。考虑常规的Kafka流。您有一些消费者团体订阅了该主题。在您指定之前,生产者不会将消息发送到特定分区。
![](https://i.stack.imgur.com/wkWXY.png)
![](https://i.stack.imgur.com/mFnDc.png)
现在考虑这样一个场景,即根据您的算法向特定分区生成一些消息。
从服务器接收的消息
某种算法,比如hashcode,为一个
消息发送到分区0
使用者1已连接到分区0
只有消费者1从
to94eoyn2#
对于您描述的用例,kafka不是合适的技术。我建议使用cadence工作流,它本机支持将任务路由到特定节点以及消息传递系统缺少的许多其他功能。
如果您有特殊问题,请随时加入cadence workflow slack频道。