最近,在为我的游戏服务器进行性能优化,而我在性能优化的过程中,首先是减少程序中锁的使用,一眼过去,发现消息队列是线程之前争锁之常地。虽然我们使用的是并发包里,性能高的并发队列(服务器是用java语言),虽然并发包在锁的设计上到了最优,采用细粒度加速,但是不可否认,在生成线程和消费线程之间的锁争用总是会消耗一定性能,降低效率。
说干就干,动手设计一个更高性能的消息队列。可是该如何动手呢?这时,我想起了N年前工厂上的生产线了,生成某个产品C是由原料进过生产线A和生成线B后生成的。生产线A专门组装C产品的A部分,生产线B专门装配C产品的B部分,同时B生产线的原料是A生成的半成品+其他来料。这时我灵光一闪。可以把A线比作生产线程,B比作消费线程。那么我的消息队列也可以这样设计,使性能提高一倍。
这时,我对设计这个队列有了初步方案:
在消息队列里,设计2个数组队列A[],B[],一个队列负责消息写入,另外一个队列供消息专门供消费。当消费队列的消息消费完毕,立即将消息写入的队列跟消息供应队列进行指针交换,使原来的消息写入队列变为消息供应队列,原来的消息供应队列变为消息写入队列,这样,我们的这个消息队列就变成了,消息生产和消息供应都在无锁的情况下进行,只是在指针交换的时候进行锁定一次。在有大量消息生产和消费的时候,性能明显提高。
这里是我初步的实现
https://github.com/codeAping/DoubleQueue
欢迎大家一起来改进和完善
分享到:
相关推荐
高性能高可靠消息队列架构设计.pdf
消息队列一般应用在广播通知、异步操作、数据复制。 为什么我们不用开源的消息队列? 我们开发的消息队列如何实现 “高可用”? 我们开发的消息队列如何实现 “高性能”?
#资源达人分享计划#
Apache RocketMQ高性能云原生消息队列架构.pdf
基于zookeeper+activemq+leveldb搭建 高性能 高可用的消息队列
CPU缓存架构详解&高性能内存队列Disruptor实战
为此,基于消息队列遥测传输( MQTT) 技术,提出一种消息推送系统,采用轻量的MQTT 协议实现消息推送,包括安全认证和多样化智能推送设计,既能保证系统安全,又能根据用户个性化需求和消息传递性能要求,智能选择...
统一配置中心 用于所有项目统一的配置集中管理,简化运维和项目部署,具备高灵活性,高性能,高稳定性,高及时性。 同时具备配置项的负载均衡和故障转移,从而实现项目的软性的负载均衡和故障转移能力。
作为中间件,消息队列是...所以消息队列可以解决应用解耦、异步消息、流量削锋等问题,是实现高性能、高可用、可伸缩和最终一致性架构中不可以或缺的一环。文档为市场上流行的消息队列以列表对比形式进行分析,比较全面
级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存 入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的...
1.高性能,基于netty实现数据通信+高效的kv数据库Leveldb存储,快的飞起! 2.支持多种消息类型,例如队列消息、主题消息、延时消息,还可以设置优先级。 3.系统体积小,整个系统才不到3M。 4.支持高并发。 ### 待...
NULL 博文链接:https://ainn2006.iteye.com/blog/1543466
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-...15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1).zip
缺点是当队列空间不足会进行扩容,扩容的主要实现是开辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的内存开销,在并发的环境中对性能的影响不可小视。当然在调用Q
MiniMQ:最小和高性能的消息队列
Memcached Go Queue, 简称mgq, 是一个用Go语言写的,基于memcached协议的消息队列。其父亲mcq是最早应用于weibo的基础消息中间件,有着高性能,解耦的优点,使得其广泛应用于微博
高性能队列模块源码,此队列支持任意数据类型,自动调整缓冲大小,保证高性能的同时不占用过多内存。队列本身不是线程安全的,不过我已经考虑到了线程安全的需求,Queue 类里有两个方法 Lock() 和 Unlock(),如果...
轻量级、分布式、高性能、消息可持久化、支持大量堆积消息(不受限于内存大小)、支持消费者集群、消费者流控、消息的监控支持
Kafka知识领域+消息队列技术关键词+安装、配置、使用、主题、分区、副本、消费者组、流处理、事件源存储、性能优化、安全性、集群部署内容关键词+构建实时数据管道、解耦服务、可靠消息传递、数据可靠性与容错性、...
Beanstalkd,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有...