@Override
    public <R, M> PipelineFuture<R> invoke(InboundMessageEvent<M> event, long timeoutMillis) {
        PipelineFuture<R> future = DefaultPipelineFuture.with(event.getInvokeId(), timeoutMillis);
        head.fireInbound(event);
        return future;
    }
Most of the code references the pipeline design of
<a href="https://github.com/netty/netty">Netty</a>.

@author jiachun.fjc
jraft-rheakv/rheakv-core/src/main/java/com/alipay/sofa/jraft/rhea/util/pipeline/DefaultPipeline.java