Disruptor是一个低延迟(low-latency),高吞吐量(high-throughput)的事件发布订阅框架。通过Disruptor,可以在一个JVM中发布事件,和订阅事件。相对于Java中的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue),Disruptor的优点是性能更高。它采用了一种无锁的数据结构设计,利用环形数组(RingBuffer)来存放事件,通过对象复用减少垃圾回收进一步提高性能。
线上有一个接口最近频繁报警(tp99变高),通过监控报警系统定位到问题主要出现在日志打印环节。接口方法入参和出参都会打印"info"日志,我们采用的日志是logback。它默认的是同步打印日志,在日志报文过大时,磁盘IO耗时会变得更加明显。某个慢请求90%的处理时间都消耗在日志打印中。于是我们决定采用异步的方式打印日志。sl4j2日志框架支持异步的日志打印,改成异步日志打印之后接口性能报警消失。而sl4j2高性能的秘密就在于Disruptor。
设想一下,在一个JVM中当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发、线程安全的协调?很简单,用一个阻塞队列。 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费者都消费一次(这就不是一般队列,只消费一次的语义了),该怎么做? 这时仍然需要一个队列。但是:
总而言之,如果有多个生产者,多个消费者,并且同一条消息要给到所有的消费者都去处理一下,需要做到以上4点。这是不容易的。 LMAX Disruptor,正是这种场景下,满足以上4点要求的单机跨线程消息传递、分发的开源、高性能实现。