【Server】高性能的消息队列 (三)

本文介绍了一种高性能无锁消息队列的设计思路。通过将消息队列分为两个数组队列,一个负责消息写入,另一个专供消费。当消费队列的消息被全部消费后,两个队列进行指针交换,从而实现消息生产和消费过程中的无锁操作,显著提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,在为我的游戏服务器进行性能优化,而我在性能优化的过程中,首先是减少程序中锁的使用,一眼过去,发现消息队列是线程之前争锁之常地。虽然我们使用的是并发包里,性能高的并发队列(服务器是用java语言),虽然并发包在锁的设计上到了最优,采用细粒度加速,但是不可否认,在生成线程和消费线程之间的锁争用总是会消耗一定性能,降低效率。 
   说干就干,动手设计一个更高性能的消息队列。可是该如何动手呢?这时,我想起了N年前工厂上的生产线了,生成某个产品C是由原料进过生产线A和生成线B后生成的。生产线A专门组装C产品的A部分,生产线B专门装配C产品的B部分,同时B生产线的原料是A生成的半成品+其他来料。这时我灵光一闪。可以把A线比作生产线程,B比作消费线程。那么我的消息队列也可以这样设计,使性能提高一倍。 
   这时,我对设计这个队列有了初步方案: 
   
   在消息队列里,设计2个数组队列A[],B[],一个队列负责消息写入,另外一个队列供消息专门供消费。当消费队列的消息消费完毕,立即将消息写入的队列跟消息供应队列进行指针交换,使原来的消息写入队列变为消息供应队列,原来的消息供应队列变为消息写入队列,这样,我们的这个消息队列就变成了,消息生产和消息供应都在无锁的情况下进行,只是在指针交换的时候进行锁定一次。在有大量消息生产和消费的时候,性能明显提高。 

   这里是我初步的实现 
https://github.com/codeAping/DoubleQueue 

欢迎大家一起来改进和完善 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值