当前位置: 首页 > 网络应用技术

Dubbo消费者最终线程模型转换

时间:2023-03-08 11:07:24 网络应用技术

  最近,我阅读了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