banq
2013-11-22 16:08
2013-11-22 15:43 "@tecentID9347F"的内容
如果并发量比较少,disruptor 的优势没有启用多个线程去跑任务消耗的时间快! ...

呵呵,你没有仔细看我推荐给你的文章,多个线程跑任务如果写同一个资源,有争夺,必须用锁或乐观锁等堵塞方法,所以,无论并发多少,当然还是非堵塞的单线程写比多线程写快了(特别是多核情况,一个线程一个CPU,其他CPU并行运行其他线程的概率就大很多),性能体现在吞吐量和延迟两个指标上,都要好,否则Node.js那么热不是没有原因。

[该贴被banq于2013-11-22 16:09修改过]

sinaID52007
2014-03-09 17:15
英文网站的帮助文档说得很清楚了,如果要多个消费者,只有一个来处理一个事件,则给每个消费者线程一个序列号,当消费时,判断是否是自己的菜即可。

private final long ordinal; //当前消费线程的编号,需要指定

private final long numberOfConsumers; //总共多少个消费者

if ((sequence % numberOfConsumers) == ordinal) {

//这是我的菜,开始业务处理

pym
2019-01-03 11:40
只需要一个EventHandler,在EventHandler中构建自己的线程组,

然后将Event丢到线程组中消费,就可以实现多线程消费Event了。

不知道是否符合楼主需求。

sinaID79041
2020-03-05 15:36
感觉那么多人的回复都没理解楼主的意思啊... 

假设Event数据是手机号码,SMSEventHandler中的逻辑就是给手机号码发短信, 

生产者生产了10000个手机号, 楼主想要通过new出2多个SMSEventHandler去并行的消费短信,但是结果确实每个手机发送了2次. 

disruptor.handleWith(new SMSEventHandler(), new SMSEventHandler()) 这种结果会让这10000个手机每个都发了2次短信!!!!

楼主想的是多个EventHandler一起去抢数据消费!! 这种场景不要用EventHanler

Disruptor提供了WorkPool和WorkerHandler<T>的,你就不要实现EventHandler了, 而是去实现WorkerHandler

WorkerHandler<T> handlers = new WorkHandler[16];

然后传进去

public final EventHandlerGroup<T> handleEventsWithWorkerPool(final WorkHandler<T>... workHandlers)

那么 将会有16个消费者线程去消费这10000条短信!

 

sinaID79041
2020-03-05 15:44
消费者不要实现EventHandler 而是去实现WorkHandler

然后new一个WorkerHandler数组

disruptor支持WorkPool的

handleEventsWithWorkerPool(final WorkHandler<T>... workHandlers)

猜你喜欢
4Go 上一页 1 2 3 4