APP下载

RabbitMQ在气象通信系统中的应用研究

2020-04-30余永城翁秋华

计算机技术与发展 2020年4期
关键词:键值服务端队列

余永城,翁秋华,段 卿,袁 伟

(福建省气象信息中心,福建 福州 350001)

0 引 言

气象通信系统是承担气象观测数据从台站生成—省级—国家级的收集、处理、分发的一套业务系统[1-2]。现有的气象通信系统1.0版本是基于传统的FTP文件传输方式进行观测数据的收集处理的,因为是文件级的传输,需要在服务器上落盘处理,因此对服务器磁盘的I/O性能要求比较高。同时,基于TCP/IP协议的FTP文件传输方式存在诸如效率低下和数据传输模式不合理等问题。随着现代气象自动观测技术的迅速发展,气象资料的数量及类型都大大增加。重要的气象观测资料产生的频次已经提升到了分钟级,传输的时效也提高到了秒级。目前的气象通信系统1.0版本已无法满足大数量、高频次、多种类的观测数据高时效传输。因此如何快速地将观测数据通过气象通信系统传输到省级和国家级是很关键的。

RabbitMQ消息队列技术支持多种客户端,非常适合在分布式计算系统消息存储转发的场景中使用[3]。RabbitMQ采用Socket传输协议,服务器端支持队列持久化,可以有效保证各个传输环节中数据的完整性[4],同时RabbitMQ提供路由控制转发功能符合气象数据传输的业务需求。通过对RabbitMQ消息队列技术在气象通信系统中的应用研究,设计开发了基于消息通信传输模式的气象通信系统2.0版本。

1 消息队列技术

1.1 消息中间件

消息是消息队列中的最小单元,实质上是一段可由一个或多个应用程序理解的数据[5-7],一般作为多个应用程序之间的信息传输载体。消息队列(message queue),也即消息中间件,具有流量控制、低耦合、广播、高效、可靠投递、一致性等功能。消息队列通过其高可靠的传递机制可进行和平台无关的数据交换[8-11]。消息队列技术正逐渐成为各行业通信系统中广泛使用的核心技术,目前市面上有很多主流消息队列中间件,如ActiveMQ,RabbitMQ,Kafka,RocketMQ等。

消息中间件常见的有两种传递方式:点对点(Point-to-Point)方式和发布/订阅(Pub/Sub)方式[12]。Point-to-Point方式是基于队列的。发布者将消息发布到队列中,消息订阅者从队列中获取消息。由于队列的这种点对点传递机制,使得消息具备异步传输的功能。Pub/Sub方式定义了向一个主题(Topic)发布消息还是订阅消息。在消息传递的过程中,主题作为传输介质,消息发布者和订阅者都要依靠主题进行,发布者将消息发布到主题中,订阅者则订阅来自主题中的消息。

1.2 RabbitMQ

高级消息队列协议(advanced message queuing protocol,AMQP)是一个面向消息的中间件设计的应用层协议开放标准[13]。无论客户端/中间件不同的产品,不同的开发语言等,只要基于此协议的客户端和消息中间件都可进行消息的传递。主要特点是面向消息、队列、路由、可靠、安全[14-15]。RabbitMQ是一个开源的AMQP的标准实现,支持多种语言的客户端,非常适合在分布式系统消息存储转发的场景中使用。RabbitMQ消息队列采用Socket传输协议,服务端支持消息队列的持久性,可以有效保证各个环节流转过程的观测数据完整性。同时,RabbitMQ提供灵活的路由控制转发功能,符合气象数据传输的业务需求。

RabbitMQ服务端主要由主题(Topic)和队列(Queue)组成。客户端通常有两种类型:发布者(Producer)和消费者(Consumer)。主题负责接收消息和路由键值(Routing-Key)信息,然后根据路由键值信息将消息分配给消息队列。RabbitMQ消息传输模式如图1所示。首先,消息发布者P向主题X发送带有路由键值R.#的消息。然后,服务端会根据路由键值信息将消息转发到相应的队列Q中。最后,消费者C就可以从队列Q中获取相应的消息进行消费。

图1 RabbitMQ消息传输模式

2 RabbitMQ在气象通信系统中的应用

2.1 气象观测资料

随着自动观测技术的快速发展,气象观测资料产生的频次已经提升到了分钟级。表1所示为部分的气象观测资料类型和它的数据传输频次,每种资料大小都在200字节以上,有些可以达到几KB,甚至几MB。传统TCP/IP协议的FTP文件传输方式已经无法满足这么高的传输频次和海量观测数据的传输需要,而且频繁的文件读写,会大大影响服务器的整体性能。

表1 部分气象观测资料类型

续表1

为了解决观测资料传输频次和海量数据的传输问题,使用RabbitMQ消息队列技术进行数据的传输。不仅可以保证传输的可靠性,还可以大大提高从台站到省到国家的数据传输的及时性。而且,在整个过程中,不会生成文件,这也会减少磁盘的读写。

2.2 消息传输架构设计

基于RabbitMQ消息中间件技术开发的气象通信系统,包含消息传输客户端,省级消息传输服务端和国家级消息传输服务端三大部分。其中,消息传输客户端安装在地面气象观测站,消息传输服务端分别部署在省级消息服务器和国家级消息服务器。气象观测数据消息传输流程如图2所示,观测台站通过消息传输客户端将ISOS软件观测到数据以消息的方式传给省级下消息服务端,省级消息服务端通过配置shovel插件,将消息数据转发到国家级的消息传输服务端。

2.3 数据消息封装

通过研究RabbitMQ消息队列技术,结合气象观测数据的特点,利用消息中间件传输观测数据,有必要设计传输过程中的数据格式,即数据消息封装。文中制定了一种气象数据的消息传输格式,它包括消息头(Message Header)和消息体(Message Body)。消息头以键值对的形式存放消息属性,消息体则以字符串的形式存放报文信息。消息头和消息体封装成消息,然后发送到消息队列中。在消息传输过程中,不需要对报文进行解码,通过读取消息头中的消息属性就可以对需要监视的信息进行提取,减少了传输过程中的处理成本。

根据气象数据的特点,消息属性的详细设计如表2所示。为了排查重复发送的报文,将随机UUID添加到消息属性设计中作为消息传输的唯一标识符;消息属性里应包含消息发布者和消息接收者信息,通过读取属性,就可以知道消息的转发方式;气象数据在各个传输环节中,需要加以监视,因此消息属性中应该包含消息发送时间、站号、气象资料四级编码、观测时间等监视信息等。

2.4 高时效高可靠设计

气象数据传输具有高度的时间敏感性,特别是对于国家级考核的资料要求的时效性更高。为了保证地面标准格式(BUFR)数据的秒级传输,设计了RabbitMQ多机多节点的集群部署模式,如图3所示。台站通过消息发送客户端将消息发送到省级服务端,省级服务端通过HA-Proxy负载均衡技术将消息转发给国家级服务端。HA-Proxy是一款高可用性、负载均衡以及基于四层TCP和七层HTTP应用的代理软件,它可以支持数以万计的并发连接[16]。

图4为多次模拟RabbitMQ双机多节点(1~8节点)部署模式下,大批量消息数据从台站生成到国家级接收的实际用时情况。从传输时效性曲线图中可以得出结论:相同的测试环境下,不管是双机单节点、双机双节点还是双机8节点,87%以上的消息数据都能在1秒内完成台站到国家级的传输,96%以上的数据都在2秒内完成传输,全部的数据都能在10秒内完成传输。从气象资料时效性和服务器性能方面综合考虑,决定在省级部署两台消息服务器,每台服务器上部署八个RMQ节点,就可实现气象观测数据的秒级传输。

图3 RabbitMQ多机多节点集群部署模式

图4 双机多节点传输时效性测试结果

从实验结果可以看出,RabbitMQ多机多节点集群模式可以大幅度提升消息传输效率。不但如此,多机多节点的集群模式允许消息发布者与消费者在某个RMQ节点意外宕机的情况下继续保持运行,当RMQ节点在集群中宕机后,消息传输客户端可以重新链接到集群中的其它节点继续进行消息的传输。另外,为了增加消息传输的可靠性,采用了消息发布确认和消息接收确认模式。发布确认可以有效确保消息传输到了消息服务器,假如超过规定的时间,消息还没有抵达到指定服务器,就会返回发送超时的错误代码,当客户端收到该错误代码后,会试着再一次发送;接收确认的原理是:在消息消费者获取消息之后,并没有马上把消息删除,而是将消息标识为Unacked状态,直到收到消费者消费完消息返回ack指令后,才会从队列中删除消息,从而保证消息的完整,不丢失。

2.5 交换控制策略设计

消息队列交换控制策略主要依赖于RabbitMQ的两个核心组件:主题Topic和队列Queue。在消息发布者将消息发布到主题之后,服务端根据消息中携带的路由键值对主题中的消息进行交换控制。也就是说,将含有某些特定标识符的路由键值信息捆绑到某一个队列当中,消息订阅者就可以从相应的队列中获取该消息。

为了满足气象观测数据的业务需要,研究并制定了基于RabbitMQ的气象观测数据消息传输控制策略。消息按照主题方式发送,每个主题代表一种气象观测资料。例如,国家地面自动站数据,台站通过消息传输客户端向省级主题X.OBS中发送消息;消息以队列方式接收,对列名需要包含接收者的名称,明确指定由谁来消费消息。例如,消息发给国家级,它的队列名就是Q.OBS.TO.BABJ;从消息主题到消息队列的转发过程由路由键值来控制,路由键值名称以“R.”开头,键值名一般包含消息的发送者、级别、资料类型、资料编码等。

以国家级地面气象自动站消息传输为例,其交换控制策略如图5所示。台站ISOS软件观测到的数据通过消息传输客户端以消息的形式发送给省级主题X.OBS,然后通过路由键值R.#将消息存到消息队列中Q.OBS.TO.BABJ、Q.OBS.TO.Server、Q.OBS.Monitor,最后通过Shovel将其转发到国家级消息服务器和省级MDOS,CIMISS和Monitor用户。

图5 地面自动站消息传输控制策略

3 结束语

通过对RabbitMQ消息队列技术在气象通信系统中的应用研究,设计开发了基于消息通信传输模式的气象通信系统2.0版本,2018年12月已经在全国各省和台站部署相关的应用并业务运行。通过两个月观测数据的传输情况分析得到:系统运行稳定,96%的气象观测数据能够在2秒内完成从台站到国家级的传输,并且在10秒内完成全部数据的传输。同时,系统通过消息交换控制策略将观测数据及时转发到MDOS、CIMISS、MICAPS等气象业务系统中供业务单位使用。业务应用结果表明,基于RabbitMQ技术的气象通信系统,可以满足大数量、高频次、多种类气象观测数据的高时效、高可靠传输,大幅提升了气象数据的传输时效性和服务能力。

猜你喜欢

键值服务端队列
基于车车通讯的队列自动跟驰横向耦合模型
队列队形体育教案
非请勿进 为注册表的重要键值上把“锁”
队列里的小秘密
多人联机对战游戏的设计与实现
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
一键直达 Windows 10注册表编辑高招
青春的头屑
注册表值被删除导致文件夹选项成空白