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

Posted

技术标签:

【中文标题】使用 kafka 作为消息代理为桌面/移动/Web 应用程序创建实时推送通知系统【英文标题】:Creating a realtime push notification system for desktop/mobile/web apps using kafka as message broker 【发布时间】:2016-01-16 10:48:18 【问题描述】:

我有一个需要实时的用例 发布/订阅后服务器和客户端之间的通信 消息传递模式。生产者将是 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 中创建了客户端,该 API 可用于订阅 kafka 主题,并且发布到该主题的任何消息都会实时传递给客户端.

所以我的问题是使用 kafka 客户端进行实时推送通知有多好,其中所有 java 桌面应用程序(可能有一百万个)都将包含这个 kafka java 客户端 sdk 并将订阅某些主题,我在这里将每个客户视为一个消费者群体。

这里还有一个主要问题是,由于它的 scala 依赖关系,这个 kafka 客户端体积很大,所以在 android 中使用这个客户端不是一个好的选择,我认为它不会起作用。

mqtt 在这里表现出色,因为它拥有适用于 android、java、ios 等的官方 phao 客户端。

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

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

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

【问题讨论】:

【参考方案1】:

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

在测试中,我们注意到在发布 消息并且它出现在我们认为的所有其他客户端上 out 是由于 Kafka 将消息提交到磁盘的频率。因为卡夫卡 确保消息不会丢失,它们需要被写入 在将它们转发给订阅者之前进行磁盘。开发商有 选择每秒将消息刷新到磁盘,这解释了滞后 我们看到的。

我们认为这是一种有趣的做事方式,但它得到了工作 完毕。正如他们所指出的,重点是吞吐量而不是延迟,所以 虽然它不是非常适合这种用途,但它可以胜任 完成。

【讨论】:

以上是关于使用 kafka 作为消息代理为桌面/移动/Web 应用程序创建实时推送通知系统的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kafka 实现 STOMP 协议

Kafka分布式消息系统剖析

如何查看kafka消息

如何配置Kafka RPC调用者主题和组

Kafka基础知识

如何使用 pyspark 将经过火花转换的数据写回 kafka 代理?