我有一个用例,需要在发布/订阅消息传递模式之后在服务器和客户端之间进行实时通信 . 生产环境 者将是java,节点等服务器,客户端将是 - java桌面应用程序,移动应用程序(android / ios),浏览器(javascript) .
我已经探讨了下面讨论的许多选项,但我无法提出强大的可扩展解决方案 .
使用案例:服务器将发布各种主题的通知/消息,订阅一组主题的所有客户端(java / js / ios)将实时获取这些消息 .
我按照3种方法解决了这个问题1> socketIo / socketcluster 2>使用mosquitto / rabbitmq作为代理探索了mqtt协议 . 3>探索 Kafka
主要目标是使该体系结构具有高度可扩展性,不仅可以同时拥有超过百万个客户端连接,而且每秒可以发布和消耗超过百万条消息 .
第一种方法很简单,它可以工作,但webSocket不是一个可扩展的解决方案 .
第二种方法可行,但是rabbitmq将创建大量队列(百万个客户端的百万个队列),因为它为每个连接到它的客户端维护队列,而且RabbitMq没有高消息发布和消耗率,加上假设我们有一个集群在RabbitMq节点中,只有一个节点用于处理请求,而其他节点用于高可用性但不用于并行消耗 .
第三,我探索了kafka,它以我的基准着称,我使用kafka的高级java api在java中创建客户端,可以用来订阅kafka主题,并且发布到该主题的任何消息都可以实时传递给客户端 .
所以我的问题是使用kafka客户端进行实时推送通知是多么好,其中所有的Java桌面应用程序(可能是一百万)将包含这个kafka java客户端sdk并将订阅某些主题,在这里我对待每个客户端作为消费者群体 .
另外一个主要问题是这个kafka客户端由于其scala依赖性而大小很大,所以在android中使用这个客户端也不是一个好的选择,我也不认为它会起作用 .
mqtt在这里擅长,因为它有android,java,ios等官方phao客户端 .
此外,我还没有在网上使用kafka看到有关百万消费者的发布/订阅消息传递的示例,大多数人正在将其用于数据管道,例如:实时日志处理,向HDFS提供数据,分析引擎等,流处理 .
The main question is that how can I use mqtt protocol(which works well with android/ios/web/iot) with kafka as a message broker (which has a high publish/subscribe rate) and come up with a scalable solution to this problem.
我的用例在某种程度上也类似于uber,其中有数百万的android / ios设备(客户端),我们实际上可以看到我们在 Map 上的所有汽车的实时移动,有没有人知道背后的架构是什么这些实时跟踪汽车 .
1 回答
This article描述了使用Kafka和node.js Build 实时聊天系统 . 它们还链接到包含其示例的git repo . 以下是文章中需要注意的重要事项: