浅谈Dubbo的异步调用

article/2023/6/4 16:09:33

之前简单写了一下dubbo线程模型,提到了Dubbo底层是基于NIO的Netty框架实现的,通过IO线程池和Work线程池实现了请求和业务处理之间的异步从而提升性能。

这篇文章要写的是Dubbo对于消费端调用和服务端接口业务逻辑处理的异步,在2.7版本中Dubbo实现了基于CompletableFuture的异步支持。

Dubbo消费端实现

Dubbo调用的实现——DubboInvoker

其实无论是否是异步调用,Dubbo消费者底层都是会使用CompletableFuture实现对服务端接口的异步调用。

那为什么我们开发的时候默认都是阻塞调用呢?下面的AsyncToSyncInvoker是关键

3138045ebeb3443a94209746902c0200.png

 Dubbo异步调用实现——AsyncToSyncInvoker

0cb056337fff4d28b0b8cfb105ff3e32.png

  • 如果开启了异步调用Dubbo底层代码中会直接调用CompletableFuture.get()方法阻塞当前调用线程等待结果返回。
  • 不开启异步调用时,并没有阻塞调用get方法而是直接返回异步结果,后面就需要手动调用Future.get()方法获取结果。

如何使用异步调用

在@DubboReference注解中配置async=true即可,该属性默认为false。开启异步后调用Dubbo接口服务时,服务会立刻返回结果,但是结果为null。我们需要通过RpcContext获取到该服务调用的CompletableFuture实例,然后在需要使用结果时显示调用CompletableFuture.get()方法阻塞等待获取真正的结果。

需要注意,在调用接口后立刻获取该接口CompletableFuture,因为如果后续还有异步调用,该Future会被覆盖

@DubboReference(async = true)
private EOrderFacade eOrderFacade;public void test() throws InterruptedException {Result<OOrder> result  = eOrderFacade.getOrder(GetOrderParam.builder().orderId(String.valueOf(8095950037325722953l)).build());CompletableFuture<Result<OOrder>> future = RpcContext.getContext().getCompletableFuture();Result<OOrder> realResult = future.get();
}

Dubbo服务端异步

服务端异步为用户提供了一种解决ThreadPool Full的方案,简单说只有在当我们的服务会因为大量请求发生IO阻塞导致ThreadPool Full的情况下使用服务端接口异步才有用。但其实对于Dubbo这底层种基于Event-Driven实现的框架而言本身请求和业务执行就是非阻塞的纯异步方式,所以盲目使用服务端异步反而可能变成画蛇添足,毕竟引入额外的业务线程池后又多了两次线程上下文的切换。


当然,如果我们的系统真的发生了ThreadPool Full的情况,经过分析后判断发生瓶颈的不是CPU,那么可以选择直接调高Dubbo worker的线程数目,或者可以尝试对耗时比较高的接口采用服务端异步来提升性能。

 

 

 

http://www.ngui.cc/article/show-1007570.html

相关文章

1650_MIT 6.828 open函数的简单梳理

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 一个shell的例程分析了很长时间&#xff0c;里面的基础知识一层嵌套一层。不过&#xff0c;这也是补充基本知识的很好的机会。既然自己日常接触的更多的还是这种通…

C++ 15 string容器

目录 一、string容器 1.1 简介 1.2 构造函数 1.3 赋值操作 1.4 字符串拼接 1.5 字符串查找和替换 1.6 字符串比较 1.7 字符串存取 1.8 字符串插入和删除 1.9 子串获取 一、string容器 1.1 简介 ① string是C风格的字符串&#xff0c;而string本质上是一个类。 ② s…

TryHackMe-Sustah(boot2root)

Sustah 开发人员在他们的游戏中添加了反作弊措施。你是 能否突破限制以访问其内部 CMS&#xff1f; 端口扫描 循例 nmap Web枚举 80端口没啥东西&#xff0c;看一下8085端口 gobuster扫一下 /ping似乎没什么东西 回来home&#xff0c;看看burp 使用bash生成数字字典 使用ff…

【mongodb 基础2】Install MongoDB Community Edition on macOS

文章目录一. 安装准备Install Xcode Command-Line ToolsInstall Homebrew二. Installing MongoDB 6.0 Community Edition1. 下载MongoDB Homebrew 组件包2. 更新组件包3. 安装MongoDBTo install MongoDB三. 安装后包含的组件四. Run&stop MongoDB1. 作为macOS服务的方式运行…

计算机二级考试(C++)复习

文章目录基础知识部分C知识点部分C流操作基础知识部分 指令周期&#xff1a; 一般把计算机完成一条指令所花费的时间称为一个指令周期。指令周期越短&#xff0c;指令执行就越快。 顺序程序&#xff1a; 顺序程序具有顺序性、封闭性和可再现性的特点&#xff0c;使得程序设…

用 Java 演奏千千阙歌是什么体验?

JFugue简介 ​JFugue 是一个开放源代码编程库&#xff0c;它允许人们使用 Java 编程语言来编程音乐&#xff0c;而无需 MIDI 的复杂性。它由 David Koelle 于 2002 年首次发布。当前版本是 JFugue 5.0&#xff0c;已于 2015 年 3 月发布。Brian Eubanks 将 JFugue 描述为 “对于…

一个看起来非常科幻的人脸识别接口与其实现逻辑,用于二次开发

前言看起来非常高端的人脸识别接口&#xff0c;简单的进行二次开发就可以衍生为人脸识别考勤系统、人脸识别安全系统等等&#xff1b;展厅以及实现逻辑启动界面点击“是”&#xff1a;人脸已经录入数据库&#xff0c;识别失败弹出Warning可能因为误判&#xff0c;重新识别&…

Unity即时战略/塔防项目实战(一)——构造网格建造系统

Unity即时战略/塔防项目实战&#xff08;一&#xff09;—— 构造网格建造系统 效果展示 Unity RTS游戏网格建造系统实现原理 地形和格子划分&#xff0c;建造系统BuildManager构建 地形最终需要划分成一个一个的小方格&#xff0c;首先定义一下小方格&#xff1a; private…

2022(一等奖)D678基于改进结构函数法的大气气溶胶遥感反演

作品介绍 1 应用背景 大气气溶胶是大气中重要的成分之一&#xff0c;是悬浮于大气中的固体和液体微粒与它们的气体载体共同组成的多相体系&#xff0c;其尺度大约在10-3到102 μm之间。大气气溶胶的特性对空气质量具有良好的指示作用&#xff0c;气溶胶的研究对空气质量的监测…

北邮22信通:(7)实验1 题目四:一元多项式(节省内存版)

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章&#xff1a; 北邮22信通&#xff1a;&#xff08;6&#xff09;实验1 题目三 &#xff1a;通讯录管理_青山如墨雨如画的博客-CSDN博客 下一篇文…