问题起因:引入disruptor框架 简单理解就是生产消费者模式 用来支持高并发
先说问题和改正 再展开
问题:没有当时的截图了 直接描述吧 问题就是cpu占用过高 居高不下的那种
排查:就是看线程名字和占用的大概 再根据近期发布的东西 再根据本地自己拿cpu监控工具去看
本地跑 截图如下
这个sequence 会特别的多
改正
//这事错误的
Disruptor<LongEvent> disruptor2 = new Disruptor<LongEvent>(eventFactory, ringBufferSize, executor, ProducerType.SINGLE, new YieldingWaitStrategy());
//这事正确的
Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(eventFactory, ringBufferSize, new LoggerThreadFactory());
底层源码
//先看错误的
public static <E> RingBuffer<E> create(
ProducerType producerType,
EventFactory<E> factory,
int bufferSize,
WaitStrategy waitStrategy)
{
switch (producerType)
{
case SINGLE:
return createSingleProducer(factory, bufferSize, waitStrategy);
case MULTI:
return createMultiProducer(factory, bufferSize, waitStrategy);
default:
throw new IllegalStateException(producerType.toString());
}
}
public static <E> RingBuffer<E> createSingleProducer(
EventFactory<E> factory,
int bufferSize,
WaitStrategy waitStrategy)
{
SingleProducerSequencer sequencer = new SingleProducerSequencer(bufferSize, waitStrategy);
return new RingBuffer<E>(factory, sequencer);
}
正确的
public static <E> RingBuffer<E> createMultiProducer(EventFactory<E> factory, int bufferSize)
{
return createMultiProducer(factory, bufferSize, new BlockingWaitStrategy());
}
这两个其实几乎没有什么区别 只是等待策略不一样
所以下面重点解释 BlockingWaitStrategy和YieldingWaitStrategy的区别
YieldingWaitStrategy 的性能是最好的,适合用于低延迟的系统。在要求极高性能且事件处理线数小于CPU逻辑核心数的场景中,推荐使用此策略
所以说他不适合队列很多的情况