CN117742998B - 一种面向计费采集数据转发的高性能队列方法及系统 - Google Patents
一种面向计费采集数据转发的高性能队列方法及系统 Download PDFInfo
- Publication number
- CN117742998B CN117742998B CN202410179901.5A CN202410179901A CN117742998B CN 117742998 B CN117742998 B CN 117742998B CN 202410179901 A CN202410179901 A CN 202410179901A CN 117742998 B CN117742998 B CN 117742998B
- Authority
- CN
- China
- Prior art keywords
- message
- queue
- consumer
- producer
- messages
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 222
- 230000008569 process Effects 0.000 claims abstract description 183
- 238000012545 processing Methods 0.000 claims abstract description 41
- 238000009826 distribution Methods 0.000 claims abstract description 37
- 230000002688 persistence Effects 0.000 claims abstract description 24
- 230000005540 biological transmission Effects 0.000 claims abstract description 14
- 238000000605 extraction Methods 0.000 claims abstract description 3
- 238000007726 management method Methods 0.000 claims description 78
- 238000004519 manufacturing process Methods 0.000 claims description 33
- 238000012790 confirmation Methods 0.000 claims description 15
- 238000012544 monitoring process Methods 0.000 claims description 15
- 238000003860 storage Methods 0.000 claims description 9
- 230000007717 exclusion Effects 0.000 claims description 8
- 230000006835 compression Effects 0.000 claims description 4
- 238000007906 compression Methods 0.000 claims description 4
- 230000007246 mechanism Effects 0.000 claims description 4
- 230000002085 persistent effect Effects 0.000 claims description 4
- 238000004064 recycling Methods 0.000 claims description 3
- 230000003213 activating effect Effects 0.000 claims 1
- 239000000284 extract Substances 0.000 claims 1
- 238000005516 engineering process Methods 0.000 abstract description 9
- 238000010200 validation analysis Methods 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 12
- 238000009530 blood pressure measurement Methods 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000002238 attenuated effect Effects 0.000 description 2
- 230000000903 blocking effect Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 230000008602 contraction Effects 0.000 description 2
- 230000008878 coupling Effects 0.000 description 2
- 238000010168 coupling process Methods 0.000 description 2
- 238000005859 coupling reaction Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000013480 data collection Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出一种面向计费采集数据转发的高性能队列方法及系统,包括:步骤S1:启动管理进程,创建共享内存,拉起核心进程,并注册生产者和消费者;步骤S2:生产者通过API发送消息,工作进程负责消息格式化和入队;步骤S3:持久化进程处理队列中的消息并创建文件,分发进程根据组ID分配消息;步骤S4:消费者通过API拉取消息,工作进程管理消息提取和确认。本发明通过其先进的架构和技术实现,展现了卓越的性能、低I/O依赖和高稳定性,使其成为处理大规模、高频率消息传递场景的理想选择,实现组内消息的严格有序性,确保消息的幂等性。支持积压消息的动态重分配,保障计费业务消息的有序性和安全性。
Description
技术领域
本发明涉及消息队列技术领域,具体涉及一种面向计费采集数据转发的高性能队列方法及系统。
背景技术
随着运营商核心系统逐渐向云化转型和核心模块数量的增长,现有的消息队列(MQ)技术面临着多方面的挑战,尤其在高流量和复杂流程管理的场景中。在这些场景中,系统常常需要应对策略配置的变更重启和突发告警(告警风暴),这些情况往往导致告警数据量急剧增加,超出了系统的处理能力上限。
传统MQ集群在处理突发的大量消息时,尤其是在告警风暴这类高压力事件下,常常遭遇磁盘I/O的严重阻塞。这种阻塞不仅影响了消息的生产和消费效率,而且由于大量数据拷贝操作,还会导致垃圾回收(GC)开销过高。这些问题合在一起,进一步降低了整个消息队列系统的处理性能和稳定性,增加了数据处理超时和关键告警遗漏的风险。
此外,随着系统模块的增多和运营商业务的复杂化,传统MQ技术在满足现代高效、高吞吐量且响应迅速的业务需求方面显示出局限性。在这种背景下,对消息队列技术的优化和创新变得尤为重要,以确保核心系统在面对高流量和复杂场景时的稳定性和可靠性。
发明内容
为克服现有技术的不足,本发明提出一种面向计费采集数据转发的高性能队列方法及系统,Broker层的消息存储结构拆分,实现生产者、消费者与MQ系统的有效解耦,提升吞吐性能和业务稳定性,减少对磁盘I/O的依赖,提高处理积压消息的效率;实现组内消息的严格有序性,确保消息的幂等性。支持积压消息的动态重分配,保障计费业务消息的有序性和安全性。
为实现上述目的,本发明提供一种面向计费采集数据转发的高性能队列方法,包括:
步骤S1:启动管理进程,创建共享内存,拉起核心进程,并注册生产者和消费者;
步骤S2:生产者通过API发送消息,工作进程负责消息格式化和入队;
步骤S3:持久化进程处理队列中的消息并创建文件,分发进程根据组ID分配消息;
步骤S4:消费者通过API拉取消息,工作进程管理消息提取和确认。
进一步地,步骤S1具体如下:
步骤S11:激活FastMQ的核心管理进程,负责协调整个消息队列系统。
步骤S12:建立共享内存区域,用于存放系统状态、队列信息,以及生产者和消费者的数据;
步骤S13:拉起生产者管理进程,负责处理所有生产者的注册、连接管理和消息分发;
步骤S14:拉起消费者管理进程,负责消费者的注册、连接管理和消息接收;
步骤S15:拉起消息持久化进程,实时监控生产者队列,将消息存储到磁盘以确保安全;
步骤S16:拉起消息分发进程,从磁盘读取消息并分发给相应的消费者队列;
步骤S17:生产者通过FastAPI注册,系统分配一个或多个工作进程,用于消息处理和队列管理;
步骤S18:消费者通过FastAPI注册,系统分配工作进程和消费者队列,根据需求可能为消费者队列打上组标签。
进一步地,步骤S2具体如下:
步骤S21:生产者发送消息,生产者完成业务逻辑后,通过API将消息提交给系统;
步骤S21:消息预处理,生产者工作进程对接收到的消息进行格式化和验证;
步骤S21:消息入队,经过处理的消息被安全地放入生产者队列,并添加唯一序列号以确保顺序和唯一性。
进一步地,步骤S3具体如下:
步骤S31:实时扫描,消息持久化进程定期检查生产者队列,提取新消息;
步骤S32:文件存储,提取的消息存储在磁盘上的文件中,以避免数据丢失;
步骤S33:文件读取,消息分发进程读取磁盘上的消息文件;
步骤S34:消息路由,根据消息的组ID,决定将消息发送到哪个消费者队列;
步骤S35:异常处理,对于退出消费者的队列中的未完成消息,进行回收和重新分发。
进一步地,步骤S4包括:
步骤S41:消费请求处理,消费者发出消费请求,通过API将请求传达给工作进程;
步骤S42:消息拉取,消费者工作进程根据请求从队列中拉取相应的消息;
步骤S43:偏移管理,记录并管理每条消息的消费偏移,以保证消息处理的顺序性和完整性;
步骤S44:消费确认,消费者完成消息处理后,通过API确认消息消费,确保消息不会被重复处理。
进一步地,还包括双层队列消息管理方法,具体如下:
步骤S61:生成消息ID:为每个消息分配一个唯一的8字节长整型全局序列ID;标记4字节整型的生产者工作进程ID,记录4字节整型的生产者业务标识;
步骤S62:使用8字节整型时间戳记录消息生成时间,用4字节整型记录消息的消费回收次数;
步骤S63:记录4字节整型的消息体压缩状态,用4字节整型标记消息体的存储长度;
步骤S64:检查磁盘使用率,判断系统是否拥塞,以防止过载;
步骤S65:解析生产消息个数,支持批量传输以减少网络I/O性能损耗,轮询处理消息,解析消息组ID,计算消息长度,对消息进行序列化处理,将序列化后的消息存入生产者队列;
步骤S66:解析消费消息数,支持批量传输以减少网络I/O性能损耗,处理自动消费确认,根据接口设置自动处理消费确认;
步骤S67:拉取消费者队列消息,不超过请求的消息数量,轮询处理消息,对消息进行反序列化处理,组装消息到报文,发送消息给消费者,完成消息的最终消费。
进一步地,包括共享内存队列管理方法:
步骤S71:划分管理区,包括进程区、生产者链接管理区、消费者链接管理区,创建一个全局生产者队列,构造N个动态扩展和回收的消费者队列;
步骤S72:实现循环队列结构,互斥锁保证入库操作的准确性和互斥性,采用消费确认机制,区分pop位置和消息拉取位置;
步骤S73:申请push锁,确保操作互斥性,控制循环队列偏移,保证消息准确写入,将消息序列化数据拷贝到队列,增加消息计数器;
步骤S74:检查队列中是否存在可拉取数据,控制循环队列偏移,确保消息准确拉取,将消息拷贝到进程私有内存,增加消息计数器,定时/定量策略持久化消息至文件;
步骤S75:消费分发进程处理,无需加锁互斥,操作流程与生产者队列类似;
步骤S76:更新消息拉取位置,不立即更新pop位置,待消费确认后,更新pop位置,操作流程与生产者队列类似。
进一步地,还包括消息分发控制方法,具体如下:
步骤S81:基于每个消费队列的积压消息数进行评估,将无组消息分配到最空闲的消费队列;
步骤S82:根据消费队列的标签直接分配有组消息,在有组消息消费完毕后,清空消费队列的临时标签;
步骤S83:新消费者注册时自动生成对应的消费队列,并更新路由分发规则,为新增消费者创建新队列并绑定至对应的代理工作进程;
步骤S84:接收消费者下线通知并向相关工作进程发送登出消息,释放下线消费者的队列资源,并将其消息重新分配给其他消费者。
一种面向计费采集数据转发的高性能队列方法的系统,适用于所述的一种面向计费采集数据转发的高性能队列方法,包括FAST API模块、生产者管理模块、消费者管理模块和消息控制与管理模块;
FAST API模块包括:
生产者API子模块:提供接口供生产者发送消息到FastMQ,具有系统拥堵感知能力以保证稳定性;
消费者API子模块:允许消费者从FastMQ提取消息,支持分组消费和批量处理以提高效率;
生产者管理模块包括:
管理进程子模块:创建监听端口,负责将生产者的请求分配给工作进程;
工作进程子模块:负责与生产者队列连接,监控队列状态,并通过共享内存和全局锁来管理消息入队;
消费者管理模块包括:
管理进程子模块:为消费者提供监听端口,并将请求转发给工作进程;
工作进程子模块:执行分组消费策略,自动调整容量以应对消费者登录或登出;
消息控制与管理模块包括:
FastMQ管理子模块:构建和管理生产者和消费者队列;
生产者队列子模块:单一队列,负责接收和暂存生产的消息;
消费者队列子模块:动态变化的队列,根据消费者数量调整,用于消息分发和消费;
消息持久化子模块:处理从生产者队列中提取的消息,并进行存储;
消息分发子模块:负责将消息从生产者队列有效地分发到各消费者队列。
与现有技术相比,本发明的有益效果是:
1.本发明提供了一种面向计费采集数据转发的高性能队列方法及系统,在单台准生产服务器上的测试表明,FastMQ系统的I/O使用率比传统MQ系统低大约10倍,显著降低I/O使用率。
2.本发明提供了一种面向计费采集数据转发的高性能队列方法及系统,即使在高压力情况下,生产者和消费者的性能未显著衰减,且积压消息能够被迅速处理。
3.本发明提供了一种面向计费采集数据转发的高性能队列方法及系统,与生产MQ集群(4主4从)相比,FastMQ整体性能提升约5到10倍,充分满足采集数据转发的需求场景。
4.本发明提供了一种面向计费采集数据转发的高性能队列方法及系统,严格保序和无重复消费:在持续的压测中,即便频繁杀死消费者工作进程,FastMQ系统依然能确保消费数据的严格局部有序性,且无消费消息的重发或错发。
5.本发明提供了一种面向计费采集数据转发的高性能队列方法及系统,Broker层的消息存储结构拆分,实现生产者、消费者与MQ系统的有效解耦,提升吞吐性能和业务稳定性,减少对磁盘I/O的依赖,提高处理积压消息的效率;实现组内消息的严格有序性,确保消息的幂等性。支持积压消息的动态重分配,保障计费业务消息的有序性和安全性。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明流程示意图;
图2是本发明系统架构示意图;
图3为本发明序列化协议格式示意图;
图4是本发明消息生产流程示意图;
图5是本发明生产者队列结构示意图;
图6是本发明消费者队列结构描述示意图;
图7是本发明生产消息队列的消息生产流程示意图;
图8是本发明消息出队流程示意图;
图9是本发明消息分发及分组消费场景示意图;
图10是本发明消息者扩容场景示意图;
图11是本发明消息者缩容场景示意图;
图12-13是本发明实施例效果示意图。
具体实施方式
下面将结合附图、通过对本发明的优选实施方式的描述,更加清楚、完整地阐述本发明的技术方案。
1.MQ(Message Queue);消息中间件,用于实现应用和数据的解耦,保证消息的安全性。
2.GC(Garbage Collection,垃圾回收):是Java虚拟机(Java Virtual Machine)中的一个自动内存管理过程。
3.Producer(生产者):消息队列中的生产者,它负责创建和发送消息到消息队列系统。生产者通常是指那些需要将信息传递给其他系统或组件的应用程序或服务。
4.Consumer(消费者):消息队列中的消费者,它负责从消息队列中接收并处理消息。消费者通常是指那些等待接收信息并据此执行某些操作的应用程序或服务。
5.Broker: 消息队列系统中的中介,它管理着消息的传输。Broker 负责存储由生产者发送的消息,并将这些消息路由到一个或多个消费者。
6.FastMQ:由浩鲸科技自主研发的高速消息队列,采用完全基于共享内存的实现架构,主要用于传输计费系统中需要高频采集的核心数据,提升系统各项指标处理的及时性。
7.Pps(package per second):每秒处理消息数量,负责标定MQ在生产、消费侧的性能。
8.共享内存:在Linux环境下,共享内存是指一块可以被多个进程访问的内存区域。这些进程可以通过这块内存区域进行通信,共享数据,而无需涉及复杂的进程间通信机制。
如图1所示,本发明具体为:
1.FastMQ管理模块负责创建并控制系统共享内存,启动系统核心应用,及监控系统运行指标,主要流程如下:
1.1 步骤M1为系统启动流程,系统初次启动时创建共享内存,通过自定义共享内存数据结构,实现对生产者、消费者、生产者队列、消费者队列、各模块进程的管控。
1.2 步骤M2为系统监控通知流程,系统各个核心模块将系统运行情况(生产队列积压指标、消费队列消息处理指标、生产者链接数指标、消费者链接数指标、消息生成pps指标、消息消费pps指标)实时更新到共享内存中,由FastMQ管理模块完成数据分析及监控告警。
2.FastMQ提供Fast API接口供生产者、消费者业务调用,主要流程如下:
2.1 步骤A1为生产者业务注册流程,生产者管理进程接受到注册请求后会将该链接分发给工作进程。
2.2 步骤A2为生产者管理进程分发业务连接流程,生产者管理进程优先选择空闲的工作进程进行分发,当所有工作进程均不空闲时,自动拉起新的工作进程进行处理。当工作进程数达到最大值时,生产者管理进程返回连接已满信息,通知生产者业务下线。
2.3 步骤A3为生产者生产消息流程,通过接口生产者将消息发送给对应的工作进程,生产者与工作进程一一匹配。
2.4 步骤C1为消费者业务注册流程,消费者管理进程接受到注册请求后会将该链接分发给工作进程。
2.5 步骤C2为消费者管理进程分发业务连接流程,消费者管理进程优先选择空闲的工作进程进行分发,当所有工作进程均不空闲时,自动拉起新的工作进程进行处理。分发到制定工作进程后,与对应的消费者队列绑定,确保工作进程与消费队列一一匹配。
2.6 步骤C3为消费消息流程,通过接口工作进程将消息按批捞出,发送给对应的消费者业务,消费者与工作进程一一匹配。
3.FastMQ通过双层队列管理技术,实现消息在系统内部快速传递,各模块之间互不阻塞,主要过程如下:
1)步骤B1为生产消息入队流程,工作进程接受到消息后,会申请生产者队列的push锁,确保同一时间有且只有一个工作进程进行消息入队,保证了业务消息的有序性。在申请到push锁后,生产者队列通过全局序列获取唯一标识,构造消息保存对象,保证了业务消息的幂等性。
2)步骤B2为生产消息拉取流程,持久化进程轮询访问生产者队列,当生产者队列的push偏移与pop偏移不一致时,通过pop偏移拉取消息。拉取消息时优先获取消息保存对象,根据对象中的长度再偏移获取消息。
3)步骤B3为消息持久化与加载流程,持久化进程定时定量将拉取到消息落地生成消息文件,单个消息文件中允许包含多条消息。分发进程按顺序读取文件,将文件中的消息有序加载到内存。
4)步骤B4为消息分发流程,分发进程根据消费队列注册情况,将有组消息分发到该组消费队列中;将无组消息均衡分发到所有消费队列中。同时,分发进程记录消息ID消费情况,保证消费的幂等性。对于已分发但未完成消费的消息,在消费者退出时对消费者队列的消息进行回收,确保消息处理不丢失。
5)步骤B5为消息出队流程,工作进程收到消费者消费请求后,根据消费者请求消费个数在已绑定的消费者队列上拉取消息,并记录消费偏移。消费完成后,根据消费者消费确认请求,将消费完成偏移置为上次记录的消费偏移位置。
如图2所示,系统包括
1.FAST API
FAST API参考标准MQ接口进行封装,实现业务消息的高速、有序、安全传输。FASTAPI分为生产者API和消费者API,通过点对点的方式完成消息生成与消费。
1)生产者API
生产者负责把消息传输到FastMQ系统中,接口支持拥塞感知,FastMQ系统积压时,生产者API自动中断消息传输,确保系统安全稳定。
2)消费者API
消费者负责将FastMQ系统中的消息取出消费,接口支持按制定分组消费,确保分组数据的有序性。一个消费者队列只能分配给一个消费者处理,同时支持批量消费,减少多次网络交互带来的性能损耗,保证多进程消费的并发吞吐能力。
2.生产者管理
生产者管理模块包含一个生产者管理进程及多个生产者工作进程。生产者管理进程对生产者提供监听端口,将生产者的请求转发给空闲的生产者工作进程。生产者工作进程连接生产者队列,实时监控生产者队列的积压情况。生产者工作进程通过共享内存技术,多进程共享全局锁,确保消息入队的有序性及幂等性。
3.消费者管理
消费者管理模块包含一个消费者管理进程及多个消费者工作进程,消费者管理进程对消费者提供监听端口,将消费者的请求转发给消费者工作进程。消费者工作进程根据收到的组信息,实现分组消费策略。当消费者登陆/登出时,消费者工作进程支持自动扩缩容。
4.消费管理
消费管理模块包含FastMQ管理进程、消息持久化进程及消息分发进程。消息控制主进程基于共享内存构造两类循环队列,一类是用于存储及传输生产消息的生产者队列,该队列有且只有一个;另一类是用于分发及消费的消费者队列,该队列随消费者个数动态增减。这两类循环队列构成双层队列架构,由消息持久化进程将消息从生产队列中取出,再由消息分发进程将消息传递给消费者队列。通过生产者、消费者的完全解耦,保证了业务消息传递的高性能、高吞吐。
这个技术方案涉及到多个模块和处理流程,这个方法的实施步骤可以概括为以下几个阶段:
1.系统初始化:
1)启动FastMQ管理进程,创建共享内存并构建数据对象。
2)拉起生产者管理进程、消费者管理进程、消息持久化进程及消息分发进程。
3)生产者业务通过FastAPI向FastMQ系统注册,分配生产者工作进程。
4)消费者业务通过FastAPI向FastMQ系统注册,分配消费者工作进程及消费者队列。同时,根据注册时是否传递组ID,将已分配的消费者队列进行有组打标。
2.消息生成:
1)生产者进行业务处理后,调用FastAPI提供的消息发送接口,将消息传递给已分配的生产者工作进程,通过是否携带消息组ID将消息置为有组消息或无组消息。
2)生产者工作进程接收到消息后,将消息按照规定格式存入生产者队列,并附加唯一标识。同一时间只允许一个生产者工作进程将消息入队,能保证全局意义上的消息有序性和幂等性。生产者队列通过共享内存实现,减少磁盘IO的性能损耗,保障生产者消息处理性能高性能、高吞吐。
3.消息传递:
1)生产者队列中的消息被消息持久化进程实时扫描拉取消息,根据消息唯一标识对消息去重处理,并定时定量生成消息文件。此时生产者队列中的消息被转移至文件中,避免了队列积压导致生产者生成消息阻塞的问题。
2)消息分发进程实时扫描文件目录,将消息文件有序读出,并对即将处理的消息进行打标,保证生产端的数据不会丢失,保证消息数据不重复处理。
3)消息分发进程根据消息携带的组ID,将有组消息分发给相同组ID的已注册的消费者队列,将无组消息分发给所有已注册的消费者队列。
4)消息分发进程实时扫描消费者队列注册情况,当消费者退出时,将对应消费者队列中未完成消费的消息进行回收,保证业务消息的安全性。
4. 消息消费:
1)消费者进行业务处理时,调用FastAPI提供的消息拉取接口,将拉取请求传递给已分配的消费者工作进程。
2)消费者工作进程从消费者队列拉取消息后,记录消费偏移。当消费者业务处理完成,确认消息完成后,将消费确认偏移置为上次记录的消费偏移,确保消息消费的准确性。
3)消费者队列通过共享内存实现,减少磁盘IO的性能损耗,保证消费者消息处理高性能、高吞吐。
作为一种具体的实施方式,双层队列消息管理方法,具体如下:
对于传统MQ而言,磁盘IO的性能高度影响系统的整体TPS,这一方面取决于传统MQ的系统架构,另一方面也取决于MQ的消息持久化机制。前者,传统MQ的生产者和消费者通常放在应用层,生产者、消费者在连接到同一个broker消费时,也增加了系统的耦合性,势必要通过加锁的方式实现互斥,保证消息的有序;后者,消息的持久化是保证消息完整性的关键,而消息的持久化动作在基于JVM实现时,大量的数据拷贝很容易GC开销过高,在高并发消费时,系统也很难及时将持久化的消息重新加载到内存中供消费者消费。
双层队列消息管理技术,是将生产者、消费者的架构下沉到MQ系统内部,将broker的消息存储环节用生产者队列、消费者队列进行替代,形成双层队列消息闭环管理技术。对于计费业务来说,生产者、消费者只需要考虑与系统内部生产者队列、消费者队列挂钩,成功实现了生产者、消费者和MQ之间的解耦。在完成系统解耦后,一方面应用之间的影响大大降低,系统吞吐能力得到提升;另一方面生产者产生消息的内存化操作和消费者消费内存的操作完全物理无关,不存在互相影响导致反复GC的情况。
消息序列化
业务消息在系统内部进行传递时,由于各个业务消息的特征、大小均不一致,无法直接对原始消息进行操作。因此,在系统内部传递消息时,需要将业务消息序列化为二进制数据。为了保障系统内存消息传递性能,使用自定义的序列化方案,序列化协议格式如图3所示,
1、消息ID
8字节长整型,FastMQ系统内部全局序列生成,不同消息的消息ID不相同,通过消息ID确认消息消费状态、判断消息是否重复。
2、生产者进程ID
4字节整型,产生该消息的生产者工作进程标识,用于跟踪消息生产链路。
3、生产者连接ID
4字节整型,产生该消息的生产者业务标识,用于跟踪消息生产源。
4、生产日期
8字节整型,产生该消息时的时间戳,用于跟踪消息生产时间,监控消息消费及时性。
5、回收标识
4字节整型,记录该消息消费回收的次数,监控多次被消费失败的消息。
6、压缩标识
4字节整型,记录该消息体是否压缩。
7、消息长度
4字节整型,记录该消息体存储长度。
消息生产流程:
生产者工作进程处理FastAPI的生产消息请求,各生产者共享生产者队列,包含如下流程:
1、检查磁盘使用率,判断系统拥塞:当系统拥塞时,不允许生产者继续生产消息,需要返回消息传输失败。
2、解析生产消息个数:生产消息支持批量传输,减少网络I/O的性能损耗。
3、根据消息个数轮询处理消息:
a)解析消息组ID:生产消息可指定消息组ID,从而确保只由某类消费者进行消费;
b)解析消息长度;
c)消息序列化:将消息组装成系统内部可识别的统一格式;
d)消息入库:将序列化后的消息合入生产者队列。
具体消息生产流程如图4所示:
消息消费流程:
消费者工作进程处理FastAPI的消息消费请求,消费消息与生产消息完全 解耦,各消费者也不共享消费者队列,消费消息完全基于共享内存完成,保障了系统处理性能。具体包含如下流程:
1、解析接口请求消息数:消费消息支持批量传输,减少网络I/O的性能损耗。
2、解析自动消费确认:接口支持设置自动消费确认,消费确认后消息会被认为成功消费。
3、拉取消费者队列消息:最大拉取消息个数不超过接口请求消息数。
4、根据消息个数轮询处理消息:
a)将消息反序列化处理:解析出消息ID与生产日期;
b)组装消息到报文。
5、将消息发送给消费者。
作为一种具体的实施方式,包括共享内存队列管理方法,具体如下:
在进行系统架构拆分后,生产者队列和消费者队列均面临进程间通信的场景。对于生产者队列来说,一边需要实现承接生产消息的代理,一边需要将消息持久化到文件;对于消费者来说,一边需要将持久化文件转化成消息,一边又需要承接消费消息的代理。在这样的场景下,系统架构分层实现及IPC方式就需要进行详细考虑,既要保障尽量减少进程间的耦合性,又要保证不增加系统复杂度。
共享内存队列管理技术,可以基于共享内存构建一套可管理的消息队列控制系统。该系统内部,将共享内存通过管理区管理,并向下区分为进程区、生产者链接管理区、消费者链接管理区,并构造出唯一一个生产者队列及N个可自动扩展、回收的消费者队列,实现了通过共享内存对生产者、消费者、消息传递的统一控制。由于采用共享内存作为消息传递的载体,避免了磁盘I/O性能对系统整体PPS的影响,保障了系统消息处理时延和压力下系统整体吞吐量。
共享内存管理:
生产者队列结构
FastMQ系统中生产者队列有且只有一个,保障了生产消息的有序性。生产者队列基于共享内存创建,优先采用循环队列的结构实现,保障了对系统内存资源的复用。同时,为了确保不同生产者工作进程对消息入库的准确性,工作进程在消息入库操作上需要严格互斥,该互斥操作通过POSIX 线程库中互斥锁实现。生产者队列结构描述如图5所示。
消费者队列结构
FastMQ系统中消费者队列与消费者个数一一对应,保障了消息消费的高吞吐能力。消费者队列基于共享内存创建,优先采用循环队列的结构实现,保障了对系统内存资源的复用。由于消费者队列不存在并发写入、并发读取的场景,故不需要申请互斥锁。由于消费流程存在消费确认特性,因此消费者队列需要区分pop位置和消息拉取位置,当消费未确认时不变更pop位置,避免消息消费失败后无法拉取的场景。消费者队列结构描述如图6所示。
生产者队列消息入队流程
生产者工作进程与生产者队列交互,需要控制循环队列偏移对象,确保循环队列操作的准确性,包含如下流程:
1、申请push锁:确保多个生产者同时处理消息的互斥性。
2、循环队列控制:通过控制push位置与pop位置,确保消息准确写入队列中。
3、数据拷贝:将序列化消息拷贝到队列计算的push位置上。
4、消息计数:写入消息后增加消息计数器,用于系统性能判断。
5、释放push锁。
具体消息生产流程如图7所示。
生产者队列消息出队流程
持久化进程与生产者队列交互,需要控制循环队列偏移对象,确保循环队列操作的准确性,包含如下流程:
1、检查是否存在数据。
2、循环队列控制:通过控制push位置与pop位置,确保消息准确拉取到进程内部。
3、数据拷贝:将序列化消息拷贝到进程私有内存。
4、消息计数:读取消息后增加消息计数器,用于系统性能判断。
为了减少系统对磁盘I/O调用的次数,采用定时/定量的策略将持久化进程内存中的消息批量落地至文件,大幅优化了系统对磁盘I/O的依赖。具体消息出队流程如图8所示。
消费者队列消息入队流程
消费分发进程与消费者队列交互,消费者队列消息入队不存在并发场景,故不需要进行加锁互斥操作。除此以外,消费者队列消息入队流程与生产队队列消息入队流程完全一致。
消费者队列消息出队流程
消息消费需要消费者业务处理完成后进行消费确认,从而保障关键消息处理的准确性。因此,消费者队列消息出队时,只更新消息拉取位置,不更新pop位置,待消费确认后将pop位置更新至消息拉取位置即可。除此以外,消费者队列消息出队流程与生产队队列消息出队流程完全一致。
作为一种具体的实施方式,还包括消息分发控制方法,具体如下:
消息分发及分组消费
消息实现分组消费的效果,当消息未打标时,消息之间未产生分组关联关系,此时按照队列空闲情况分发消息。当生产者对消息打标时,相同标记的消息会按照标签分组,周期内将同组消息分发给同一个消费者队列,保证组内消息严格有序。具体场景如图9所示:
关键实现方案包含:
1、消费队列包含积压消息数、临时标签等关键特征;
2、对于无组消息,根据消费队列及积压消息数构建小顶堆,保证每次往最空闲的队列分配消息;
3、对于有组消息,直接根据消费队列的标签分配,当消费队列中所有有组消息消费完后,清空临时标签;
通过上述设计保证如下特性:
1、无论何时分发消息到消费队列,均保证消息局部有序,且精确唯一;
2、消费队列上包含临时标签,对于打标消息,能精确保证消息投递的全局有序;
3、无论是否打标,不影响消息分发的均衡性。
消息者扩缩容
消费者进行消费注册时,会根据消费的主题自动生成队列,并重新计算路由分发规则。当消费者新增时,根据消费者代理标识生成新的队列,消费管理进程新增该队列分发;当消费者注销时,将分发到该队列的消息清空,并进行重分配。
其中,消费者扩容图示如图10所示,通过绑定消费者与消费代理工作进程之间的关系,给不同消费者定义ID及状态,来区分新增消费者。
消费者缩容图示如图11所示,综上所述,当消费者下线后,会自动给对应的工作进程发送登出消息。消费代理工作进程收到登出消息后,修改状态并释放对应队列资源。最终,由分发控制进程将该队列积压消息取出分配给其他消费者处理。
作为一种具体的实施例,如图12-13所示:
1)低I/O依赖
使用单台准生产服务器(8C/192G),对系统进行瞬间峰值压测,相较传统MQ来说,系统I/O使用率下降10倍左右,生产者及消费者在压力下行为未衰减,积压消息被快速处理完成。
2)高性能
使用单台准生产服务器(8C/192G),分别对生产者、消费者、消息持久化进行压测,性能数据如下:
与生产MQ集群(4主4从)相比,整体性能提升在5~10倍左右,完全满足采集数据转发的场景。
3)高稳定
使用单台准生产服务器(8C/192G),分别对生产者、消费者、消息持久化进行压测,压测期间不间断kill消费者工作进程。检查消费数据严格保序(局部)、消费消息无重发、错发情况。
上述具体实施方式仅仅对本发明的优选实施方式进行描述,而并非对本发明的保护范围进行限定。在不脱离本发明设计构思和精神范畴的前提下,本领域的普通技术人员根据本发明所提供的文字描述、附图对本发明的技术方案所作出的各种变形、替代和改进,均应属于本发明的保护范畴。本发明的保护范围由权利要求确定。
Claims (5)
1.一种面向计费采集数据转发的高性能队列方法,其特征在于,包括:
步骤S1:启动管理进程,创建共享内存,拉起核心进程,并注册生产者和消费者;具体如下:
步骤S11:激活FastMQ的核心管理进程,负责协调整个消息队列系统;
步骤S12:建立共享内存区域,用于存放系统状态、队列信息,以及生产者和消费者的数据;
步骤S13:拉起生产者管理进程,负责处理所有生产者的注册、连接管理和消息分发;
步骤S14:拉起消费者管理进程,负责消费者的注册、连接管理和消息接收;
步骤S15:拉起消息持久化进程,实时监控生产者队列,将消息存储到磁盘以确保安全;
步骤S16:拉起消息分发进程,从磁盘读取消息并分发给相应的消费者队列;
步骤S17:生产者通过FastAPI注册,系统分配工作进程,用于消息处理和队列管理;
步骤S18:消费者通过FastAPI注册,系统分配工作进程和消费者队列,根据需求为消费者队列打上组标签;
步骤S2:生产者通过API发送消息,工作进程负责消息格式化和入队;具体如下:
步骤S21:生产者完成业务逻辑后,通过API将消息提交给系统;
步骤S21:生产者工作进程对接收到的消息进行格式化和验证;
步骤S21:经过处理的消息被安全地放入生产者队列,并添加唯一序列号以确保顺序和唯一性;
步骤S3:持久化进程处理队列中的消息并创建文件,分发进程根据组ID分配消息;具体如下:
步骤S31:消息持久化进程定期检查生产者队列,提取新消息;
步骤S32:提取的消息存储在磁盘上的文件中,以避免数据丢失;
步骤S33:消息分发进程读取磁盘上的消息文件;
步骤S34:根据消息的组ID,决定将消息发送到哪个消费者队列;
步骤S35:对于退出消费者的队列中的未完成消息,进行回收和重新分发;
步骤S4:消费者通过API拉取消息,工作进程管理消息提取和确认,具体如下:
步骤S41:消费者发出消费请求,通过API将请求传达给工作进程;
步骤S42:消费者工作进程根据请求从队列中拉取相应的消息;
步骤S43:记录并管理每条消息的消费偏移,以保证消息处理的顺序性和完整性;
步骤S44:消费者完成消息处理后,通过API确认消息消费,确保消息不会被重复处理。
2.根据权利要求1所述的一种面向计费采集数据转发的高性能队列方法,其特征在于,还包括双层队列消息管理方法,具体如下:
步骤S61:为每个消息分配一个唯一的8字节长整型全局序列ID;标记4字节整型的生产者工作进程ID,记录4字节整型的生产者业务标识;
步骤S62:使用8字节整型时间戳记录消息生成时间,用4字节整型记录消息的消费回收次数;
步骤S63:记录4字节整型的消息体压缩状态,用4字节整型标记消息体的存储长度;
步骤S64:检查磁盘使用率,判断系统是否拥塞,以防止过载;
步骤S65:解析生产消息个数,支持批量传输以减少网络I/O性能损耗,轮询处理消息,解析消息组ID,计算消息长度,对消息进行序列化处理,将序列化后的消息存入生产者队列;
步骤S66:解析消费消息数,支持批量传输以减少网络I/O性能损耗,处理自动消费确认,根据接口设置自动处理消费确认;
步骤S67:拉取消费者队列消息,不超过请求的消息数量,轮询处理消息,对消息进行反序列化处理,组装消息到报文,发送消息给消费者,完成消息的最终消费。
3.根据权利要求1所述的一种面向计费采集数据转发的高性能队列方法,其特征在于,包括共享内存队列管理方法
步骤S71:划分管理区,包括进程区、生产者链接管理区、消费者链接管理区,创建一个全局生产者队列,构造N个动态扩展和回收的消费者队列;
步骤S72:实现循环队列结构,互斥锁保证入库操作的准确性和互斥性,采用消费确认机制,区分pop位置和消息拉取位置;
步骤S73:申请push锁,确保操作互斥性,控制循环队列偏移,保证消息准确写入,将消息序列化数据拷贝到队列,增加消息计数器;
步骤S74:检查队列中是否存在可拉取数据,控制循环队列偏移,确保消息准确拉取,将消息拷贝到进程私有内存,增加消息计数器,定时/定量策略持久化消息至文件;
步骤S75:消费分发进程处理,无需加锁互斥,操作流程与生产者队列一致;
步骤S76:更新消息拉取位置,不立即更新pop位置,待消费确认后,更新pop位置,操作流程与生产者队列一致。
4.根据权利要求1所述的一种面向计费采集数据转发的高性能队列方法,其特征在于,还包括消息分发控制方法,具体如下:
步骤S81:基于每个消费队列的积压消息数进行评估,将无组消息分配到最空闲的消费队列;
步骤S82:根据消费队列的标签直接分配有组消息,在有组消息消费完毕后,清空消费队列的临时标签;
步骤S83:新消费者注册时自动生成对应的消费队列,并更新路由分发规则,为新增消费者创建新队列并绑定至对应的代理工作进程;
步骤S84:接收消费者下线通知并向相关工作进程发送登出消息,释放下线消费者的队列资源,并将其消息重新分配给其他消费者。
5.一种面向计费采集数据转发的高性能队列方法的系统,适用于权利要求1-4中任一项所述的一种面向计费采集数据转发的高性能队列方法,其特征在于,包括FAST API模块、生产者管理模块、消费者管理模块和消息控制与管理模块;
FAST API模块包括:
生产者API子模块:提供接口供生产者发送消息到FastMQ,具有系统拥堵感知能力以保证稳定性;
消费者API子模块:允许消费者从FastMQ提取消息,支持分组消费和批量处理以提高效率;
生产者管理模块包括:
管理进程子模块:创建监听端口,负责将生产者的请求分配给工作进程;
工作进程子模块:负责与生产者队列连接,监控队列状态,并通过共享内存和全局锁来管理消息入队;
消费者管理模块包括:
管理进程子模块:为消费者提供监听端口,并将请求转发给工作进程;
工作进程子模块:执行分组消费策略,自动调整容量以应对消费者登录或登出;
消息控制与管理模块包括:
FastMQ管理子模块:构建和管理生产者和消费者队列;
生产者队列子模块:单一队列,负责接收和暂存生产的消息;
消费者队列子模块:动态变化的队列,根据消费者数量调整,用于消息分发和消费;
消息持久化子模块:处理从生产者队列中提取的消息,并进行存储;
消息分发子模块:负责将消息从生产者队列有效地分发到各消费者队列。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410179901.5A CN117742998B (zh) | 2024-02-18 | 2024-02-18 | 一种面向计费采集数据转发的高性能队列方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410179901.5A CN117742998B (zh) | 2024-02-18 | 2024-02-18 | 一种面向计费采集数据转发的高性能队列方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117742998A CN117742998A (zh) | 2024-03-22 |
CN117742998B true CN117742998B (zh) | 2024-05-07 |
Family
ID=90261166
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410179901.5A Active CN117742998B (zh) | 2024-02-18 | 2024-02-18 | 一种面向计费采集数据转发的高性能队列方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117742998B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3009931A1 (en) * | 2014-10-17 | 2016-04-20 | D2 Technologies Inc. | Electronic device for internet protocol communications |
CN106980678A (zh) * | 2017-03-30 | 2017-07-25 | 温馨港网络信息科技(苏州)有限公司 | 基于zookeeper技术的数据分析方法及系统 |
CN110113420A (zh) * | 2019-05-08 | 2019-08-09 | 重庆大学 | 基于nvm的分布式消息队列管理系统 |
CN110532105A (zh) * | 2018-05-25 | 2019-12-03 | 优信拍(北京)信息科技有限公司 | 一种消息队列消费者进程的控制方法、系统及装置 |
JP2020064595A (ja) * | 2018-10-15 | 2020-04-23 | 克秀 浅沼 | 複数参加者間の相互作用のトランザクション処理用のキーを自動生成するイベント管理システム |
CN112559208A (zh) * | 2020-12-15 | 2021-03-26 | 浪潮云信息技术股份公司 | 一种应用于政务云平台构建微服务mq的方法 |
CN116775338A (zh) * | 2023-06-27 | 2023-09-19 | 北京涌乐科技有限公司 | 一种分布式事件异步处理系统 |
CN117290122A (zh) * | 2023-02-28 | 2023-12-26 | 北京荣大科技股份有限公司 | 一种基于Kafka的多环境有序性生产消费的方法 |
-
2024
- 2024-02-18 CN CN202410179901.5A patent/CN117742998B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3009931A1 (en) * | 2014-10-17 | 2016-04-20 | D2 Technologies Inc. | Electronic device for internet protocol communications |
CN106980678A (zh) * | 2017-03-30 | 2017-07-25 | 温馨港网络信息科技(苏州)有限公司 | 基于zookeeper技术的数据分析方法及系统 |
CN110532105A (zh) * | 2018-05-25 | 2019-12-03 | 优信拍(北京)信息科技有限公司 | 一种消息队列消费者进程的控制方法、系统及装置 |
JP2020064595A (ja) * | 2018-10-15 | 2020-04-23 | 克秀 浅沼 | 複数参加者間の相互作用のトランザクション処理用のキーを自動生成するイベント管理システム |
CN110113420A (zh) * | 2019-05-08 | 2019-08-09 | 重庆大学 | 基于nvm的分布式消息队列管理系统 |
CN112559208A (zh) * | 2020-12-15 | 2021-03-26 | 浪潮云信息技术股份公司 | 一种应用于政务云平台构建微服务mq的方法 |
CN117290122A (zh) * | 2023-02-28 | 2023-12-26 | 北京荣大科技股份有限公司 | 一种基于Kafka的多环境有序性生产消费的方法 |
CN116775338A (zh) * | 2023-06-27 | 2023-09-19 | 北京涌乐科技有限公司 | 一种分布式事件异步处理系统 |
Also Published As
Publication number | Publication date |
---|---|
CN117742998A (zh) | 2024-03-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110113420B (zh) | 基于nvm的分布式消息队列管理系统 | |
US9558048B2 (en) | System and method for managing message queues for multinode applications in a transactional middleware machine environment | |
JP3837291B2 (ja) | アプリケーション独立形メッセージングシステム | |
US9723110B2 (en) | System and method for supporting a proxy model for across-domain messaging in a transactional middleware machine environment | |
US8984530B2 (en) | Queued message dispatch | |
EP2335153B1 (en) | Queue manager and method of managing queues in an asynchronous messaging system | |
EP1474746A1 (en) | Management of message queues | |
JP2015537307A (ja) | コンポーネント指向ハイブリッドクラウドオペレーティングシステムのアーキテクチャ及びその通信方法 | |
CA2536037A1 (en) | Fast and memory protected asynchronous message scheme in a multi-process and multi-thread environment | |
CN103914399A (zh) | 一种并行计算系统中的磁盘缓存方法及装置 | |
US9069592B2 (en) | Generic transport layer mechanism for firmware communication | |
US20190324803A1 (en) | Method, apparatus, and computer-readable medium for dynamic binding of tasks in a data exchange | |
WO2024037629A1 (zh) | 区块链的数据整合方法、装置、计算机设备及存储介质 | |
CN117742998B (zh) | 一种面向计费采集数据转发的高性能队列方法及系统 | |
CN114911632B (zh) | 一种进程间通信的控制方法和系统 | |
CN114531479A (zh) | 一种基于mqtt的通用数据采集系统 | |
CN113641760A (zh) | 数据同步方法及装置 | |
WO2015035838A1 (en) | Method and apparatus for collecting multimedia data | |
WO1997024664A1 (en) | System and method for transferring messages between application programs running in a distributed computing environment | |
CN118093225A (zh) | 订阅消息的传输方法及装置、存储介质及电子设备 | |
JP2002149619A (ja) | メッセージ・キュー管理方法 | |
CN116737407A (zh) | 一种数据处理方法及装置 | |
CN114281506A (zh) | 一种报文处理方法、装置、电子设备及存储介质 | |
CN116737408A (zh) | 一种消息处理方法及装置 | |
CN118140211A (zh) | 硬件加速器服务聚合 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |