一种多日志高并发消息队列处理方法及系统

文档序号:37274017发布日期:2024-03-12 21:06阅读:22来源:国知局
一种多日志高并发消息队列处理方法及系统

本发明属于计算机存储,更具体地,涉及一种多日志高并发消息队列处理方法及系统。


背景技术:

1、分布式消息队列(distributed message queue,简称消息队列)也称为消息中间件(messaging-oriented middleware,mom),是一种面向分布式系统的高并发异步消息传递模型,用于在不同的应用程序之间进行异步通信。它为用户和上层应用提供一组特定接口来存取消息,并把消息数据存储到一个或多个节点中,保证其可靠性和可扩展性。消息生产者可以向消息队列中发送消息,而消费者则可以从消息队列中获取消息并进行处理。这种通信方式与生产者和消费之间直接的点对点通信相比,具有更好的可伸缩性和容错性,因为消息处理的过程可以被分布到多个节点中。此外,在大规模的应用程序中,使用消息队列还可以实现应用解耦和系统水平扩展等功能。

2、传统分布式文件系统、云存储系统或键值存储系统等无法满足大规模流式数据的处理需求。电商企业因此采用了消息队列作为缓存,提供稳定的订单处理、实时搜索、数据分析、推荐等服务。google、alibaba、amazon、facebook和microsoft等云服务提供商均提供了各自的消息队列产品,为订单处理、证券交易、实时数据分析、数据迁移等场景提供了高效稳定的消息存储和转发服务。

3、作为微服务架构和分布式应用不可或缺的基础设施,消息队列在电商交易系统、流式数据处理、日志收集、分布式缓存领域广泛应用。在复杂系统中,不同组件之间通过发送、接收消息进行通信,消息队列在其中起到缓冲和解耦合的作用,提高了系统开发效率和稳定性。此外,消息队列还可以实现分布式系统中的异步通信、海量日志数据同步、分布式事务等功能,实现高性能、高可用、可伸缩和最终一致性架构。

4、按照消息传输模式,消息队列分为点对点通信模式和发布-订阅模式。在发布-订阅模式下,消息从生产者传递到任意数量的消费者。消息被传递到特定主题,然后传递给所有订阅了该主题的消费者。其中,主题是指一种特定的消息类型或者说业务类型。每个主题可以包含多个逻辑队列,每个逻辑队列下有多条消息,而每个逻辑队列仅能被一个消费者组内的消费者进行消费。其中,消费者组指具有相同业务逻辑的消费者,具有相同业务逻辑的生产者则被称为生产者组。生产者组将消息发布到特定的主题中,订阅者通过订阅该主题来接收对应的消息。主题模型实现了不同业务之间的区分和隔离,使得系统具有更好的可维护性和可扩展性。

5、在发布-订阅模式下,消息消费者会向消息处理节点订阅特定主题,消息消费者通常有被动通知(push)和主动拉取(pull)两种消息获取方式。在被动通知模式下,如果某一主题下有新消息到达,消息处理节点会将消息主动推送到消息消费者,此时消息消费的延迟更低但在多消费者情况下,消息处理节点的负担也随之增加。在主动拉取模式下,消息消费者会定期从消息处理节点拉取特定主题的消息,更适合需要高吞吐率的场景,同时允许消费者控制消息消息发送速率。

6、对主流消息队列如rocketmq的消息写过程进行写请求处理步骤分解分析后发现,由于消息写过程中存在一定的数据处理逻辑,单一消息写工作线程io请求提交速度有限,所以需要使用多个消息写工作线程提高请求处理速度。然而,rocketmq以仅追加的方式将消息写入全局唯一日志,在消息写过程中多个消息写工作线程会竞争同一日志文件写锁,锁资源竞争开销限制了写吞吐率,对高速固态盘写带宽的利用率较低。


技术实现思路

1、针对现有技术的以上缺陷或改进需求,本发明提供了一种多日志高并发消息队列处理方法及系统,用以解决现有技术所存在的对高速固态盘写带宽的利用率较低的技术问题。

2、为了实现上述目的,第一方面,本发明提供了一种多日志高并发消息队列处理方法,包括:

3、当生产者客户端发送的写请求到达消息处理节点后,由请求分发线程将请求分发至写请求处理线程池,并将写请求添加至消息写请求队列中;

4、由写请求处理线程池中的多个消息写工作线程并行的从消息写请求队列中获取对应的写请求,并将对应的写请求分配到多日志存储结构中的对应消息日志中,然后获取对应消息日志写锁并写入消息;

5、其中,多日志存储结构包括:多个消息日志;每个消息日志存在唯一写锁,且均包括:多个固定大小的消息日志文件,消息日志文件中存储有消息项,每个消息项中记录有消息体和消息元数据。

6、进一步优选地,消息写工作线程基于写请求中消息的主题将写请求分配到多日志存储结构中的对应消息日志中:将同一主题下的消息分配到相同的消息日志中。

7、进一步优选地,消息写工作线程根据写请求中消息的主题计算哈希值,并对消息日志数量取模,得到消息日志编号后,将写请求分配到该编号下的消息日志中。

8、进一步优选地,写入消息的方法,包括:

9、将消息的写入过程拆分为提交阶段和刷盘阶段;

10、在提交阶段执行消息提交操作:由消息写工作线程将消息写入消息日志的内存映射缓冲区;

11、在刷盘阶段执行刷盘动作,由刷盘线程将内存映射缓冲区内的消息数据持久化到硬盘;

12、其中,写入消息的模式包括:同步写模式和异步写模式;

13、在同步写模式下,为每个消息日志设置单独的刷盘线程;消息写工作线程完成其消息提交操作后,将刷盘请求加入刷盘请求队列,并唤醒对应的刷盘线程后等待;待对应的刷盘线程完成刷盘动作后,向生产者客户端返回写请求处理结果应答;

14、在异步写模式下,消息写工作线程完成其消息提交操作后即可向生产者客户端返回写请求处理结果应答。

15、进一步优选地,在同步写模式下,若内存映射缓冲区中需要刷盘的脏数据总长度小于预设长度,则由消息刷盘线程将刷盘动作推迟预设时间,若在预设时间段内有预设数量的刷盘请求到达,或新到的刷盘请求使脏数据总长度大于预设长度,则立即执行刷盘动作;否则,在预设时间结束后立即执行刷盘动作。

16、进一步优选地,在消息处理节点侧,在写请求到达时,由请求分发线程根据写请求中的消息长度计算写请求的消息负载因子,判断消息负载因子与当前消息写请求队列的写负载强度之和是否大于最大写负载强度,若是,则丢弃写请求,并向生产者客户端发送消息处理节点过载应答;否则,将写请求添加至消息写请求队列中;其中,当前消息写请求队列的写负载强度为当前消息写请求队列中所有写请求的消息负载因子之和;

17、与此同时,当异步发送模式下的生产者客户端在收到消息处理节点过载应答后,降低自身消息发送速率。

18、进一步优选地,异步发送模式下的生产者客户端在发送写请求之前,根据写请求中的消息长度计算消息负载因子,判断消息负载因子与当前已发送消息的写负载强度之和是否达到当前消息负载强度阈值,若是,则停止发送消息,直至消息负载因子与当前已发送消息的写负载强度之和小于当前消息负载强度阈值后,再发送写请求;否则,发送写请求;

19、其中,当前已发送消息的写负载强度为当前已发送消息的消息负载因子之和;

20、当异步发送模式下的生产者客户端在收到消息处理节点过载应答后,降低当前消息负载强度阈值;

21、当异步发送模式下的生产者客户端连续收到预设数量的消息写请求成功应答后,提高消息负载强度阈值。

22、进一步优选地,上述多日志存储结构使用主题-队列模型管理消息逻辑布局;每个主题下有多个逻辑队列,每个消息对应唯一的(主题,逻辑队列编号,逻辑队列偏移)三元组;

23、上述多日志存储结构还包括:消费队列文件和直接索引文件,用于存储消息索引数据;

24、消费队列文件按照消息在逻辑队列中的顺序存储消息消费索引项,消费索引项用于存储消息在逻辑队列中的位置;

25、直接索引文件用于记录一段时间内写入消息日志的消息的直接索引项的哈希表;哈希表的键为消息的主题键哈希值,值为消息的直接索引项,包括:消息在消息日志中的物理偏移、相对时间戳和后续索引序号;

26、消息日志文件名代表本文件第一个字节在整个消息日志中的物理偏移;消费队列文件名代表本文件第一条消息在逻辑队列中的序号;直接索引文件名代表本文件的创建时间戳。

27、进一步优选地,上述多日志高并发消息队列处理方法,还包括:

28、在消息处理节点启动过程中创建异常退出文件,并使用检查点文件定期持久化消费队列、直接索引以及消息日志的最后刷盘时间;

29、正常退出时,将所有消息刷盘,并完成消费队列和索引文件的持久化,最后删除异常退出文件;

30、在消息处理节点启动过程中,检查是否还存在异常退出文件,若存在,则判定上次程序退出异常,执行如下崩溃恢复操作:

31、对于每一个消息日志,获取该消息日志的直接索引刷盘时间戳、消费队列刷盘时间戳和消息日志刷盘时间戳,并记上述三个时间戳中的最小值为t,对该消息日志的消息日志文件按照文件名升序排序,得到消息日志文件列表,从消息日志文件列表最后一个消息日志文件开始反向遍历;

32、遍历过程中,对于每一个消息日志文件,读取消息日志文件中第一条消息,对比该消息的消息存储时间t与t的大小,若t小于t,则获取t时刻最后一条刷盘消息所在的消息日志文件f;否则,继续遍历下一个消息日志文件;

33、其中,在获取到消息日志文件f后,改变消息日志文件的遍历方向,从消息日志文件f开始依次尝试读取消息,并为每一条有效消息在消费队列文件和直接索引文件中构建索引,直至读取到一条无效消息,或读完后续所有消息日志文件,则完成该消息日志的崩溃恢复操作。

34、进一步优选地,上述多日志高并发消息队列处理方法,还包括:

35、当生产者客户端发送的读请求到达消息处理节点后,由请求分发线程将请求分发至读请求处理线程池,并将读请求添加至消息读请求队列中;

36、采用消息读请求工作线程从消息读请求队列中取出消息读请求,根据读请求中消息的主题,从对应的消费队列文件或者直接索引文件查找消息在消息日志中的位置,读取消息并返回给生产者客户端。

37、进一步优选地,上述多日志高并发消息队列处理方法,还包括:

38、采用消息备份线程处理消息备份请求队列中的消息备份请求:定期执行消息备份操作,将本机消息日志发送到备份服务器中;在消息备份请求队列中存在消息备份请求时,执行备份动作。

39、进一步优选地,上述多日志高并发消息队列处理方法,还包括:

40、采用元数据写线程在后台定期检查消息日志写入进度,当发现消息日志中存在新写入的消息时,从消息日志中读取消息并将消息信息写入消费队列文件和直接索引文件中。

41、第二方面,本发明提供了一种多日志高并发消息队列处理系统,包括:存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时执行本发明第一方面所提供的多日志高并发消息队列处理方法。

42、第三方面,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序被处理器运行时控制所述存储介质所在设备执行本发明第一方面所提供的多日志高并发消息队列处理方法。

43、总体而言,通过本发明所构思的以上技术方案,能够取得以下有益效果:

44、1、本发明提供了一种多日志高并发消息队列处理方法,采用多日志存储结构存储消息,多日志存储结构包括多个消息日志,每个消息日志存在唯一写锁,每个消息写工作线程向某个消息日志提交消息前需要获取对应消息日志的写锁,通过多日志结构为多个消息写工作线程提供了细粒度的写锁,降低了消息写工作线程之间的锁资源竞争,提高了消息写请求提交速度,可以更充分地利用高速固态盘的写带宽,提高了高速固态盘写带宽的利用率。

45、2、进一步地,本发明所提供的多日志高并发消息队列处理方法,考虑到多日志存储结构包括多个消息日志,需要将生产者发送的消息分配到不同的消息日志,从而将消息均匀地写到多个消息日志,而消费者客户端一般会持续消费某个主题下的消息,因此,本发明将同一主题下的消息分配到相同的消息日志中,从而提高了数据的局部性,进而提高了消息读速度。

46、3、进一步地,本发明所提供的多日志高并发消息队列处理方法,使用日志独立的二阶段写机制,将消息写过程拆分为提交和刷盘两阶段;在提交阶段,将消息写入内存映射缓冲区,由消息写工作线程负责;在刷盘阶段,将内存映射缓冲区的数据写入硬盘,由刷盘线程负责;不同阶段使用独立线程处理,从而使消息写入过程流水化,提高了消息的写入效率。

47、4、进一步地,本发明所提供的多日志高并发消息队列处理方法,在同步写模式下,将同一消息日志中的多个短消息聚合刷盘,从而减少小写请求数量,提高同步写模式下的短消息写入速度。

48、5、进一步地,本发明所提供的多日志高并发消息队列处理方法,根据消息处理节点当前写负载强度对写请求处理结果进行预测,当写负载强度过高时丢弃写请求并向生产者客户端发送过载信号。在生产者客户端,根据历史写请求处理结果控制自身消息发送速率,避免所有生产者的总消息发送速率超过消息处理节点处理能力;通过上述方法来控制生产者总消息发送速率,避免了生产者客户端异步发送消息场景下所存在的系统过载问题,提高了重负载场景下的写性能。

49、6、进一步地,本发明所提供的多日志高并发消息队列处理方法,在消息处理节点启动过程中,检查是否还存在异常退出文件,若存在,则判定上次程序退出异常,执行如下崩溃恢复操作,以避免断电等系统故障所导致的一致性错误。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1