dubbo协议与triple协议的对比

分别使用dubbo协议和triple协议,按照官方文档搭建Demo。
两个流程对比下来发现,dubbo协议搭建起来比较简单直接,定义好接口,实现类,然后启动provider和consumer就完事了。而triple协议则需要先定义proto文件
在这里插入图片描述
然后增加maven编译插件,在maven编译时生成对应的接口类Greeter,POJO对象HelloReply、HelloRequest以及一些其他的辅助类,用于后续定义接口实现时继承使用。

生成好之后,需要导出的接口的实现需要继承自生成的DubboxxxTriple类
在这里插入图片描述
之所以要使用生成的类,是为了完成Java与proto的互相转换。

后续的重点分析点在于

  1. triple协议相比于dubbo协议多了哪些特性和优势
  2. 使用这两种协议发起rpc请求的流程和接受到rpc请求的处理有哪些流程上的不同

目前已知:tripple协议兼容http2.0和grpc,更适用于云原生;可以跨语言、跨端跨平台进行调用;可以流式处理数据,适用于直播等大数据包场景;可以使用protobuf进行编解码;

Dubbo3 triple流式编程示例
https://developer.aliyun.com/article/1097681

流式编程的应用场景:
在一些大文件传输、直播等应用场景中,consumer 或 provider 需要跟对端进行大量数据的传输,由于这些情况下的数据量是非常大的,因此是没有办法可以在一个RPC 的数据包中进行传输,因此对于这些数据包我们需要对数据包进行分片之后,通过多次 RPC 调用进行传输,如果我们对这些已经拆分了的 RPC 数据包进行并行传输,那么到对端后相关的数据包是无序的,需要对接收到的数据进行排序拼接,相关的逻辑会非常复杂。但如果我们对拆分了的 RPC 数据包进行串行传输,那么对应的网络传输 RTT 与数据处理的时延会是非常大的。
为了解决以上的问题,并且为了大量数据的传输以流水线方式在 consumer 与provider 之间传输,因此 Streaming RPC 的模型应运而生。
通过 Triple 协议的 Streaming RPC 方式,会在 consumer 跟 provider 之间建立多条用户态的长连接,Stream。同一个 TCP 连接之上能同时存在多个 Stream,其中每条 Stream 都有 StreamId 进行标识,对于一条 Stream 上的数据包会以顺序方式读写。

我理解流式调用不再是传统的消费者和提供者的短暂的、单向通信,而是消费者和提供者之间建立的持久的、双向通信

triple多语言兼容原理:proto作为媒介,定义接口和参数。
triple兼容grpc原理:header里面包含所有grpc的header

此外,dubbo 协议在线程模型上比较丰富,而triple则比较单一。详见
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/threading-model/provider/

文档中可见,dubbo对消费者的线程模型进行了一次优化,主要是降低IO线程的开销,将IO线程做的一些事情交给业务线程。

服务端的线程模型则比较多,有五种。其实我比较关心的点在于,dubbo这5种线程模型,AllDispatcher、DirectDispatcher、MessageOnlyDispatcher、ExecutionDispatcher、ConnectionOrderedDispatcher,他们有何选型上的考量。据我观察,其实完成一次rpc通信主要的消耗有channel的sent、received、connected、disconnected、caught,以及数据的编解码。这五种线程模型其实是把这些任务以不同的方式分散到IO和业务线程。如下图为All Dispatcher 。在这里插入图片描述
那么,在面对不同场景时,如何对线程模型进行配置呢?这些线程模型分别适用于怎么样的场景呢?

https://zhuanlan.zhihu.com/p/157354148

这篇文章里我认为有句话说的很好,
如果处理逻辑较为简单,并且不会发起新的I/O请求,那么直接在I/O线程上处理会更快,因为这样减少了线程池调度与上下文切换的开销,毕竟线程切换还是有一定成本的。如果逻辑较为复杂,或者需要发起网络通信,比如查询数据库,则I/O线程必须派发请求到新的线程池进行处理,否则I/O线程会被阻塞,导致处理IO请求效率降低。

也就是说,如果本次请求是一次快速的操作,那么大可以在IO线程中进行,因为进行上下文切换反而会更加耗时。但如果是一次耗时的操作,那么就推荐交给业务线程来处理,防止IO线程被占满。

怎么去判断本次是不是快速地呢?我认为有两个方面,一个是是否进行了多次网络通信或者磁盘IO,另一个是 接收/响应的数据量是否过大导致编解码过于耗时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Leak Detector内存泄漏检测机制源码剖析

VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…

YOLOv7改进:小目标遮挡物性能提升(SEAM、MultiSEAM),涨点神器!!!

💡💡💡本文属于原创独家改进: SEAM注意力机制较好的解决了物体遮挡问题; 同时考虑到遮挡物一般为小目标,因此提出了MultiSEAM注意力,解决小目标遮挡问题; SEAM、MultiSEAM | 亲测在多个小目标数据集实现暴力涨点,强烈推荐,独家首发; 收录: YOLOv7高阶自研…

每日leetcode_2441_对应负数同时存在的最大整数

Leetcode每日一题_2441_对应负数同时存在的最大整数 记录自己的成长&#xff0c;加油。 题目 解题 class Solution {public int findMaxK(int[] nums) {int k -1;Set<Integer> set new HashSet<Integer>();for (int x : nums) {set.add(x);}for (int x : nums) …

Spark 9:Spark 新特性

Spark 3.0 新特性 Adaptive Query Execution 自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息(元数据)和对成本的错误估算(执行计划调度)导致生成的初始执行计划不理想&#xff0c;在Spark3.x版本提供Adaptive Query Execution自适应查询技术&#xff0c;通过在”运行…

通过位运算,实现单字段标识多个状态位

可能经常有如下这种需求: 需要一张表,来记录学员课程的通过与否. 课程数量不确定,往往很多,且会有变动,随时可能新增一门课. 这种情况下,在设计表结构时,一门课对应一个字段,就有些不合适, 因为不知道课程的具体数量,也无法应对后期课程的增加. 考虑只用一个状态标志位,利用位运…

C/C++实现简单高并发http服务器

基础知识 html&#xff0c;全称为html markup language&#xff0c;超文本标记语言。 http&#xff0c;全称hyper text transfer protocol&#xff0c;超文本传输协议。用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器传输超文本到本地浏览器的传送…

亚马逊云科技最新分享:人、流程、工具全链路数据安全合规

数据已经是现代发明和创新之源。 企业需要人—流程—工具全链路的数据安全合规。 出品 | CSDN 云计算 端到端、全栈&#xff0c;是近两年我们听到云巨头亚马逊云科技提到最多的架构思路。现在&#xff0c;已经成为生产要素的数据&#xff0c;重要性被提到的非常高的高度&#x…

canvas制作签名版

直接复制粘贴 代码如下 <!DOCTYPE html> <html> <head><title>Signature Pad</title><style>canvas {border: 1px solid #ccc;}</style> </head> <body><canvas id"signature-pad" width"400"…

docker 启动 mysql 通过防火墙设置端口无法访问解决方案

1、问题描述&#xff1a;通过 docker compose 启动mysql服务&#xff0c;然而在防火墙添加了3306端口后却无法访问&#xff0c;但是关闭防火墙后又可以访问mysql数据库。 解决方案&#xff1a; 重启 docker 后解决&#xff1a;systemctl restart docker 如果没有解决问题则执…

6-3 递增的整数序列链表的插入 分数 5

List Insert(List L, ElementType X) {//创建结点List node (List)malloc(sizeof(List));node->Data X;node->Next NULL;List head L->Next; //定位real头指针//空链表 直接插入if (head NULL) {L->Next node;node->Next head;return L;}//插入数据比第…

VMware中Ubuntu(Linux)无法连接网络解决办法记录

问题&#xff1a; 操作系统&#xff1a;Ubuntu 22.04.3 LTS VMware 版本&#xff1a;VMware Workstation 17 Pro, 17.0.0 build-20800274今天在虚拟机用Ubuntu的时候&#xff0c;发现无法连接网络&#xff0c;如下&#xff1a; wdwd-virtual-machine:~$ ifconfig lo: flags73…

嵌入式养成计划-38----C++--匿名对象--友元--常成员函数和常对象--运算符重载

八十七、匿名对象 概念&#xff1a;没有名字对象格式 &#xff1a;类名&#xff08;&#xff09;;作用 用匿名对象给有名对象初始化的用匿名对象给对象数组初始化的匿名对象作为函数实参使用 示例 : #include <iostream> using namespace std; class Dog { private:s…

在Kubernetes中实现gRPC流量负载均衡

在尝试将gRPC服务部署到Kubernetes集群中时&#xff0c;一些用户&#xff08;包括我&#xff09;面临的挑战之一是实现适当的负载均衡。在深入了解如何平衡gRPC的方式之前&#xff0c;我们首先需要回答一个问题&#xff0c;即为什么需要平衡流量&#xff0c;如果Kubernetes已经…

acwing算法基础之基础算法--高精度减法算法

目录 1 知识点2 模板 1 知识点 此高精度减法模板&#xff0c;保证A大于等于B。 此高精度模板假定数A和数B都是正数。 2 模板 //低位在前 //A大于B vector<int> sub(vector<int> &A, vector<int> &B) {vector<int> C;int t 0;for (int i 0…

Unity脚本判断场景内物体是否为Root Prefab的方法

问题 由于如果不是根Prefab&#xff0c;是无法通过PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(gameObject)获得的地址来进行修改后属性的存储的。 所以&#xff0c;如果脚本中需要对修改属性后的Prefabs进行保存&#xff0c;又要避开Prefabs下的part&#xff0c…

亘古难题——前端开发or后端开发

一、引言 前端开发 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。 前端开发从网页制作演变而来&#xff0c;名称上有很明显的时…

C语言-数组

C 语言支持数组数据结构&#xff0c;数组是一个由若干相同类型变量组成的有序集合。 这里的有序是指数组元素在内存中的存放方式是有序的&#xff0c;即所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素&#xff0c;最高的地址对应最后一个元素。 在 C 语言中&am…

fastadmin框架如何开启事务

引言&#xff1a; 数据库事务是一种重要的概念&#xff0c;它确保了一组数据库操作要么全部成功&#xff0c;要么全部失败&#xff0c;以保持数据的一致性。FastAdmin框架提供了方便的方式来处理数据库事务&#xff0c;本文将向你展示如何使用它来开启、提交和回滚事务。 第一…

GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别

GNU和Linux的关系 其实&#xff0c;我们通常称之为的"Linux"系统&#xff0c;相对更准确的名称应该称为“GNU/Linux”系统&#xff01; 一个功能完全的操作系统需要许多不同的组成部分&#xff0c;其中就包括内核及其他组件&#xff1b;而在GNU/Linux系统中的内核就…

物联网AI MicroPython传感器学习 之 MQ136硫化氢传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 MQ136 是一种硫化氢检测传感器&#xff0c;感应范围为 1 - 200ppm。传感元件是 SnO2&#xff0c;它在清洁空气中的电导率较低。当存在 H₂S 气体时&#xff0c;传感器的电导率随着气体浓度的升…