先说一下disrutor和协程的实现。然后介绍服务器具体分析,以及迭代过程,项目困难,学到东西,压测数据等。最后结合数据中心项目。
实现思路
Disruptor的实现思路就是每一个数据都会有一个唯一自增的序号,用一个环形队列来存储数据,写入数据的时候先分配出可写的空间序号,然后再慢慢写数据,等到数据写完后再更新一下可读区域。这样因为每个线程独占一块空间写入数据,就不会有线程同步问题,唯一需要同步的地方是分配写入空间和更新可读区域。但是这两个操作都是非常简单的加操作,加锁太浪费,所以Disruptor直接使用原子变量加自旋等待来同步,获取极高的性能。
读取的时候则是先声明想读取的序号。然后就一直等待直到写入数据后更新的可读序号赶上想读取的序号。等待可以是CPU自旋等待或者放弃CPU时间片或者睡眠或者使用条件变量唤醒。此时可读序号之前的数据都是可读的,而读操作也不需要加锁。又可以获得极高的性能。读取后更新一下已读取序号,这样写入着就可以继续重复利用这块空间了。
当更新的可读序号大于想读取的序号的时候更可以批量的一次性读取,免于每次更新已读取序号浪费性能。
传统消息队列的缺点?
原始的单队列缓存,每个生产者或消费者对队列操作都需要加锁,因为push和pop都是对队列的写操作。队列每一个元素pop实际都delete了那个节点,对GC机制造成负担。
锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。
CAS: