基于RabbitMQ和Socket的分布式查询系统设计与实现

2020-12-17 12:45任军锋孟亚旗
自动化仪表 2020年12期
关键词:原始数据数据量结构化

任军锋,孟亚旗

(上海工业自动化仪表研究院有限公司,上海 200233)

0 引言

随着数据信息化发展速度的加快,产生了很多全文本类的大数据场景。对于这些数据的精准、快速查询,已成为常规需求[1]。由于数据量大,数据集中在一个中心,会给后期的业务查询带来巨大压力。分布式存储-查询是解决这类问题的常用解决方案。存储和查询是分布式查询的必要步骤,只有合适的数据存储结构和良好的查询框架相配合,才能组建高效、准确的查询系统。同时,分布式查询的整体架构设计必须有较好的扩展性,即使数据量增大,也可以通过增加硬件设备、扩展存储节点的方式解决数据查询的性能问题[2]。

数据的存储与查询是前端业务的基础。系统程序的高内聚、低耦合,是系统的必要属性。高内聚可以让模块部分专注于模块本身,重要核心内容对外界透明,而又不依赖于外部。低耦合则是尽可能减少和外部模块的联系,接口设计越简单,协同开发的效率越能大幅提升[3]。

RabbitMQ是典型的前后端通信的消息队列通道。SocketServer可以应对多连接的TCP/UDP请求。这两者的结合,能够为解决分布式查询问题提供有效帮助。本文通过对分布式查询软件架构的设计和开发的研究,为解决类似查询全文类数据问题提供了有效参考。

1 需求分析和技术选择

1.1 需求分析

文本类数据的可追溯查询:文本类数据经过预处理和分析关联后,形成结构化的信息,存储到关系型数据库中。Web业务端可根据提取的结构化的内容追溯到原始文本数据,供页面显示原始数据详情[4]。满足该需求需要分5步实现。①原始数据文件存储:为了更好地利用磁盘资源、减少数据库内容的占用量,原始数据采用本地或者中心集中压缩存储的方式。②结构化数据和原始文件关联性:结构化数据字段中记录原始文件路径和位置。③分布式架构设计的扩展性:采用QueryAgent和QueryService的二级架构。④前后端通信接口:选择性能健壮、耦合度低的通信服务接口。⑤查询并发和性能:采用高并发异步的处理模型,增加索引缓存设计[5]。

1.2 技术选择

RabbitMQ是一套开源(mozilla public license,MPL)的消息队列服务软件,采用以高性能、健壮以及可伸缩性而闻名的 Erlang 写成[6]。软件系统的前端和后端可以通过该消息队列传递数据,降低前后端耦合度。RabbitMQ的具体特点包括高可靠性、灵活路由、扩展性强、高可用性、多种协议多语言支持等[7]。它的五种模式为simple、work、fanout、route、topic。根据现有需求,路由模式更适合场景。Web业务端发送消息到交换机exchange,同时要指定route路由的key。此时,数据获取端将queue队列绑定到交换机exchange,同时也需要绑定到route路由的key。后端从队列中取出消息后,分析消息内容和查询条件,然后下发消息到指定的查询服务节点即可[8]。

SocketServer是用于创建网络服务器的python标准库常用模块。该模块是一个基本的socket服务器框架,使用threading处理多客户端连接,使用seletor处理高并发访问[9]。SocketServer刚好满足了QueryService功能实现的要求。当有多个查询任务发布到同一台QueryService节点时,查询任务不会因此阻塞。SocketServer的异步机制不仅可以很好地应对多客户连接查询的要求,而且实现过程对使用者透明,开发者仅需关注自身业务层数据内容。

2 软件架构设计与实现

2.1 系统架构图

系统架构如图1所示。

图1 系统架构图

从图1可以清晰地看到,整个系统分为Web业务层、QuerAgent代理层和QueryService服务层。Web服务器通过RabbitMQ通道将查询条件发送给QueryAgent代理层。QueryAgent根据查询条件和规则查找算法,找到数据所在的QueryService机器。QueryService根据查询条件,将本地存储的原始日志信息通过socket反馈给QueryAgent代理层。QueryAgent代理层将查询结果按照通信接口要求重新组织,发送到RabbitMQ中。Web服务器从RabbitMQ中提取信息,然后在页面显示。

另外,以上架构的层次设计可以保证程序有较好的扩展性。当数据量增加,只需增加相应的QueryService数量,即可满足一般的扩展需求。QueryAgent代理层的设计,也让系统的扩展性更加丰富。例如,可以安装多个查询代理,分别查询、处理不同业务类型的数据。Web业务层、QueryAgent层和QueryService层都可以设计各自的缓存机制,从多个方面提高查询的效率。

2.2 技术要点分析

①索引设计。

对于待查询的数据的索引,设计的合理性将直接影响查询的效率。虽然没有万能的索引设计公式,但是好的索引结构都具有唯一性、分层分块存储、支持增量索引的特点[10]。因此,必须密切结合具体的业务场景,分析业务自身特点,找到系统本身的共性和个性,设计最适合自身业务的索引结构。例如:该分布式数据查询系统是用于追溯查询原始文本数据的。原始全文本类数据经过处理分析结构化后存入数据库表。前端业务层可以通过结构化的数据库表直接查找到原始文本类内容,以校验结构化处理的准确性。所以在处理结构化数据时,就将该条原始数据的位置信息作为结构化数据的一个字段记录下来,作为后续精确查找的条件。

②缓存机制。

对于查询系统,良好的缓存设计可以大幅提高查询效率、提升用户体验。缓存设计的核心是命中率高、复用性强、占用空间少。例如:本系统的缓存设计在QueryAgent处,查询条件作为缓存的key,遇到相同查询条件,数据可以直接反馈之前的查询结果,而不需要再次去二级节点查询服务处查询。

③并发性。

对于批量的查询,可以支持高并发,充分利用CPU资源,快速反馈结果。多线程、多进程、分布式的实现方式是解决该问题的常用有效方法。例如:在此实例中,正对批量查询会创建多个线程,同时执行查询任务。查询服务结点部分ServerCenter_Content中运用SocketServer类,可以很好地处理并发的连接请求。

④可扩展性。

在设计整体系统时,要考虑到后续数据可能快速增加后带来的查询压力问题。在系统架构设计初期,需要充分调研需求,仔细分析业务,做好层次模块划分、分层设计。当数据量增加时,不用调整软件架构,仅增加服务器设备就可以解决数据量大的问题和性能瓶颈。

⑤接口通信设计。

对于接口通信设计,在满足数据传输要求的同时要尽量简单,从而降低与其他业务联合开发的耦合性。例如:该系统在前后端通信接口部分,主要应用RabbitMQ消息队列,传输前后端查询条件和结果。这样就不用单独开发通信接口。复用开源成熟的通信接口,可以让前后端的开发专注于业务。在后端内部数据通信,应用了SocketServer。该模块对Socket类作了更好的封装,增加了并发处理和异步等机制,简化了通信编码开发[11]。

2.3 数据源存储特性

数据来源是各地实时上传的数据文件,接收程序会按照日期时间目录分布存储。如:2019-09-08 10∶22∶15接收的数据文件是171.125.3.157.log,将存储在171.125.3.157服务器的/datastorage/20190908/10/22目录下。

2.4 类和接口设计

本文设计的AgentServer查询代理类如表1所示。

表1 AgentServer查询代理类

RabbitMQ消息请求接口内容为:

json_info = {"mayjorType":"",#主模块类型

"taskCount":"1",#批量任务数

"commitTime":"now",#批量任务提交时间

"tasks":{"taskName":"QueryAgent",#任务名称

"createTime":"NOW",#任务创建时间

"taskID":"2",#任务ID(唯一)预留字段

"subType":"Query",固定Query

"detail":{}

}

}

RabbitMQ消息响应接口内容为:

message = {

′resType′:′response′,

′result′:[

{ ′code′:1,

′message′:′successful′,

′mayjorType′:′l′,

′subType′:′QueryAgent′,

′taskName′:′Query′,

′taskID′:′1′,

′resTime′:‘2019-05-06 14:18:14’,

′detail′:{ ′redisKey′:′′,′Result′:[]}

}

]

}

2.5 部署测试

按照以上系统架构设计软件,编码开发完成后,需要对整个软件需求的功能进行部署测试。建议至少准备2台linux服务器:1台部署QueryAgent 查询代理机,1台部署ServiceCenter_content程序查询节点机,待查询的原始数据按照以上存储规则,存放在查询节点机上。部署测试主要包含4个部分:①查询结果准确测试;②缓存机制加速效果测试;③并发查询测试;④系统快速可扩展性测试。

查询结果准确率测试是本系统软件设计的基本功能要求。缓存机制加速效果测试,是为了检验提高的查询效率。针对历史查询可以快速反馈结果的测试,是系统用户体验的重要保证。并发查询测试是指系统中同时有多个用户批量查询数据后,能及时、准确反馈查询结果的测试,是系统可靠性、健壮性的重要体现。系统快速可扩展性测试,在系统中的增加ServiceCenter_content查询节点机,在不修改系统架构和程序代码的基础上就可以满足增大的基础数据量查询需求,且性能几乎不受影响。

3 结论

在信息大爆炸的时代,人们的工作和生活正在被大数据影响和改变。用户如何在海量的数据中查询到想要的信息变成一个尤为迫切的需求[12]。本次基于RabbitMQ和SocketServer的分布式查询系统设计,为解决数据的查询提供了很好的解决思路。该分布式查询系统的设计和实现,通过详细的需求调研、分析数据、设计开发、部署测试,很好地满足了用户对原始数据追溯查询的需求。此次软件架构的设计和开发,为后续要解决查询原始数据问题提供了实例。后续的设计和开发者,可以根据实际需求,参考以上设计和分析问题方法,解决实际问题。

猜你喜欢
原始数据数据量结构化
基于大数据量的初至层析成像算法优化
促进知识结构化的主题式复习初探
改进的非结构化对等网络动态搜索算法
受特定变化趋势限制的传感器数据处理方法研究
高刷新率不容易显示器需求与接口标准带宽
结构化面试方法在研究生复试中的应用
左顾右盼 瞻前顾后 融会贯通——基于数学结构化的深度学习
宽带信号采集与大数据量传输系统设计与研究
全新Mentor DRS360 平台借助集中式原始数据融合及直接实时传感技术实现5 级自动驾驶
对物理实验测量仪器读数的思考