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

问题起因:引入disruptor框架 简单理解就是生产消费者模式 用来支持高并发

先说问题和改正 再展开

问题:没有当时的截图了 直接描述吧 问题就是cpu占用过高 居高不下的那种
排查:就是看线程名字和占用的大概 再根据近期发布的东西 再根据本地自己拿cpu监控工具去看
本地跑 截图如下
记一次生产要我狗命的问题_第1张图片
这个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逻辑核心数的场景中,推荐使用此策略
所以说他不适合队列很多的情况

你可能感兴趣的:(java,jvm,开发语言)