Andy  
一个快乐的码农,专注于NET平台技术(WPF/WCF/EF....)

Disruptor是一个线程间通信的框架,即在多线程间共享数据,由lamx公司开发的可信消息传递架构的一部分,以便用于非常快速的方法来在多组件之间传递数据。

 

很多(并行)架构里,普遍使用队列来共享数据(例如传递消息),这种架构允许生产线程在消费线程处理不过来的情况下,还可以继续后面的工作,队列在其中的作用就是做为消息的缓冲区,生产者和消费者通过队列来处理各个消息

{ 生产者 } -----[消息队列] ----{ 消费者}

生产者publish到队列,消费者负责从队列中消费"消息"

disruptor类似消息队列,生产者和消费者通过disruptor传递数据,在disruptor里面保存消息的数据结构是环状缓冲区,,生产线程将消息放入环状缓冲区中,然后消费线程从缓冲区中读取消息,类似

{ 生产者 } ---- [RingBUffer] ----{ 消费则 }

RingBuffer里每个元素都有一个序列号来索引,RingBuffer维护当前最新放置的元素的序列号,这个序列号一直递增.

Disruptor的关键在于无锁编程,不想其他并发为了保证数据的安全和完整性玩玩在读写操作时候会对当前操作进行加锁控制,disruptor  是通过打你写线程的方式实现的,即一块数据永远只有一个线程写入,通过遵循这个编程原则避免使用昂贵的同步锁或者CAS操作

因为RingBUffer规避了锁,而且每个EventProcessor维护自己的序列号。

 

关于disruptor的相关可以参考http://www.oraclejavamagazine-digital.com/javamagazine/20120304/?pg=56&pm=1&u1=friend#pg56

中文参考:http://www.cnblogs.com/killmyday/archive/2012/12/02/2798218.html

这里给出一个简单的一个简单的应用;

    class Program {
        private static readonly int _ringSize = 8;
        static void Main(string[] args) {
            var dis = new Disruptor.Dsl.Disruptor<UserEntry>(()=>new UserEntry(),_ringSize,TaskScheduler.Default);
            dis.HandleEventsWith(new UserRegisterEventProcessor());//消息读取

            var ringbuffer = dis.Start();
            //获取下一个序列号,写入空闲槽,并发布序列号
            for (int i = 0; i < _ringSize; i++) {
                long seqNo = ringbuffer.Next();
                UserEntry ue = ringbuffer[seqNo];
                ue.Name = "andy";
                ue.Password = "password-andy";
                ue.Email = "email@yahoo.com";
                ringbuffer.Publish(seqNo); //发布
                Console.WriteLine("Publish Number:" + seqNo.ToString());
            }


            Console.ReadKey(true);
        }
    }

    /// <summary>
    /// 用户数据
    /// </summary>
    public class UserEntry {
        public string Name { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
        public UserEntry() { }
    }

    /// <summary>
    /// 数据处理
    /// </summary>
    public class UserRegisterEventProcessor : IEventHandler<UserEntry> {
        public void OnNext(UserEntry data, long sequence, bool endOfBatch) {
            string str = "NewUser:\n" + "Name:" + data.Name + "\nPassword:" + data.Password + "\nEmail:" + data.Email;
            Console.WriteLine(str);
            Console.WriteLine("");
        }
    }

  输出结果:

posted on 2013-06-27 00:08  mrkrcl  阅读(1099)  评论(0)    收藏  举报