最近,我阅读了Dubbo的一些源代码,发现线程池的某些转换非常好,并阅读了为什么上帝和其他大兄弟的技术文章,并决定总结Dubbo的消费者 - 端线模型。
参考文章
线程模型上的Dubbo 2.7.5的优化
Dubbo发布了里程碑版本,性能提高了30%
Dubbo消费者线程模型
Dubbo版本
目前在GitHub上,Dubbo的重要版本如下所示。我主要分析2.6.x和主(2.7.x)的两个版本。
照片地址:https://github.com/apache/dubbo/issues/890
当客户端调用某个服务时,请致电DubboinVoker.DoInvoke启动远程呼叫。
其中,将选择某个交换器以进行远程发送处理逻辑。
默认值是共享连接。
在headrexchangechannel中创建一个defaultfuture对象,然后返回
最后,将特定的网络传输框架发送到发送。这是NetTyclient,传输通道是Niosocketchannel。
发送的逻辑未使用Dubbo线程池,该池最终由IO线程池处理。
服务器接收处理完成后,请回复客户端。
NetTyclinewhandler.ChannelRead方法来监视服务器的恢复信息。
最终在AllChannelHandler.Received方法中获取执行人员服务,将任务封装为channeleventerableable对象,然后交给线程池以对其进行处理。
当客户端服务引用初始化客户端连接对象时,将创建ExecuroEservice。默认值是Cachedthreadpool,最终将存储在ConcurRenthAshMap中。关键是端口和值作为线程池。
在文章“ Dubbo的里程碑版本,性能增加了30%”中,如下所述:
一些大兄弟在Github进行了分析和建议,我直接将其移动。
报价地址:https://github.com/apache/dubbo/issues/890
报价地址:https://github.com/apache/dubbo/issues/7054
1.请求业务线程以获取未来实例。
2.在调用future.get()之前,请致电ThreadlessExecutor.Wait()。等待将等待业务线程等待阻止队列,直到元素在队列中添加为止。
3.返回业务数据后,生成可运行的任务并将其放入ThreadlessExecutor队列中。
4.取出任务业务线程并在此线程中执行它:DEE - 序列业务数据并设置为未来。
5.业务线程获得结果并直接返回。
通过这种方式,与旧的线程池模型相比,业务线程本身负责监视和解析结果,从而消除了其他消费线线程池开销。
当执行人员服务获得以前的版本时,它是在WrawpedChannelHandler中创建的。现在有所不同。Dubboinvoer在发送时将获得无线无线Executor,并将其分配给DefaultFuture。这有点特别,但不是线程池。
在处理AllChannelhander中的接收信息时,将先前的版本放置在已获得的线程池中进行处理,现在将其更改为ThreadlessExecutor进行处理。
DubboinVoker.Doinvoke获得了ThreadlessExecutor。
ThreadlessExecutor中有一个共享Executor,这是一个真实的线程池。
共享Execurtor的收购已移交给通过SPI机制获得的默认executorpositository。
当服务引用初始化客户端连接时,创建了共享Executor的创建。
将在同步方法下创建无线无线executor
在端口维度中创建了ThreadlessExecutor机制中的共享Executor。在21年中,港口维度被取消并直接在全球范围内共享。
这个变化描述了GitHub中的这种变化
地址:https://github.com/apache/dubbo/pull/7109
在HeadereXchangeChannel中,将创建DefaultFuture,分配了ThreadlessExecutor。
ThreadlessExecutor在哪里特别称呼它?
异步转换在异步转换也是默认的。
同时致电,也就是说,当结果未返回时,它将被阻止,直到结果返回。
先前的方法是直接调用alterableFuture.get()方法以阻止和等待。
引入无线无线电话后,障碍物等待方法更改了,特别是在Waitanddrain方法中。
在WaitandDrain中,您将调用linkedblockingqueue.take获取任务。如果没有,它将阻止并等待。
当您获得它时,您将使用同步锁定和执行任务。
RPC打电话以绑定无线电系。任务完成后,它将更新完成的状态以进行调整,并且不会再次执行。
什么时候将任务放在队列上?
当消费者监狱听到服务器返回的消息时,它将在AllChannelHandler.Received中分发任务。
现在获取ThreadlessExecutor并调用执行方法以进行分发任务。
将运行的可运行添加到上面提到的阻塞队列。
目前,上面阻塞的线程被唤醒并继续处理以下逻辑。
将等待状态更新为false,然后调用可运行的方法来执行任务。
最终更新完成状态以进行调查。
何时可以使用无线电话中的sharedExecutor?
包装器中有这样的段落
1.使用ThreadlessExceutor,又名。直接委托对倡议发起呼叫的回调2。使用共享Executor执行回调。
在正常情况下,RPC服务器回调由ThreadlessExecutor处理。每个RPC呼叫都会创建一个新的ThredlessExecutor。
当在以下内容中处理某些回调时,将使用threadlessexecutor中的共享Executor。
共享Executor也将在另一个地方使用。当包装ChannelHandler获得执行人员服务时,
一个典型的场景是等待超时。服务器将结果传输到客户端后,将使用共享Executor,因为客户端具有定时任务来检测其是否已过时。
原始:https://juejin.cn/post/7098207957376040991