java 高并发mqtt服务器_基于MQTT和Kafka高并发场景下的消息路由方法与流程

本发明涉及数据通信领域,特别涉及基于MQTT和Kafka高并发场景下的消息路由方法。

背景技术:

随着互联网技术的飞速发展,智能终端设备的普及,以及业务需求的多样化,终端设备之间数据通信的重要性日益凸显,特别是在通过多种设备进行数据采集后再由计算设备进行统一处理的应用场景,如何保证实际应用中数据获取的实时性,高并发场景下的可用性,不稳定网络环境下离线消息存储成为了解决数据通信问题的关键。

MQTT协议是一种基于“发布/订阅”模式的即时通讯协议,可有效实现一对多或多对多的通信。它设计在TCP协议之上,具有轻量、简单和易于实现的特点,旨在为低带宽和不稳定的网络环境中的终端设备提供可靠的网络服务。由于其消息标题可短至2个字节,因而具有非常小的通信开销。并且,其在设计之初就专门针对低功耗目标而进行了优化。更为独特的是,为了满足不同的场景需求,MQTT支持三种不同的服务质量。而且提供有遗嘱消息和会话保存功能,以针对不稳定的网络环境下,客户端与服务器断开后重新连接的解决方案。

Kafka是一个支持分区存储、多副本的分布式消息系统,采用发布/订阅的消息处理模式,能有效应对代理宕机后的数据处理问题。Kafka以集群的方式运行,由多个broker共同构成。生产者将消息发送到特定的主题,再由订阅主题的消费者以poll的方式进行消费。其中,每个主题又被分成一个或多个的分区,每个分区由一系列有序、不可变的消息组成,是一个有序队列。特别的是,Kafka中以顺序写的方式写入磁盘,因而速度要比随机写入磁盘的方式快得多。除此之外,Kafka还引入消费组的概念,每个消费者都属于一个特定的消费组,同一分区下的一条消息只能被同一个消费组内一个消费者消费,但多个消费组可同时消费这一消息。

技术实现要素:

本发明的主要目的在于克服现有技术的缺点与不足,提供基于MQTT和Kafka高并发场景下的消息路由方法,该方法充分利用MQTT轻量级协议在通信中支持数百万个设备同时连接的特点,引入Kafka集群以弥补MQTT协议不支持负载均衡的缺陷,并通过磁盘顺序写速度快的特点来应对高并发场景下的应用需求,大大提高了消息的传送速度,支持实时数据流的保存和异步处理。

本发明的目的通过以下的技术方案实现:

基于MQTT和Kafka高并发场景下的消息路由方法,包括以下步骤:

利用Kafka的分区机制接收高并发场景下的用户消息,并以顺序写的方式写入磁盘,同时基于发布/订阅模式的消息队列进行保存,利用Kafka代理集群实现负载均衡;

然后通过Kafka Stream将消息检索过滤,持久化存入数据库,并保持对接收端状态的监听;将过滤后的数据发送到MQTT服务器中,保存在不同的Topic下;

最后由MQTT协议中订阅了不同Topic的接收端进行匹配,获取消息,并且接收端在每次上线或下线时都将发送状态消息以更新在线列表。

所述利用Kafka的分区机制接收高并发场景下的用户消息,是依赖于磁盘顺序写的方式来存储和缓存消息的,且具有一定的时间期限;由于Kafka中每个Topic下都有一个或多个分区,因而用户在客户端进行消息的发送时,可指定消息要送达的分区,将partitioner.class设置为自定义的分区策略实现,并在partition()中设定消息发送到分区的具体规则。因为在Kafka中创建主题是一种较为影响性能的操作,所以并不在Kafka代理中对每个用户发起的会话请求都创建相应的主题,而采用一个主题下多个分区的方法,基于多个broker保存分区完成备份,并实现负载均衡。

所述用户消息,其记录以Key-Value键值对的方式进行发送,将发送者ID和接受者ID一同作为Key进行发布。这样使Kafka能够处理高并发的数据量,并承担消息存储的任务。

所述通过Kafka Stream将消息检索过滤,持久化存入数据库,并保持对接收端状态的监听,具体为:

对保存在每个分区下的消息记录,通过Kafka Stream建立一个流处理拓扑,并将键值对反序列化为数据对象的方式进行处理;

所述流处理拓扑中包含有一个Source处理节点、一个Sink处理节点以及M个自定义的处理节点,利用聚合操作可将消息记录为空的数据筛选过滤;其中M≥2;

过滤后的数据序列化后会发送至订阅了相应Topic的消费端,在消费端中,通过多线程将消息记录持久化数据库,并通过回调函数处理持久化后的结果;

另外,消费端还需订阅另外一个主题用于监听接收端的在线状态,并维持有一个在线列表。

所述将过滤后的数据发送到MQTT服务器中,保存在不同的Topic下,具体为:

在Kafka的消费端,逐条消费事先保存在Kafka Broker分区中的消息,并提取每条消息的Key,Key中包含有该条消息的发送者ID和接收者ID;

发布消息指定Topic时,需将接收者ID作为发送者ID的父级Topic,并在Message Body前加入发送者ID便于接收端解析;

接收者启动后将订阅以自身ID为第一层级的Topic,并使用通配符接收所有以自身ID为第一层级Topic的消息;在对收到的消息解析其Message Body后,辨识出该消息内容的发送源。

由于MQTT支持多级Topic,且可用通配符匹配多层主题,因而在设计该消息路由系统时,关键在于如何使接收端分辨出具体的发送者。

所述接收端在每次上线或下线时都将发送状态消息以更新在线列表,具体为:

启动接收者时需设定服务质量和是否清除Session;因为接收端需获取离线消息,所以要保存Session,并将服务质量设定为At Least Once,以减少消息的确认,提高Kafka的并发能力;

另外,设定遗嘱消息,当接收者下线时,将下线消息发给Kafka,避免消息在MQTT服务器中一直得不到消费,占用内存空间;当重新上线时,则再一次把消息发给Kafka,以更新其维持的在线的接收端的列表。

本发明与现有技术相比,具有如下优点和有益效果:

本发明是以解决高并发场景下大量终端设备传输数据至服务器导致长时间的响应延迟,甚至出现服务器宕机的情况为出发点,建立了一种基于MQTT和Kafka的消息路由系统模型,根据自定义的分区策略实现负载均衡,并通过MQTT这一轻量级协议完成通信的。它适用于中小型规模的通信系统,可完成一对多或多对多的应用需求。并很好地支持实时与异步的数据处理。而且还具有良好的可扩展性,可与多层缓存、分布式架构等解决方法进一步结合以处理更大规模的并发数据量。

附图说明

图1是本发明所述基于MQTT和Kafka高并发场景下的消息路由系统的结构示意图。

图2是本发明所述基于MQTT和Kafka高并发场景下的消息路由方法的消息传递序列图。

具体实施方式

下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。

如图1所示,基于MQTT和Kafka高并发场景下的消息路由系统,用于实现基于MQTT和Kafka高并发场景下的消息路由方法,包括发送端、Kafka Broker、Kafka Consumer、MongoDB、MQTT Broker、接收端。

如图2所示,基于MQTT和Kafka的高并发场景下的消息路由方法,包含以下步骤:

启动Kafka集群和MQTT服务器,运行发送端实例SenderId,把在发送端处收集的数据周期性地发给Kafka代理,设置消息发送的主题为“Msg-Record”,设定消息的Key为“ReceiverId/SenderId”,并在消息体内容前都加上“SenderId”,设置数据的分区策略为轮询,即把数据依次写入各个分区中,指定时间粒度为两天;

运行KStream程序,在源处理节点处指定Topic为“Msg-Record”,则分区中的数据反序列化后将进入流处理拓扑,并在自定义的流处理节点类中通过聚合操作filter过滤掉无效的数据,在Sink处理节点将消息记录重新发至Kafka的消费者;

运行Kafka的消费者,通过poll的方式周期性地拉取消息,对于获取到的每条消息记录,提取其中的Key并作为MQTT通信发布的Topic,除此之外,该Kafka消费者订阅“Monitor-Receiver”话题,维持有一个当前所有在线的接收端的列表,运行MQTT客户端实例,如果当前在线的接收端列表中存在有“ReceiverId”,则将数据记录发布到MQTT服务器中,否则就保存在磁盘中减少通信量和避免内存占用。并且,还需通过Executor类另外开启一个线程,把消息存入数据库MongoDB中进行持久化。设置回调函数用于异步处理持久化是否成功的结果;

启动接收端实例ReceiverId,进行一系列相关的参数配置,包括有:保存会话记录以获得离线状态下的未收消息;设置服务质量为“至少一次”,以减少不必要的消息确认延迟,增强并发性;订阅“ReceiverId/#”主题,这所有发给该接收端的消息将会被匹配接收,对收到的消息体内容进行解析,辨别出消息源来自于“SenderId”。设置遗嘱消息,一旦该接收端下线,就把“ReceiverId下线”作为消息体内容,发布至“Monitor-Receiver”,订阅了该话题的Kafka消费者收到遗嘱消息后解析,从当前在线的接收端列表中移除“ReceiverId”,并阻塞所有以“ReceiverId”作为第一级主题的消息的发送,减少不必要的通信量和内存占用。一旦该接收者重新上线后,再一次地发送上线信息到“Monitor-Receiver”主题中,而其相应的实例Id就会被添加进在线接收端的列表中。消息传递的具体流程如图2所示。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

你可能感兴趣的:(java,高并发mqtt服务器)