使用Kafka作为消息代理,为桌面/移动端/网络应用程序创建实时推送通知系统

21

我的使用情况需要服务器和客户端之间进行实时通信,遵循发布/订阅消息模式。生产者将是java、node等服务器,而客户端将包括Java桌面应用程序、移动应用程序(Android / iOS)和浏览器(JavaScript)。

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

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

我采用了3种方法来解决这个问题 1> socketIo/socketcluster 2> 探索了mqtt协议,作为代理使用mosquitto/rabbitmq. 3> 探索了kafka

主要目标是使这个架构高度可扩展,不仅能够处理超过一百万个同时连接的客户端,还能够处理每秒超过一百万条发布和消费的消息。

第一种方法是简单明了的,它能够工作,但WebSocket不是一个可扩展的解决方案。

第二种方法可行,但rabbitmq会创建大量队列(对于连接到它的每个客户端维护队列,所以对于一百万个客户端会创建一百万个队列),而且rabbitmq没有高消息发布和消费速率,另外假设我们有一个rabbitMq节点集群,那么只有一个节点用于处理请求,其他节点用于高可用性但不是并行消费。

第三,我探索了Kafka,它以其基准测试而闻名。我使用Kafka的高级Java API在Java中创建了客户端,该API用于订阅Kafka主题,任何发布到此主题的消息都将实时传递给客户端。

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

此外,这里的一个主要问题是,由于其scala依赖项,这个kafka客户端的大小很大,所以在Android中使用这个客户端不是一个好选择,而且我认为它也行不通。

mqtt在这里表现出色,因为它拥有Android、Java、iOS等官方的phao客户端。

此外,我没有看到有关使用Kafka进行百万用户的发布/订阅消息的Web示例,大多数人都将其用于数据管道,例如:实时日志处理、向HDFS、分析引擎等提供数据,流处理等。

主要问题是如何将可在Android / iOS / Web / IoT上正常工作的MQTT协议与具有高发布/订阅速率的Kafka作为消息代理结合使用,并提出可扩展的解决方案。

我的用例有些类似于Uber,在其中有数百万个Android / iOS设备(客户端),我们实际上可以在地图上查看所有汽车的实时移动情况,请问这种实时跟踪汽车背后的架构是什么。

1个回答

9

本文介绍了如何使用Kafka和node.js制作实时聊天系统。他们还链接到一个git repo,其中包含他们的示例。以下是文章中需要注意的重要内容:

在测试中,我们注意到发布消息和所有其他客户端上出现消息之间存在约1秒的延迟,我们发现这是由于Kafka多久将消息提交到磁盘一次所致。因为Kafka确保不会丢失消息,所以需要将它们写入磁盘后再转发给订阅者。开发人员选择每秒将消息刷新到磁盘上,这就解释了我们看到的延迟。

我们认为这是一种有趣的做法,可以完成任务。正如他们所指出的,重点是吞吐量而不是延迟,因此虽然它不是完全适合这种类型的用法,但它可以完成任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接