想开发IM集群?先搞懂什么是RPC!

news2024/11/26 18:28:59

即时通讯网官方技术群和社区里,经常有开发者在纠结怎么开发IM集群,虽然真正的使用人数,可能用个人电脑单机都能支撑。

你也许会说,明明不需要用到IM集群,干吗要自找麻烦?答曰:“老板说这个得有!”、“万一产品做成了,用户量达到百万、千万级呢?”,各种回答,反此种种。总之,IM集群就是得整一个(先甭管用不用的上...)。

当然,玩笑归玩笑,真正要做到可投入到生产级别的IM集群系统,难度还是相当大的。必竟IM这种长连接应用相比传统Http这种短连接应用太不标准。

我们以一个典型的IM聊天消息传输为例:

假设存在两个正在聊天的用户(用户A和用户B),当A连接的是IM集群中的IM实例1、B连接的是IM集群中的IM实例2,此时当用户A向用户B发送一条聊天消息时,这条消息应该如何传递呢?

我们梳理一下上面这个例子的消息流转过程:

1)IM聊天消息首先会由用户A发往IM实例1;2)IM实例1会将此条消息转交给IM实例2;3)IM实例2会将此条消息最终投递给连接在本实例上的用户B。

如上述流程所示,这就是一个IM集群系统中典型的聊天消息投递过程。

那么,这其中涉及到一个关键步骤:即第2)步中如何实现“IM实例1会将此条消息转交给IM实例2”?

此时,RPC技术出场了!

RPC 是1984年代由 Andrew D. Birrell & Bruce Jay Nelson 提出的(见二位大佬的论文《Implementing Remote Procedure Calls》),所以它并不是最近才有的技术概念。

关于RPC的介绍,正经的资料上大概是这样介绍的:

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。即时通讯聊天软件app开发可以加小蓝豆的v:weikeyun24咨询

大白话理解RPC就是:RPC让你用别人家的东西就像自己家的一样。

看得我似懂非懂,于是我不得不问几个问题:

1)为啥要用别人家的东西——请求其他服务);2)我怎么可以借到别人家的东西——其他服务调用;3)要是借用的话哪种形式更好——确定一个合适的调用方法);4)怎么让我用别人东西像自己的一样——屏蔽底层细节透明通信)。

在解答这些问题之前,我们必须达到一个共识问题:RPC只是一种通信模式,和http并不冲突对立,相反http可以作为RPC传输数据的一种协议,把RPC当作一种模式和思想,我们才能更好地理解它。

以大家最熟悉的电商系统为例,这样规模的分布式系统,需要拆分出用户服务、商品服务、优惠券服务、支付服务、订单服务、物流服务、售后服务等等。这些服务之间都相互调用,这时内部调用最好使用 RPC ,同时每个服务都可以独立部署,独立上线。

也就说当我们的项目太大,需要解耦服务,扩展性强、部署灵活,这时就要用到 RPC ,这主要是解决了分布式系统中,服务与服务之间的调用问题。

在日常业务中我们可以把功能封装成静态库、动态库、sdk、独立服务等,最常见也最方便的还是HTTP这种形式的调用。

HTTP服务把需要提供的服务暴露成接口(也就是通常所说的http rest接口啦),使用方直接按约定的HTTP方法和URI进行数据交互。

我们都知道HTTP协议是应用层协议,是个非常标准的协议,在HTTP协议之下还有网络层、传输层、数据链路层等,一个数据包packet除了净荷payload之外还有很多header,由于标准和通用性的设计目标也使得HTTP一次数据交互真正传输的payload只是其中一部分。

HTTP是我们用的最多最熟悉的交互模式,在系统内部各个服务之间接口较少,交互不多的情况下工作得还不错。

但如果在内部系统调用很复杂的前提下,HTTP调用的效率和安全性就不那么理想了。

以IM系统为例,单个IM实例的吞吐效率至少可以达到几万甚至数十万QPS,使用HTTP这种短连接(调用时建立socket连接,完成后释放连接)方式显的相当低效(每次调用都要重新经历TCP的3次握手、4次挥手过程),在分布式的情况下势必拉低整个IM集群的吞吐效率。而对于RPC,这种socket长连接方式对于高性能场景来说,效果是显而易见的。

更重要的是面对众多的服务我们需要的不仅仅是一个通信方式,而是一个内部服务的管理系统,这也就是我们今天说的RPC框架。注意:RPC是一种模式策略和框架,并不是单纯的通信协议。

题外话:实际上,HTTP在RPC系统中,并不是个你死我活的关系,必竟HTTP只是个通信协议,而HTTP有某些性能要求不敏感的场景来说,是完全可以作为RPC的具体实现协议之一来使用的。

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

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

相关文章

I.MX6ULL内核开发0:linux内核模块

目录 简要 一、内核模块的概念 二、内核模块加载、卸载过程 简要 1、内核模块的概念 2、内核模块的原理:内核模块在内核的加载、卸载过程。 一、内核模块的概念 内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最…

Prim和Kruskal的区别?哪个好?

Prim和Kruskal有啥区别?到底哪个好? 今天做了一道最小生成树的题,发现了一点猫腻! 题目在这里 : 《修路问题1》 文章目录Prim和Kruskal有啥区别?到底哪个好?先说结论PrimKruskal修路问题1——…

EPICS Phoebus手册1

1、介绍 Phoebus是一个控制系统Stdio工具集的更新,它移除了对Eclipse RCP和SWT的依赖。 虽然Eclipse RCP快速启动了原先的CS-Studio的实现,并且为CS-Stdio也提供了大约十年的服务,因为RCP也增加了对控制系统用户接口开发的限制。 Phoebus项目…

【Spring源码】AOP的开端:核心对象创建的准备工作

AOP的核心成员是如何被被加载的?本篇我们主要分析使用xml的逻辑,如果使用注解,增加注解处理类即可(ConfigurationClassPostProcessor)拿之前分析循环的时候举的例子🌰,它的日志切面就是通过xml进…

119.(leaflet篇)文字碰撞

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

如何从 Android 手机上的 SD 卡恢复已删除的照片

为了扩展手机的存储空间&#xff0c;很多人都会在安卓手机上插入一张SD卡来存储一些大文件&#xff0c;比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便&#xff0c;但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼&#xff1f;…

工作中常用且容易遗忘的css样式整理,建议收藏

1. 文字超出部分显示省略号单行文本的溢出显示省略号&#xff08;一定要有宽度&#xff09;p{width:200rpx;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}多行文本溢出显示省略号p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: …

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考 那什么是FPGA芯片呢&#xff1f;FPGA全称为&#xff1a;现场可编程逻辑门阵列&#xff08;Field-Programmable Gate Array&#xff09;&#xff0c;是基于通用逻辑电路阵…

C语言实现顺序表(pushback pushfront popback popfront insert erase find)

顺序表&#xff0c;是常用的一种数据结构&#xff0c;他的底层是连续的物理内存&#xff0c;所以他可以在O&#xff08;1&#xff09;的时间访问下标为N的位置&#xff0c;而且很多操作都是基于顺序表才可以操作的&#xff0c;例如:排序 所以顺序表是很重要的&#xff0c;他和…

taobao.item.update.listing( 一口价商品上架 )

&#xffe5;开放平台基础API必须用户授权 单个商品上架输入的num_iid必须属于当前会话用户 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoCl…

SpringBoot入门 - 定制自己的Banner

我们在启动Spring Boot程序时&#xff0c;有SpringBoot的Banner信息&#xff0c;那么如何自定义成自己项目的信息呢&#xff1f;什么是Banner我们在启动Spring Boot程序时&#xff0c;有如下Banner信息&#xff1a;那么如何自定义成自己项目的名称呢&#xff1f;如何更改Banner…

一天约了4个面试,复盘一下面试题和薪资福利

除了最新的面经分享&#xff0c;还有字节大佬的求职面试答疑&#xff0c;告诉你关键问题是什么&#xff1f;少走弯路。**另外本文也汇总了6份大厂面试题&#xff1a;字节、腾讯、小米、腾讯云、滴滴、小米游戏。**希望对大家有帮助。 前言 昨天我的交流群里&#xff0c;有位宝…

【学习笔记】深入理解JVM之对象的实例化

参考尚硅谷JVM 102 - 106 集 首发地址&#xff1a;地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance&#xff08…

精选博客系列|公用事业中的VMware:在边缘重新定义价值

VMware 已经成为公用事业行业的核心。您可以在那里找到例如 VMware vSphere&#xff08;包括基础 Hypervisor ESXi 和 VMware vCenter 建立的整体控制平面&#xff09;的核心产品。来自软件定义的基础架构带来的诸多好处使 IT 团队将其先前基于硬件的系统转变为 VMware Cloud F…

GPT+时代来临:OpenAI开放GPT3.5模型,1000token仅1毛钱

GPT3.5 Model API 使用指南 今天OpenAI公司开放了最新的GPT3.5模型&#xff1a;gpt-3.5-turbo&#xff0c;也就是目前网页版的ChatGPT使用的模型。而此前OpenAI开放的最新的模型text-davinci-003则是基于GPT3模型构建的。并且价格十分便宜&#xff1a;1000 token/0.002美元&am…

CVE-2021-2109 WebLogic JNDI 注入

0x01 前言学习一下 WebLogic JNDI 注入 RCE&#xff08;CVE-2021-2109&#xff09;0x02 环境搭建和之前 WebLogic 的环境搭建是一致的&#xff0c;本文不再赘述。不过值得一提的是&#xff0c;我的 weblogic 版本是 10.3.6&#xff1b;需要手动添加 \server\lib\consoleapp\web…

打电话,玩手机、摔倒行人行为识别

文章大纲 数据集准备一些难点paddle 解决方案行为识别打电话摔倒开源解决方案前文: 深度学习与视频分析简介视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等数据集准备 我们可以从开源数据中挑选一些 参考文章: 使用python 脚本挑出coco 数据集…

【C++的OpenCV】第九课-OpenCV图像常用操作(六):图像形态学-阈值的概念、功能及操作(threshold()函数))

目录一、阈值&#xff08;thresh&#xff09;的概念二、阈值在图形学中的用途三、阈值的作用和操作3.1 在OpenCV中可以进行的阈值操作3.2 操作实例3.2.1 threshold()函数介绍3.2.2 实例3.2.3 结果上节课的内容&#xff08;作者还是鼓励各位同学按照顺序进行学习哦&#xff09;&…

易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。关于m6A甲基化研究思路&#xff08;1&#xff09;整体把握m6A甲基化图谱特征&#xff1a;m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…

IP协议的漏洞及防护措施

文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;是TCP/IP协议族的核心&#xff0c;也是网际层最重要的协议。 IP数据报由首部和数据两部分组成&#xff1b…