disruptor (破坏者,分裂者) 并发框架

身处其外辩证思考


disruptor:破坏者,分裂者
	参考:https://ifeve.com/disruptor/
	1、性能极强的异步消息处理框架。线程间通信高效低延时的内存消息组件。LMAX架构可以获得每秒600万订单,1微秒的延迟获得吞吐量为100K+。(log4j、ActiveMQ中扩展使用了该框架)

	2、为什么不用队列
		队列的瓶颈点:队列头,队列尾存在争抢的情况。
		disruptor:使用无锁的方式,提升性能。

	3、使用场景:
		两个独立的线程之间需要传递数据。
		
	4、核心概念
		1、Ring Buffer
			环形缓冲区。
		2、sequence
		    序列
		3、sequencer 
		    计数器
		4、Sequence Barrier
			序列屏障
		5、Event
			事件
		6、EventHandler
		7、EventProcessor
		8、Wait strategy
			等待策略
		9、Producer
			生产者


what?(是什么)
	1、特性
		1、在一个线程中每秒处理6百万订单。
			(业务逻辑处理器完全运行在内存中,使用事件源驱动方式)
		2、能够在无锁的情况下实现网络的Queue并发。	
			(线程之间信息交换的方式)

	2、Disruptor 为什么这么快(锁的缺点)
		1、单线程与多线程的利弊(多线程存在资源争抢问题)
			1、单线程自增5亿次,耗时10秒。
			2、单线程加锁自增5亿次,耗时70秒。(比第一步多七倍)
			3、增加一个线程,自增5亿次。耗时140秒。(比第二步多一倍)
	
		2、单线程生产者的好处:序列唯一,不存在争抢问题。所以速度快。
		
		3、队列的弊端
			多线程环境,生产者争抢队列尾指针;消费者争抢队列头指针。
		
		4、快的秘诀:分离竞争点,将所有的争抢都赋予序列号。
		
		5、Disruptor 总结
			1、没有竞争 = 没有锁 = 非常快
			2、所有访问者都记录自己的序号,允许多个生产者与多个消费者共享相同的数据。
			3、在每个对象中都能跟踪序列号(RingBuffer,Claim Strategy,生产者和消费者),加上神奇的Cache line padding,彻底搞定伪共享和非预期的竞争。
	
	3、Disruptor 为什么这么快(神奇的缓存行填充 , cache line padding)
		1、缓存行
			缓存行:缓存是由缓存行组成的,通常是64字节。
				如果你访问一个long数组,当其中一个值被加载到缓存时,会额外加载另外7个值。因此你能非常快速的遍历数组。
			问题:(伪共享)
				假设数据为: ["head","tail","a","b","c","d","e","f"]
				步骤一:线程1:读取了"head"数据,由于缓存行的原因,会将数据全部读取到线程缓存中。
				步骤二:线程2:需要修改"tail"的数据,加载数据到线程缓存中,修改"tail"。再写回主缓存。
				步骤三:线程1:再就要吧"tail"做失效处理,再读取一遍主缓存(以“缓存行”为单位读取)。
				
		2、缓存行填充(解决伪共享)
			通过增加补全来却表RingBuffer的序列号不会和其它线程的数据存在同一个缓存行中。
			在Entry类中,多个字段会缓存到一个缓存行中,因此在高并发的时候,你需要确保不会出现伪共享。
			public long p1,p2,p3,p4,p5,p6,p7,p8; //cache line padding
			
		3、伪共享
			什么是伪共享:缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。
				当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享
	
	4、原理
		1、RingBuffer
			核心:Disruptor对RingBuffer的访问控制策略
			RingBuffer是什么:环形缓存,仅维护一个指向下一个可用数据的指针。
		2、RingBuffer 读取
		3、RingBuffer 写入
			1、需要判断是否覆盖写入。队列判断的依据是,头指针和尾指针是否重叠。RingBuffer判断的依据是,通过ProducerBarrier保存的消费者消费到哪个节点来判断。
		
		

how?(怎么用)

	google: spingboot disruptor 


why?(为什么)

    待补充……

  

posted @ 2020-04-20 18:30  陈标  阅读(1012)  评论(0编辑  收藏  举报