基于Netty和Kafka的物联网数据采集系统

Netty 的 Reactor 线程模型

目前高性能网络通信服务大多是基于 epoll 机制和多线程模型组合的实现。而 Netty 可依据用户自定义的程序启动参数调整其运行期间的线程模型。Netty 官方推荐使用主从 Reactor 多线程模型。其主要特点是拥有多个线程池,其中主线程池是处理新的客户端连接,处理完新连接后将新建的Socket 绑定到从线程池中的某个线程中;从线程池将负责后续对这个 Socket 的读写、编解码、业务处理工作。设计主从 Reactor 多线程模型的目的是将监听端口服务与处理数据功能剥离开来,从而提高处理数据的能力[15]。在实际应用中,Netty 支持添加多个从线程池,可按照业务特性将不同的业务分配到不同的从线程池处理,或若干个特性相似的业务分配到同一个从线程池。如图 1 所示,主线程池负责响应新连接接入,从线程池 1 负责编解码业务,从线程池 m 负责数据读取业务,做到按特性分配,辅以合理的线程池参数,可令 Netty 的性能更出色。

基于Netty和Kafka的物联网数据采集系统_第1张图片

Kafka 流式消息处理系统

Kafka 的 commit log 队列是 Kafka 消息队列概念的具体实现。生产者向 commit log 队列中发送流式消息,其他消费者可以在毫秒级延时处理这些日志的最新信息。每个数据消费者在 commit log 中有一个自己的指针,并独立移动,从而促使消费者们在分布式环境下能可靠、顺序的处理队列中的消息。commit log 可以被多个生产者和消费者所共享,并覆盖集群中的多台机器,为集群中机器提供容错保障。Kafka 作为一个现代的分布式系统还可以便捷地水平扩张和缩小。此外,Kafka 的消息代理(broker)能支持 TB 级消息的持久化。上述特性使得 Kafka 能够使得其应用范围不仅局限于消息系统。

系统架构设计

系统的整体架构设计如图 2 所示。采集终端一般由众多可连接互联网的嵌入式设备组成。消息收集端暴露 IP 地址和端口,供采集终端连接,当有新的 TCP 连接或者新的消息发送时,都将触发消息收集端的网络通信处理程序。对于需要进一步处理的消息将由消息收集端通过异步方式推送到 Kafka 集群中。之后,再由不同的 Kafka consumer 进程按照不同的业务需求来处理被推送到 Kafka 集群中的消息。这些消息或被持久化到数据库,或进行其它实时计算。此外,Zookeeper 用来监测 Kafka 集群的运行状态,协调管理 Kafka 集群;同时 Zookeeper 还可预留作为协调管理收集端服务水平扩展业务的服务软件。 引入 Kafka 消息队列来处理数据转发业务有以下几点原因:(1)若消息被收集端解析后,直接写入数据库或者进行数据分析等耗时操作,将会阻塞一条采集终端的连接,进而降低系统的并发能力;(2)当前数据的持久化操作一般会将热点数据写入如 Redis 的内存数据库,常规数据写入如MySQL 的传统关系型数据库。对于这种数据消费多目的端的处理逻辑,利用多个 Kafka 的 consumer group 机制可以轻易的并发实现;(3)当采集终端的数据上传速率较消息处理速率快时,Kafka 内部自带数据持久化功能,能保证消息不丢失,且 Kafka集群还支持动态扩容能扩展消息处理业务吞吐量(4)当单一的收集端服务不足以支撑大量采集终端的数据上传时,也可利用 Kafka 的多Producer 便捷地实现收集端服务的水平扩展;(5)考虑到采集终端上传的数据具有典型的流式数据特征,使用 Kafka 可以方便地拓展未来对数据进行实时分析处理业务。

基于Netty和Kafka的物联网数据采集系统_第2张图片

你可能感兴趣的:(基于Netty和Kafka的物联网数据采集系统)