我有一个需要实时的用例
发布/订阅后服务器与客户端之间的通信
消息传递模式。生产者将是使用Java,node等的服务器,并且
客户将是-Java桌面应用,移动应用(android / ios),
浏览器(javascript)。
我已经探究了下面讨论的许多选项,但无法提供功能强大的可扩展解决方案。
用例:服务器将发布有关各种主题的通知/消息,并且订阅了一组主题的所有客户端(java / js / ios)将实时获取这些消息。
我遵循以下3种方法来解决此问题:1> socketIo / socketcluster 2>使用mosquitto / rabbitmq作为代理探索了mqtt协议。 3>探索卡夫卡
主要目标是使该体系结构具有高度可扩展性,不仅具有超过一百万个并发客户端连接,而且每秒还可以发布和使用超过一百万条消息。
第一种方法很简单并且可以使用,但是webSocket不是可扩展的解决方案。
第二种方法可行,但是rabbitmq将创建大量队列(百万个客户端的百万个队列),因为它为与其连接的每个客户端维护队列,而且rabbitMq的消息发布和使用率也不高,再加上我们有一个集群如果只使用一个RabbitMq节点,则仅一个节点用于处理请求,其他节点用于高可用性,但不并行使用。
第三,我探索了kafka,它以基准测试而闻名,我使用kafka的高级java api在Java中创建了客户端,可用于订阅kafka主题,发布到该主题的任何消息都会实时传递给客户端。
所以我的问题是使用kafka客户端进行实时推送通知有多好,其中所有的Java桌面应用程序(可能是一百万个)都将包含此kafka Java客户端sdk并将订阅某些主题,在这里我对待每个客户端作为一个消费群体。
这里的一个主要问题是,由于其scala依赖关系,该kafka客户端的大小很大,因此在android中使用此客户端将不是一个好选择,我也不认为它将起作用。
mqtt在这里表现出色,因为它拥有适用于android,java,ios等的正式phao客户端。
另外,我还没有看到使用kafka在数百万消费者之间进行发布/订阅消息传递的网络示例,大多数人将其用于数据管道,例如:实时日志处理,向HDFS馈送数据,分析引擎等,流处理。
主要问题是我如何才能将mqtt协议(与android / ios / web / iot配合使用)与kafka用作消息代理(具有较高的发布/订阅率),并针对此问题提出可扩展的解决方案。
我的用例在某种程度上也类似于超级市场,那里有数百万个android / ios设备(客户端),我们实际上可以在地图上看到我们所处位置的所有汽车的实时移动,是否有人知道背后的架构是什么?这些汽车的实时跟踪。
最佳答案
This article描述使用Kafka和node.js制作实时聊天系统。它们还链接到包含其示例的git repo。这是文章中需要注意的重要事项:
在测试中,我们注意到发布一个
消息,它出现在所有其他客户端上,我们认为
之所以出现这种情况,是因为Kafka多久一次将消息提交到磁盘。因为卡夫卡
确保邮件不会丢失,需要将其写到
磁盘,然后再转发给订阅者。开发人员有
选择每秒将消息刷新到磁盘,这解释了延迟
我们看到的。
我们认为这是一种有趣的处理方式,但可以成功
完成。正如他们所指出的,重点是吞吐量而不是延迟,因此
虽然它不太适合这种用法,但它可以胜任
完成。