RPC调用框架简单介绍

news2025/2/25 7:35:30

一.Thrift

Apache Doris目前使用的RPC调度框架。Thrift是一款基于CS(client -server)架构的RPC通信框架,开发人员可以根据定义Thrift的IDL(interface decription language)文件来定义数据结构和服务接口,灵活性高,支持多种语言,功能强大,不仅可以对数据进行网络传输,还可以存储数据。主要包括3种服务模式:

1.TSimpleServer: 单线程服务模式,一个客户端对应一个服务端线程,随着客户端的增加,服务端的线程数会直线增加,仅在测试使用;

2.TTreadPoolServer : 阻塞式IO,服务端通过线程池的方式来提供服务;

3.TNonblockingServer:非阻塞式IO,服务端通过线程池的方式来提供服务,与第二种方式的不同点在于,这种服务模式,在服务端采用了主从Reactor的方式,主Reactor主要用来与客户端进行通信,响应客户端请求;从Reactor用来对数据进行编码解码操作,这个需要配合 TFramedThransport传输方式。

目前在Doris种,默认采用的是第二种服务模式。

二.Netty

Apache Flink目前数据传输主要是基于Netty来实现的(Spark也是)。它基于CS(client -server)的NIO架构,是一款典型的基于Reactor模型的RPC通信框架。Netty消耗资源少,高吞吐,低延迟,最重要的一点是它是基于零拷贝技术来是减少数据的拷贝,Netty可以直接通过socket读取堆外内存中的数据进行读写。零拷贝主要体现在以下几点:

1.Netty接收和发送byteBuffer采用direct buffers,直接使用堆外内存进行socket对数据的读写操作,不需要将堆外内存中的数据拷贝至堆内存中。堆外内存的分配主要依靠ByteBufferAllocator通过ioBuffer来进行分配。

2.提供了CompositeByteBuf 类,可以将多个小的byteBuffer合并为一个逻辑上大的byteBuffer,避免了传统通过内存拷贝的方式将几个小byteBuffer合并为一个大byteBuffer的不足;

3.通过FileRegion包装的FileChannel.tranferTo()方式,直接将文件缓冲区的数据发送到目标Channel中,避免传统通过循环write的方式导致的内存拷贝问题。

参考文章:Netty原理总结

三.Akka

Apache Flink目前TaskManager,jobManager,jobClient之间通信主要是基于Akka来实现的。它是一种分布式,高并发,有容错的IO密集型的,基于协程来实现的RPC异步通信框架。

Akka是actor模型的一种实现。在actor模型的上下文中,所有代理实体都被认为是独立的actor,每个actor都有自己独立的邮箱,actor通过向彼此发送异步消息(邮件)与其他actor通信。actor模型的强度来自于这种异步操作。参看:Akka简介

Actor系统是所有actor存活的容器,它提供诸如调度、配置和日志记录之类的共享服务。Actor系统还包含从所有actor线程收集到的线程池。所有actor都按层次结构组织,每个新创建的actor将创建它的的actor作为父节点,分层次结构主要用于监督。每个父actor负责监督管理其创建的所有子actor。如果其中一个子actor出现错误,首先通知子actor,子actor可以通过重启或者恢复的方式解决问题。如果问题超出了子actor的处理范围,它可以将错误升级到自己的父actor。升级错误仅仅意味着当前层次之上的层次结构层现在负责解决问题。

在这里插入图片描述

Akka是基于协程来实现通信框架。协程的粒度比线程更小,一个线程中可以有多个协程存在,多个协程之间相互协调处理。

线程包括内核线程和用户线程,通常我们所说的线程是指内核线程,每一个用户线程(协程)都必须关联一个内核线程,cpu只能感知到内核线程(内核空间),无法感知到用户线程(用户空间)。
在这里插入图片描述
在这里插入图片描述
协程可以理解为一种轻量级的用户线程,每个协程都有自己的寄存器和栈,当一个协程再做状态切换时,只需要在用户态上切换即可,而线程之间的切换需要从用户态->内核态->用户态,因此协程切换之间的速度更快,耗费资源更少。线程栈空间通常是 2M, 协程栈空间最小 2K
在这里插入图片描述
在这里插入图片描述
那为什么要进行上下文切换呢?比如一个通过命令行任务的提交吧。

比如当前有一个A进程正在等待命令行的输入,当提交作业过来后,A进程会调用一个系统函数(system call),来执行该请求,system call会将控制权传递给操作系统,操作系统此时会在内存和处理器当中保存A进程的上下文信息,同时创建一个新的进程B及其上下文,然后操作系统会把控制权传递给新的进程B。当进程B终止后,操作系统会恢复A的上下文,并将控制权重新传递给A,进程A等待下一个任务。

从上面这个实例我们可以得出结论:

(1)上一个进程的上下文信息还在内存和处理器当中,要保存这些信息的话,就必须陷入到内核态才可以。

(2)创建一个新的进程,以及它的上下文信息,并且将控制权交给这个新进程,这些都只有在内核态才能实现。

一个用户态线程必须要绑定一个内核态线程,那么是否可以多个用户态线程(协程)绑定一个内核态线程呢?

于是,Go 为了提供更容易使用的并发方法,使用了 goroutine。goroutine 来自协程的概念,让一组可复用的函数运行在一组线程之上,即使有协程阻塞,该线程的其他协程也可以被 runtime 调度,转移到其他可运行的线程上。最关键的是,程序员看不到这些底层的细节,这就降低了编程的难度,提供了更容易的并发。

注:所有图片均来自网络,如果侵权,请联系删除。

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

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

相关文章

Leetcode.2583 二叉树中的第 K 大层和

题目链接 Leetcode.2583 二叉树中的第 K 大层和 Rating : 1374 题目描述 给你一棵二叉树的根节点 root和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返…

INFINONE XC164单片机逆向记录(5)C166地址系统

本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正(欢迎进扣群 24849632 探讨问题); 写在专栏前面https://blog.csdn.net/Junping1982/article/details/129955766 INFINONE XC164单片机逆向记录(1)资料准备

Python爬虫知识回顾

之前一直沉溺于java,jsp,ssh,db等爬虫,现在又要开始走python的老路了。常用的requests库,通过requests对象的get方法,获取一个response对象。jsp的东西。 其中timeout,proxies,headers,cookies,verify,是我…

webgl-画指定颜色三角形

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

JUC之CountDownLatch与CyclicBarrier

1.前言 在java.util.concurrent包中为我们提供了很多的线程同步工具类&#xff0c;例如CountDownLatch与CyclicBarrier&#xff0c;那么它们主要的用途是什么呢&#xff1f;且看后续分析。 2.CountDownLatch 2.1 什么是CountDownLatch CountDownLatch&#xff0c;顾名思义&…

从ReentrantLock角度解析AQS

一、概述 闲来不卷&#xff0c;随便聊一点。 一般情况下&#xff0c;大家系统中至少也是JDK8了&#xff0c;那想必对于JDK5加入的一系列功能并不陌生吧。那时候重点加入了java.util.concurrent并发包&#xff0c;我们简称为JUC。JUC下提供了很多并发编程实用的工具类&#xf…

风光及负荷多场景随机生成与缩减

目录 1 主要内容 计算模型 场景生成与聚类方法应用 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现了《融合多场景分析的交直流混合微电网多时间尺度随机优化调度策略》3.1节基于多场景技术的随机性建模部分&#xff0c;该部分是随机优化调度的重要组成部分…

记录-css实现交融文字效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 CSS是有魔法的&#xff0c;我们今天来实现一个CSS的动画效果&#xff0c;只需要几行代码就可以搞定。 第一步、我们要将一行文字从中间展开 <!DOCTYPE html> <html lang"en"> &…

面试官:聊聊js原型

一分钟了解原型对象 js分为函数对象和普通对象 &#xff0c;每个对象都有__proto__属性&#xff0c;但是只有函数对象才有prototype属性&#xff0c;prototype属性就是函数的原型对象。 比如说 构造函数通过new 实化一个实例对象&#xff0c;实例对象的__proto__ 指向原型对象…

NumPy 基础知识 :6~10

原文&#xff1a;Numpy Essentials 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 六、NumPy 中的傅立叶分析 除其他事项外&#xff0c;傅立叶分析通常用于数字信号处理。 这要归功于它在将输入信号&#xff08;时域&#xff09;分离为以离散频率&#xff08;频域&am…

Spring Boot集成Druid实现多数据源的两种方式

目录 项目场景&#xff1a; 一、集成com.baomidou的方式 1、maven依赖&#xff1a; 2、 配置文件&#xff1a; 3、 使用注解切换数据源&#xff1a; 二、基于AOP手动实现多数据源原生的方式 1、maven依赖&#xff1a; 2、 配置文件&#xff1a; 3、 多数据源名称类 4…

数字中国理念引领国企人力资源数字化转型与实践

3月初&#xff0c;《数字中国建设整体布局规划》出台&#xff0c;作为中国数字经济发展的重要指导性文件&#xff0c;规划提出了数字中国建设的总体目标和战略方向&#xff0c;文件详细阐述了数字中国内涵&#xff0c;包含数字经济、数字社会、数字政府以及数字生态等内涵。《规…

制造企业该如何选择MES生产管理系统?盘点四大生产管理系统软件

本文将介绍&#xff1a;1、如何选择MES(生产管理系统&#xff09;&#xff1b;2、盘点四款好用的生产管理系统 生产管理系统即MES(Manufacturing Execution System)&#xff0c;制造执行系统。是面向车间生产的管理系统。在产品从工单发出到成品完工的过程中&#xff0c;MES系…

1206. 设计跳表

1206. 设计跳表 不使用任何库函数&#xff0c;设计一个 跳表 。 跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树&#xff0c;其功能与性能相当&#xff0c;并且跳表的代码长度相较下更短&#xff0c;其设计思想与链表相似。 例如&a…

如何收集EMC VPLEX 日志和VPLEX日志的简单解读

对于VPLEX遇到的问题&#xff0c;和二线沟通最快最有效的办法就是收集完整的日志&#xff0c;而不是拍一个照片。本文就详细介绍如何收集日志&#xff1f;和那些日志文件对我们分析问题是有价值的。 命令行ssh登录Vplex 管理控制台&#xff0c;然后进入Vplexcli命令行&#xf…

Windows安装Nginx并配置负载均衡

Nginx简介 Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;Nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外Nginx可以作为反向代理进行负载均衡的实现。 Nginx使用基于事件驱动…

HOJ项目部署(前后端及其判题机)

文章目录HOJ项目部署1 项目准备1.1 拉取HOJ项目到本地1.2 项目包结构解读2 后端部署DataBackup2.1 环境准备1&#xff09;项目基本数据导入2&#xff09;Nacos环境配置2.2 修改配置1&#xff09;修改application-prod.yml2&#xff09;修改bootstrap.yml3&#xff09;修改上传文…

【模板特性补充】

目录&#xff1a;前言一、非类型模板参数使用方法使用场景二、模板特化&#xff08;一&#xff09;函数模板特化&#xff08;二&#xff09;类模板特化1.全特化2.偏特化使用场景三、模板分离编译1. 什么是分离编译2.模板的分离编译3.解决方法四、模板总结前言 打怪升级&#x…

你知道多少接口性能优化的方案?

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c; 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场景的接口中&#xff0c;可以在批处理执行完成后一次性插入或更新数据库…

Springboot的自动注入

一、开篇 在平时的开发过程中用的最多的莫属springboot了&#xff0c;都知道springboot中有自动注入的功能&#xff0c;在面试过程中也会问到自动注入&#xff0c;你知道自动注入是怎么回事吗&#xff0c;springboot是如何做到自动注入的&#xff0c;自动注入背后的原理是什么&…