一种异步汽车数据接收端实现方案

2021-07-22 03:11韦通明张送温丰蔚温丽梅张亮
汽车实用技术 2021年13期
关键词:接收端副本线程

韦通明,张送,温丰蔚,温丽梅,张亮

(上汽通用五菱汽车股份有限公司技术中心,广西 柳州545007)

前言

随着汽车智能网联化的发展,汽车变得更加智能化的同时,也产生更多的数据。在传统的数据接收端中,数据的接收以及转发都是阻塞式运行,当数据量大的时候,接收端可能卡死甚至宕机。接收端的宕机可能导致终端数据的丢失,会对公司造成重大的口碑和经济损失。因此,保证平台平稳而高效的运行,对于智能网联汽车平台的重要性不言而喻。

使用 Netty作为数据平台的接收端,在业界内早已有人进行了实践,王鑫等[2]就提出了一种基于Netty作为基础的数据通信框架;李熙、谢锦洋[3]也基于Netty和HDFS分布式文件系统设计出了一种大数据的接收以及采集系统。但是上面的两个系统都是单纯利用Netty接收和转发,Netty的Boss线程和Worker线程互相耦合,资源互相竞争,可能导致数据无法接受或者转发[1],可能存在数据堆积等风险。

本文针对以上存在的不足,引入了Kafka消息中间件作为Netty的下游,使得Netty接收到的数据可以快速被转发。Kafka被设计为能承受数十万迸发的分布式消息中间件,能快速地缓存并且转发数据,减轻 Netty接收端的压力。Kafka支持集群多副本部署,能够防止数据丢失。我们将Netty与Kafka整合,能降低接收端集群的压力,并且系统更加可靠。

1 系统方案与架构

1.1 Netty模型

Netty引用并优化了JDK5引入的线程池技术,并且修复了JDK原生NIO的BUG,并且将接收线程池与业务线程池进行了分离。其中Acceptor线程池负责接受连接,worker线程池负责处理连接的读写事件。这种 Reactor模型的支持使得 Netty能用很少的连接就能处理大量的连接终端。同时,Netty封装了JDK NIO,简化了JDK NIO本身复杂的API,保留了安全性高、性能优越等特点。Netty是个性能优秀、使用简单的网络通信框架,在本方案中,Netty专门负责接收终端连接请求。

Netty的线程模型如图1所示:

图1 Netty线程模型

1.2 Kafka模型

Kafka作为队列模式的消息中间件,能够确保数据的顺序性。Kafka的一个topic会由多个partition组成,每个partition还会有某个数量的副本,这些副本分散在Kafka的集群之中,一旦Kafka集群的某台机器发生宕机,可以从其他机器恢复副本数据,从而保证数据的可靠性。Kafka的消息数据在一段时间内,即使被消费,也不会在分区和副本中删除。Kafka与Netty使用了同样的Zero-Copy零拷贝技术,使用Send-file模式,可以直接在内核态传输数据,提升一倍的数据发送性能。

方案引入Kafka作为消息队列,能够高效、可靠地将数据进行汇聚以及削峰填谷,极大地提升了集群的吞吐量和可靠性。

Kafka的模型如图2:

图2 Kafka架构图

1.3 系统架构

在本方案之中,Netty作为与终端直连的数据接收端,负责接收外部链接请求,并且将终端上传的数据转发到 Kafka消息中间件之中。Netty接收端的数量可以根据终端数量动态扩容,始终满足终端的需求。Kafka集群作为整个系统的缓冲池,接受从接收端转发过来的流量,减轻接收端的压力。Kafka提供缓存、冗余、负载均衡等能力,能保证consumer段始终能够在最高效的状态运行。

整个系统的架构如图3所示:

图3 系统架构

2 运行情况

为了验证方案的性能,本文搭建了一套压力测试的环境。其中,CPU为十代i7-10700F,睿频4.8 GHz,32G DDR4内存,1T硬盘,操作系统为CentOS7,实验程序用Java编写,JDK版本 jdk1.8.0_201,Netty的版本为 4.1.17-Final,Kafka的版本为 1.1.0。使用开源的压测软件 JMeter进行模拟,模拟机器配置与服务端保持一致,并且部署在同一个局域网之中,局域网之间通过千兆网卡连接。测试终端模拟每秒发一次1KB的数据。

服务端分别使用传统的 TcpSocket、原生 Netty以及Netty+Kafka实现,客户端并发规格为 2000、4000、6000、8000、10000、15000和20000个客户端,压测数据如图4所示:

图4 压测数据

根据图4,可以看出传统的Tcp Socket在迸发8000左右的时候达到瓶颈,在客户端迸发更大时,服务端由于压力过大,吞吐量反而下降;原生的Netty相比Socket吞吐量更高,但是随迸发上升的趋势不明显;本方案吞吐量最高,性能也几乎是线性增长,峰值的吞吐量达到了原生Netty的1.5倍。并且本方案支持缓冲以及数据冗余,可靠性更强,更适合处理汽车数据这种高迸发的业务场景。

3 结束语

本文提出了一种整合Netty框架以及Kafka中间件的汽车大数据接收端的实现方案,并且分析了 Netty以及 Kafka在本方案之中的作用,二者是本方案能高效、稳定运行的基础。本文还将本方案和传统的方案进行了性能对比,本方案的性能在并发量大时,会有明显的优势。本文提供样例是单机部署的方案,在实际运用的场景之中,只要将方案进行集群化部署,就能支撑更多的终端、更大的并发,具有很高的实际价值。

猜你喜欢
接收端副本线程
5G终端模拟系统随机接入过程的设计与实现
基于光载波携能的制导武器无线携能通信研究
实时操作系统mbedOS 互斥量调度机制剖析
基于扰动观察法的光通信接收端优化策略
浅析体育赛事售票系统错票问题的对策研究
手机无线充电收发设计
国家知识产权局公告:专利证书改版
基于盲波束形成的MIMO雷达稳健参数估计
新副本“战歌之城”怨灵BOSS面面观
《口袋西游—蓝龙》新副本“幽冥界”五大萌点