java disrupter_java – LMAX Disruptor – 什么决定批量大小?

我最近一直在学习LMAX Disruptor并且正在做一些实验.令我困惑的一件事是EventHandler的onEvent处理程序方法的endOfBatch参数.请考虑以下代码.首先,我称为Test1和Test1Worker的虚拟消息和消费者类:

public class Test1 {

}

public class Test1Worker implements EventHandler{

public void onEvent(Test1 event, long sequence, boolean endOfBatch) {

try{

Thread.sleep(500);

}

catch(Exception e){

e.printStackTrace();

}

System.out.println("Received message with sequence " + sequence + ". "

+ "EndOfBatch = " + endOfBatch);

}

}

请注意,我已经延迟了500毫秒,以替代一些现实世界的工作.我也在控制台中打印了序列号

然后我的驱动程序类(作为生产者)称为DisruptorTest:

public class DisruptorTest {

private static Disruptor bus1;

private static ExecutorService test1Workers;

public static void main(String[] args){

test1Workers = Executors.newFixedThreadPool(1);

bus1 = new Disruptor(new Test1Factory(), 8, test1Workers);

bus1.handleEventsWith(new Test1Worker());

RingBuffer buf1 = bus1.start();

for (int i = 0; i < 10; i++){

long a = System.currentTimeMillis();

long next = buf1.next();

long b = System.currentTimeMillis();

System.out.println("Delay for claiming slot " + i + " is "+ (b - a));

try {

Test1 message = buf1.get(next);

} catch (Exception e) {

e.printStackTrace();

} finally {

buf1.publish(next);

}

}

}

public static class Test1Factory implements EventFactory {

public Test1 newInstance() {

return new Test1();

}

}

}

在这里,在初始化所需的东西之后,我向RingBuffer(缓冲区大小8)提供10条消息,并试图监视一些事情 – 生产者声称RingBuffer中的下一个插槽的延迟以及带有序列号的消息在消费者方面,以及特定序列是否被视为批次结束.

现在,有趣的是,处理每条消息涉及500毫秒的延迟,这就是我得到的输出:

Delay for claiming slot 0 is 0

Delay for claiming slot 1 is 0

Delay for claiming slot 2 is 0

Delay for claiming slot 3 is 0

Delay for claiming slot 4 is 0

Delay for claiming slot 5 is 0

Delay for claiming slot 6 is 0

Delay for claiming slot 7 is 0

Received message with sequence 0. EndOfBatch = true

Delay for claiming slot 8 is 505

Received message with sequence 1. EndOfBatch = false

Received message with sequence 2. EndOfBatch = false

Received message with sequence 3. EndOfBatch = false

Received message with sequence 4. EndOfBatch = false

Received message with sequence 5. EndOfBatch = false

Received message with sequence 6. EndOfBatch = false

Received message with sequence 7. EndOfBatch = true

Delay for claiming slot 9 is 3519

Received message with sequence 8. EndOfBatch = true

Received message with sequence 9. EndOfBatch = true

但是,如果我删除500毫秒的等待时间,这就是我得到的:

Delay for claiming slot 0 is 0

Delay for claiming slot 1 is 0

Received message with sequence 0. EndOfBatch = true

Received message with sequence 1. EndOfBatch = true

Delay for claiming slot 2 is 0

Received message with sequence 2. EndOfBatch = true

Delay for claiming slot 3 is 0

Received message with sequence 3. EndOfBatch = true

Delay for claiming slot 4 is 0

Received message with sequence 4. EndOfBatch = true

Delay for claiming slot 5 is 0

Received message with sequence 5. EndOfBatch = true

Delay for claiming slot 6 is 0

Received message with sequence 6. EndOfBatch = true

Delay for claiming slot 7 is 0

Received message with sequence 7. EndOfBatch = true

Delay for claiming slot 8 is 1

Delay for claiming slot 9 is 0

Received message with sequence 8. EndOfBatch = false

Received message with sequence 9. EndOfBatch = true

因此,看起来某个消息是否被认为是批处理结束(即,批处理的大小)是否受到消费者的消息处理延迟的影响.可能我在这里很傻,但它应该是怎么回事?这背后的原因是什么?一般来说,什么决定了批量?提前致谢.如果我的问题中的任何内容都不清楚,请告诉我.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值