RPC调用框架简单介绍

news/2024/5/21 21:07:29/文章来源:https://blog.csdn.net/weixin_43914798/article/details/130102715

一.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.luyixian.cn/news_show_96744.aspx

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

相关文章

项目5:实现数据字典的上传下载

项目5:实现数据字典的上传下载 1.什么是数据字典?如何设计? 2.业务流程逻辑 3.数据库表的设计 4.实现上传下载逻辑(前端) 5.实现上传逻辑(后端) 6.实现下载依赖(后端&#xff…

代码随想录Day49

今天继续学习动规解决完全背包问题。 322.零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,…

vuex中的 mapState, mapMutations

vuex中的 mapState, mapMutations Start 今天使用vuex的过程中,遇到 mapState, mapMutations 这么两个函数,今天学习一下这两个函数。 本文介绍的vuex基于 vuex3.0 1. 官方文档说明 1.1 mapState 官方解释 点击这里&#xff1…

【JUC进阶】详解synchronized锁升级

文章目录1. synchronized概述2. synchronized 的实现原理2.1 Java对象组成2.2 Monitor2.3 从字节码角度看synchronized3. 锁升级3.1 偏向锁3.2 轻量级锁1. synchronized概述 synchronized是一个悲观锁,可以实现线程同步,在多线程的环境下,需…

DIN35电压电流转频率单位脉冲输出信号变换器集电极开路隔离变送器

主要特性 将直流电压或电流信号转换成单位脉冲信号。 精度等级:0.1 级、0.2 级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入:0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 输出标准信号:0-5KHz/0-…

Flink CDC 在京东的探索与实践

摘要:本文整理自京东资深技术专家韩飞,在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分: 京东自研 CDC 介绍京东场景的 Flink CDC 优化业务案例未来规划点击查看直播回放和演讲 PPT 一、京东自研 CDC 介绍 京东自研…

小白学Pytorch系列- -torch.distributions API Distributions (1)

小白学Pytorch系列- -torch.distributions API Distributions (1) 分布包包含可参数化的概率分布和抽样函数。这允许构造用于优化的随机计算图和随机梯度估计器。这个包通常遵循TensorFlow分发包的设计。 不可能通过随机样本直接反向传播。但是,有两种主要方法可以…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题,是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前,修改tomcat目录底下的/conf/catalina.properti…

chapter-5 数据库设计

以下课程来源于MOOC学习—原课程请见:数据库原理与应用 考研复习 引言 设计的时候: 我们为什么不能设计成R(学号,课程号,姓名,所咋系,系主任,成绩)? 因为存在数据冗余…

C++算法初级7——二分查找

C算法初级7——二分查找 文章目录C算法初级7——二分查找在升序的数组上进行二分查找总结应用范围应用二分查找的原理:每次排除掉一半答案,使可能的答案区间快速缩小。 二分查找的时间复杂度:O(log n),因为每次询问会使可行区间的…

appium+python自动化测试启动app

一、部署环境 1、依次下载安装以下工具,并配置环境变量: android sdk Nodejs appium appium-doctor Appium-Python-Client pycharm64 ps:安装包下载和配置环境变量的操作步骤跟着网上各路大神的帖子一步一步做就好了,没啥难度 二、连…

Machine Learning-Ex4(吴恩达课后习题)Neural Networks Learning

目录 1. Neural Networks 1.1 Visualizing the data 1.2 Model representation 1.3 Feedforward and cost function 1.4 Regularized cost function 2. Backpropagation 2.1 Sigmoid gradient 2.2 Random initialization 2.3 Backpropagation 2.4 Gradient Checking…

【数据库原理 • 四】数据库设计和规范化理论

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

linux之jdk1.8环境安装与配置和Maven安装与配置

文章目录一、jdk1.8环境安装1、官网下载&#xff1a;<https://www.oracle.com/java/technologies/downloads/#java8>2、在usr文件夹下新建一个java文件夹3、解压完成后&#xff0c;将文件jdk文件传入到java目录下二、配置环境&#xff08;重点&#xff09;1、按 i 进行编…

蓝牙技术|苹果获空间音频新专利,AirPods可动态调整声学输出

美国商标和专利局&#xff08;USPTO&#xff09;公示的清单显示&#xff0c;苹果在近日获得了一项名为“测定虚拟聆听环境”的新专利。据悉&#xff0c;该技术可以改善用户的聆听体验&#xff0c;增强空间音频的沉浸感&#xff0c;未来有望应用在AirPods上。 这项专利技术可以…

代码随想录_二叉树_二叉树的层序遍历十道题

leetcode102.二叉树的程序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

文心一言对于宣传文案理解

前言 前段时间对于文心一言开放部分内测邀请&#xff0c;有幸获得邀请内测权限&#xff01;抱着试一试的态度对其进行了使用&#xff0c;结果还是比较满意的。我们来看一下我所说的满意是否能够达到你的要求&#xff01;&#xff01;&#xff01; 使用逻辑 文心一言的使用还…

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&…

android12 displayArea学习

一&#xff1a;数据结构分析 1&#xff1a;android 12 WindowContainer 的类继承关系如下 下图为 WindowContainer 简要的对象图。 下图是 Aosp默认的display层次结构对象图。 Aosp定义的feature有如下 FEATURE_ROOT 0; FEATURE_DEFAULT_TASK_CONTAINER 1; FEATURE_WINDOW_…