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

标签 rabbitmq real-time scalability apache-kafka publish-subscribe

我有一个需要实时的用例 发布/订阅后服务器和客户端之间的通信 消息传递模式。生产者将是 java、node 等中的服务器 客户将是 - java 桌面应用程序、移动应用程序(android/ios)、 浏览器(javascript)。

我已经探索了下面讨论的许多选项,但我无法提出一个强大的可扩展解决方案。

用例:服务器将发布有关各种主题的通知/消息,并且订阅一组主题的所有客户端(java/js/ios)将实时获取这些消息。

我采用了 3 种方法来解决这个问题 1> socketIo/socketcluster 2> 使用 mosquitto/rabbitmq 作为代理探索 mqtt 协议(protocol)。 3>探索卡夫卡

主要目标是使该架构具有高度可扩展性,不仅可以实现超过一百万个并发客户端连接,而且每秒可以发布和消费超过一百万条消息。

第一种方法很简单并且有效,但 webSocket 不是一个可扩展的解决方案。

第二种方法有效,但是rabbitmq将创建大量队列(百万个客户端的百万个队列),因为它为连接到它的每个客户端维护队列,而且rabbitMq没有很高的消息发布和消费率,再加上我们说我们有一个rabbitMq节点集群,那么只有一个节点用于处理请求,其他节点用于高可用性但不并行消费。

第三,我探索了 kafka,它以其基准测试而闻名,我使用 kafka 的高级 java api 在 java 中创建了客户端,该 api 可用于订阅 kafka 主题,并且发布到该主题的任何消息都会实时传递到客户端.

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

这里的一个主要问题是,这个 kafka 客户端由于其 scala 依赖关系而尺寸很大,因此在 Android 中使用这个客户端并不是一个好的选择,我也不认为它会起作用。

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

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

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

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

最佳答案

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

In testing we noticed that there’s about 1sec of lag between posting a message and it appearing on all the other clients, which we figured out was due to how often Kafka commits messages to disk. Because Kafka assures that messages don’t get lost, they need to be written out to disk before they’re forwarded to subscribers. The developers have chosen to flush messages to disk every second, which explains the lag that we saw.

We think it’s an interesting way to do things, but it gets the job done. As they note, the focus is on throughput and not latency, so while it’s not ideally suited to this sort of usage, it gets the job done.

关于rabbitmq - 使用 kafka 作为消息代理为桌面/移动/Web 应用程序创建实时推送通知系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191547/

相关文章:

android - 谷歌分析安卓实时

android - 无法从 Android MpandroidChart 库图表中删除 android 的 x 值

c++ - 如何实时找到 OpenCV 轮廓的平均强度

installation - 无法在 CentOS7 上安装 RabbitMQ Server 3.7.1 - 错误的 erlang 版本

Debian 上的 RabbitMQ 从 3.8.2 升级到 3.8.6 -- 如何安装最新版本?

mysql - 为数据库列提供额外的大小/长度有什么缺点吗?

php - 测试代码如何缩放

mysql - 如果每个线程获得 3000 个帖子,是否为每个线程创建一个新表可能更好?

java - 正确关闭 RabbitMQ channel 和连接

java - Spring bootrabbitmq中如何识别消息路由到的交换器?