我的使用情况需要服务器和客户端之间进行实时通信,遵循发布/订阅消息模式。生产者将是java、node等服务器,而客户端将包括Java桌面应用程序、移动应用程序(Android / iOS)和浏览器(JavaScript)。
我探索了下面讨论的许多选项,但我无法想出一个强大且可扩展的解决方案。
用例:服务器将在各种主题上发布通知/消息,并且所有订阅一组主题的客户端(Java / JS / iOS)都将实时获取这些消息。
我采用了3种方法来解决这个问题 1> socketIo/socketcluster 2> 探索了mqtt协议,作为代理使用mosquitto/rabbitmq. 3> 探索了kafka
主要目标是使这个架构高度可扩展,不仅能够处理超过一百万个同时连接的客户端,还能够处理每秒超过一百万条发布和消费的消息。
第一种方法是简单明了的,它能够工作,但WebSocket不是一个可扩展的解决方案。
第二种方法可行,但rabbitmq会创建大量队列(对于连接到它的每个客户端维护队列,所以对于一百万个客户端会创建一百万个队列),而且rabbitmq没有高消息发布和消费速率,另外假设我们有一个rabbitMq节点集群,那么只有一个节点用于处理请求,其他节点用于高可用性但不是并行消费。
第三,我探索了Kafka,它以其基准测试而闻名。我使用Kafka的高级Java API在Java中创建了客户端,该API用于订阅Kafka主题,任何发布到此主题的消息都将实时传递给客户端。
因此,我的问题是,将java桌面应用程序(可能达到一百万个)都包括这个kafka java客户端sdk,并订阅某些主题,使用kafka客户端进行实时推送通知有多好,在这里,我将每个客户端视为一个消费者组。
此外,这里的一个主要问题是,由于其scala依赖项,这个kafka客户端的大小很大,所以在Android中使用这个客户端不是一个好选择,而且我认为它也行不通。
mqtt在这里表现出色,因为它拥有Android、Java、iOS等官方的phao客户端。
此外,我没有看到有关使用Kafka进行百万用户的发布/订阅消息的Web示例,大多数人都将其用于数据管道,例如:实时日志处理、向HDFS、分析引擎等提供数据,流处理等。
主要问题是如何将可在Android / iOS / Web / IoT上正常工作的MQTT协议与具有高发布/订阅速率的Kafka作为消息代理结合使用,并提出可扩展的解决方案。
我的用例有些类似于Uber,在其中有数百万个Android / iOS设备(客户端),我们实际上可以在地图上查看所有汽车的实时移动情况,请问这种实时跟踪汽车背后的架构是什么。