Disruptor多topic问题

12-03-26 kuaiyuelaogong
看国外的很多介绍资料,以及官方资料,还有坛主翻译的关于disruptor资料都有一个图,就是将日志/序列化/等等各种event塞到了一个ringbuffer里边,我现在困惑的就是这点,一个ringbuffer是否应该放多个topic或者多个类型的event。

例如我现在的流程有两个:1 核心业务流程处理 (短小快速,并发量高) 2. 业务流程之后的日志处理


因为日志通常采用log4j等记录,同类型事件多线程是无意义的。为了记录日志不影响核心流程的处理速度,往往会把日志丢到另外一个异步环境处理,我以前用队列解耦就是这么干的,但是看了
这个图,你会发现里边有几种事件,里边也包括了日志event,这样做还能做到通过解耦来平衡环节压力吗?

我看了disruptor的processor风格,一个是workpool,就是均衡负载,多个handler同质化,同一个时间只会被一个handler处理,另外一个风格就是并发分支,同一个事件,所有的handler都有机会处理。
如果使用均衡负载,handler根据event类型走处理分支,日志event可能会吃掉所有的handler线程池资源,那就跟ringbuffer的目的背道而驰了,相当于没用,直接用线程池是一样的效果。

还是用不同的barrier?

我是不是有什么地方理解错了?还请各位理解disruptor的大侠给予指点^_^。

另外看这幅图:


这个又是多个disruptor了,呵呵,除了分布式造成了这种割裂以外,如果输入和输出/业务处理都在一台主机上,是否就会使用同一个disruptor了?呵呵。
disruptor解决的thread之间的数据共享,如果按照这种角度出发,程序的分布式与否不应该成为disruptor的个数的依据。

[该贴被kuaiyuelaogong于2012-03-26 15:31修改过]

1
alexwoo
2012-04-05 18:33
就你的这个问题我是这么理解的:

ringbuffer里的事件依次会被数个handler处理,比如说先是核心业务处理,接下来是日子处理。 那么就应该使用BatchEventProcessor+barrier而不是workpool.

比如说这个例子:


        int consumerCount=4;
        final SimpleEventHandler[] eventHandler = new SimpleEventHandler[consumerCount];
        final BatchEventProcessor<SimpleEvent>[] eventProcessors = new BatchEventProcessor[consumerCount];
        for (int i = 0; i < consumerCount; i++) {
            eventHandler[i] = new SimpleEventHandler();
            
            SequenceBarrier barrier = null;
            if (i > 0) {
                barrier = ringBuffer.newBarrier(eventProcessors[i - 1]
                        .getSequence());
            } else {
                barrier = ringBuffer.newBarrier();
            }
            eventProcessors[i] = new BatchEventProcessor<SimpleEvent>(
                    ringBuffer, barrier, eventHandler[i]);
        }
<p class="indent">


有4个Processor, Processors[1]必须在Processors[0]之后执行。依次类推。。

wenkuany
2012-12-06 13:58
我的理解是 日志event 不一定就在当前的线程里写入了,完全可以缓存起来或者异步处理,采用这种多消费者的模式,每个环节的处理时间不应该有太大的差异,否则就可能出现瓶颈

猜你喜欢