首页 文章

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

提问于
浏览
13

我有一个用例,需要在发布/订阅消息传递模式之后在服务器和客户端之间进行实时通信 . 生产环境 者将是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 回答

  • 6

    This article描述了使用Kafka和node.js Build 实时聊天系统 . 它们还链接到包含其示例的git repo . 以下是文章中需要注意的重要事项:

    在测试中,我们注意到在发布消息和出现在所有其他客户端之间存在大约1秒的延迟,我们发现这是由于Kafka将消息提交到磁盘的频率 . 由于Kafka确保消息不会丢失,因此需要在将消息转发给订阅者之前将其写入磁盘 . 开发人员已经选择每秒将消息刷新到磁盘,这解释了我们看到的滞后 . 我们认为这是一种有趣的做事方式,但它可以完成工作 . 正如他们所指出的那样,重点是吞吐量而不是延迟,因此虽然它不适合这种用途,但它可以完成工作 .

相关问题