论文部分内容阅读
在分布式环境中,消息队列的引入可有效地解决不同子系统之间的通信问题,同时降低各系统之间的耦合度,保证消息的异步消费和流量削峰。现有的消息队列将消息存放在内存或磁盘中,通过以太网传输数据,无法同时兼顾消息持久化和高吞吐量。近年来出现的新型存储与网络技术带来了突破此困境的机遇。一方面,新型的非易失存储器(Non-Volatile Memory,NVM)具有内存级的读写速度和可按字节寻址等优点;另一方面,远程内存直接存取技术(Remote Direct Memmory Access,RDMA)可以直接读写远端内存,不需要占用远端的CPU。本文从消息的持久化存储和消息的传输机制两方面进行优化,利用NVM和RDMA的特性,提出兼顾消息持久化和高吞吐量的分布式消息队列FlashQ,在保证消息可靠交付的同时,实现高吞吐量和低时延的消息传输。本文的主要贡献如下:(1)提出基于NVM的高性能消息存储技术。现有的消息队列大都将消息保存在基于磁盘等块设备的文件系统中实现消息的持久化保存,存取消息需要经过复杂的I/O软件栈。FlashQ利用NVM的特性,通过进程的虚拟地址访问消息文件,避免慢速I/O软件栈。此外,FlashQ将消息元数据映射在进程的虚拟地址空间,实现对消息的快速随机定位。(2)提出基于RDMA单边操作的快速消息无锁传输机制。通过RDMA WRITE、RDMA READ单边操作直接存取远端消息数据,无需远端CPU的参与,实现高吞吐量、低时延的消息传输。本文通过将Topic划分为多个Partition的分区机制,避免消息发布流程中远程写入消息冲突,实现远程写入消息的无锁化。针对远程消息写入流程,本文提出基于消息生产速度和传输速度的自适应消息批处理策略,降低传输时延,提高传输带宽。(3)提出基于生产时间的消息快速索引机制。FlashQ设计了基于消息生产时间的消息索引机制,通过建立多精确度的分层索引结构以及检索机制,快速定位到每秒生产的消息,从而提高消息回溯的效率。(4)设计系统容灾机制和负载均衡策略保证FlashQ的高可用性。针对系统容灾机制,FlashQ对所有消息文件进行冗余备份,在服务器发生单点故障时快速恢复。针对负载均衡策略,FlashQ将各Topic Partition尽量均匀的分布在不同的消息服务器上,避免单机存储空间不足,同时避免由于单机连接数量过多争夺带宽而引起的传输性能下降。最后,基于提出的设计,本文在Linux环境中实现了分布式消息队列FlashQ,并设计实现了消息生产、消费的测试工具进行验证实验。实验结果表明,FlashQ在传输常用的长度为1KB的消息时,单Topic Partition发布消息的吞吐量接近69万条/秒,是Qpid(RDMA)的6.4倍,是Kafka的7.5倍;连续生产1000条消息时,平均发布延迟仅13微秒左右,是相同环境下Qpid(RDMA)的1/20左右,Kafka的1/1400左右;以推模式消费时,吞吐量接近69万条/秒,是同样采用推模式的Qpid(RDMA)的6.4倍;以拉模式消费时,在每次只拉取一条消息的情况下,吞吐量达到近16万条/秒,是Kafka的近4倍。