使用kafka作为消息代理为桌面/移动/ Web应用程序创建实时推送通知系统

abh*_*dtu 16 scalability real-time publish-subscribe rabbitmq apache-kafka

我有一个用例,需要按照发布/订阅消息传递模式在服务器和客户端之间进行实时通信.生产者将是java,节点等服务器,客户端将是 - 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并将订阅某些主题,在这里我对待每个客户端作为消费者群体.

而且,这里一个主要问题是,这卡夫卡的客户是规模大,由于其阶依赖,因此使用此客户端Android将不会是一个很好的选择,也是我不认为它会奏效.

MQTT擅长在这里,因为它有针对Android,JAVA,IOS等官方phao客户

此外,我还没有在网上使用kafka看到用于百万消费者的发布/订阅消息传递的示例,大多数人正在将其用于数据管道,例如:实时日志处理,向HDFS提供数据,分析引擎等,流处理.

主要问题是我如何使用mqtt协议(适用于android/ios/web/iot)和kafka作为消息代理(具有较高的发布/订阅率)并为此问题提出可扩展的解决方案.

我的用例在某种程度上也类似于uber,其中有数百万的android/ios设备(客户端),我们实际上可以看到我们在地图上所有汽车的实时移动,有没有人知道后面的架构是什么这些实时跟踪汽车.

aen*_*nsm 7

本文介绍如何使用Kafka和node.js创建实时聊天系统.它们还链接到包含其示例的git repo.以下是文章中需要注意的重要事项:

在测试中,我们注意到在发布消息和出现在所有其他客户端之间有大约1秒的延迟,我们发现这是由于Kafka将消息提交到磁盘的频率.由于Kafka确保消息不会丢失,因此需要在将消息转发给订阅者之前将其写入磁盘.开发人员选择每秒将消息刷新到磁盘,这解释了我们看到的滞后.

我们认为这是一种有趣的做事方式,但它可以完成工作.正如他们所指出的那样,重点是吞吐量而不是延迟,因此虽然它不适合这种用途,但它可以完成工作.