> 文章列表 > 记一次生产要我狗命的问题

记一次生产要我狗命的问题

记一次生产要我狗命的问题

问题起因:引入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逻辑核心数的场景中,推荐使用此策略
所以说他不适合队列很多的情况