架构师面试(十九):IM 架构

问题

IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式,消息收发不需要服务端的参与,即客户端之间直连的方式;代理人模式也叫中转模式,消息收发需要服务端进行中转。

下面关于这两类模式描述的说法正确的有哪几项呢?  

A. 介绍人模式需要解决 P2P 打洞技术问题;

B. 代理人模式方便对消息内容进行风险管控;

C. 介绍人模式不利于实现消息漫游,影响用户体验;

D. 从性能上比较,介绍人模式比代理人模式的性能更优。

解析

A选项:早期的很多IM软件大都采用了介绍人模式,也就是要通信的两个客户端进行直连的模式;如果这两个客户端在同一个局域网中,建立连接是非常方便的(比如现在仍在普遍使用的“飞鸽传书”);如果这两个客户端是在不同的局域网中(局域网中的客户端是没有公网IP的),怎么建立连接呢?这个时候往往需要P2P打洞技术。这个地方有一个非常有意思的面试题目:几乎所有的客户端都是没有公网独立IP的,但我们上网时,那些服务器程序回复的数据包是怎么找到我们的客户端的呢?(大家可以自行学习一下  NAT 技术!)介绍人模式见下图。

B选项:代理人模式对消息内容可以方便地进行风控管理,这个是非常容易理解的;毕竟在介绍人模式下进行风控管理,用户体验、代价和复杂度都太大了!(大家想一下,为什么?)代理人模式见下图。

C选项:介绍人模式下,消息都保存在客户端本地;换一个终端设备,消息如何漫游呢!

D选项:收发消息的性能损耗,除了网络传输外,还有对连接的管理和维护、网络异常情况的处理、消息落库、复杂的业务处理、程序逻辑框架等等;介绍人模式下,所有的客户端既是客户端也是服务端,在活跃的聊天场景(比如群聊)中,所有的客户端形成了一种网状的通信模式;在极端情况下,每一个客户端要处理其他所有的客户端请求,此时客户端的性能是很难提升的;而如果将压力转移到扩展性非常好的服务端,也就是代理人模式,整个 IM 的性能就会提升很多。当然,我们是工程派,对性能的论断没有一个实验环境进行完整的实验是不合理;这个地方重点强调的是:介绍人模式不会因为看似网络传输减少了一个环节,其性能就比代理人模式要优!

扩展一下:

我们对这两种 IM 的架构方案进行抽象: 

IM 的介绍人模式其实就是【边缘计算方案】,充分利用每个客户端节点的计算能力进行业务逻辑处理;

IM 的代理人模式其实就是【中心计算方案】,充分利用中心服务器的计算能力进行业务逻辑处理。

参考答案

ABC

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

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

相关文章

【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用

目录 ​编辑 一、RAID概述 1.1 磁盘阵列简介 1.2 功能 二、RAID级别 2.1 RAID 0(不含校验与冗余的条带存储) 2.2 RAID1(不含校验的镜像存储) 2.3 RAID 5 (数据块级别的分布式校验条带存储) 4、RAI…

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上,MySQL 8.0默认使用auth_socket插件进行身份验证,可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时,不需要输入密码或错误密码都可以正常登入mysql数据库&…

小程序开发中的用户反馈收集与分析

我们在开发小程序的过程中根据开发过程中的代码及业务场景,以下是针对需求管理系统的用户反馈收集与分析方案设计: 需求管理系统用户反馈收集与分析方案 一、反馈数据模型设计 // 新增Feedback模型(app/admin/model/Feedback.php) namespace app\admin\model; use think\…

python关键字汇总

文章目录 1. 变量与类型相关2. 控制流相关3. 函数与类相关4. 异常处理相关5. 模块相关6. 其他 在 Python 3 里有 35 个关键字,它们各自具备特定的用途与意义 1. 变量与类型相关 True、False 意义:布尔类型的常量,分别代表逻辑真与逻辑假。示…

使用Python在Word中创建、读取和删除列表 - 详解

目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序(编号)列表 使用默认样式创建无序(项目符号)列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中&#xff…

软考-软件设计师-计算机网络

一、七层模型 中继器:信号会随着距离的增加而逐渐衰减,中继器可以接受一端的信息再将其原封不动的发给另一端,起到延长传输距离的作用; 集线器:多端口的中继器,所有端口公用一个冲突域; 网桥&…

关于Flask框架30道面试题及解析

文章目录 基础概念1. 什么是Flask?其核心特性是什么?2. Flask和Django的主要区别?3. 解释Flask中的“路由”概念。如何定义动态路由?核心组件4. Flask的请求上下文(Request Context)和应用上下文(Application Context)有什么区别?5. 如何访问请求参数?POST和GET方法的…

C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革

文章目录 一、constexpr 在 <algorithm> 中的应用1. 编译时排序2. 编译时查找 二、constexpr 在 <utility> 中的应用1. 编译时交换2. 编译时条件交换 三、constexpr 在 <complex> 中的应用1. 编译时复数运算 四、总结 C20 对 constexpr 的增强是其最引人注目…

【ELK】节省存储 之 压缩存储方式调整

目录 集群版本&#xff1a; 7.17.6 解释几个概念&#xff1a; 段&#xff08;Segment&#xff09; 合并(Merge) 索引设置&#xff1a; 压缩方式(index.codec)&#xff1a; 测试设置前提条件 对比 在创建的时候指定压缩类型&#xff08;index.codec&#xff09; 对比 在…

conda create之后,以前的conda env list 只能看到环境路径 没有环境名称了

1.命令 conda env list 看到的显示如下&#xff1a; 左边这列的"base"&#xff0c;指向的路径和其它环境变量安装的路径不一致。 这时需要通过"activate [anaconda的环境路径]"和"source activate"回到anaconda&#xff1a; 2.执行切换命令 …

夸克网盘任务脚本——进阶自动版

脚本是用于自动管理和更新夸克云盘(Quark Cloud Drive)上的文件和目录的Python脚本。其主要功能包括自动下载、更新、重命名、删除文件和文件夹,以及处理和发送通知,可以在特定的时间间隔内运行,根据配置文件进行操作。 主要功能 1. Quark 类: __init__:初始化类,设置…

AsyncHttpClient使用说明书

[[toc]] AsyncHttpClient(AHC)是一个高性能、异步的 HTTP 客户端库,广泛用于 Java 和 Scala 应用中,特别适合处理高并发、非阻塞的 HTTP 请求。它基于 Netty 或 Java 原生的异步 HTTP 客户端实现,支持 HTTP/1.1 和 HTTP/2 协议,适用于微服务、API 调用、爬虫等场景。 1.…

Powershell、Windows Shell、CMD 的区别与联系

Powershell、Windows Shell、CMD 的区别与联系 一、核心概念 名称 全称 类型 发布时间 CMD Command Prompt 命令行解释器&#xff08;CLI&#xff09; 1985&#xff08;DOS&#xff09; Powershell Windows PowerShell 任务自动化脚本环境 2006 Windows Shell Wi…

vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag

vulnhub-Tr0ll ssh爆破、wireshark流量分析&#xff0c;exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套&#xff0c;…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

[特殊字符] 2025蓝桥杯备赛Day7——B2117 整理药名

&#x1f50d; 2025蓝桥杯备赛Day7——B2117 整理药名 题目难度&#xff1a;⭐️ 适合掌握字符串基础操作 考察重点&#xff1a;大小写转换、字符串遍历、边界条件处理 B2117 整理药名 题目描述 医生在书写药品名的时候经常不注意大小写&#xff0c;格式比较混乱。现要求你…

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…

【PCIe 总线及设备入门学习专栏 3.1 -- PCIe 中为何只有 TLP 会被 Switch 和 RC 进行路由?】

文章目录 Overview为什么 DLLP 不需要路由呢?总结Overview 这里介绍些为什么在 PCIe 中只有 TLP(事务层数据包)会被 Switch 和 Root Complex(RC) 路由,而 DLLP(数据链路层数据包)和 Ordered Set 不会被路由。这是因为 TLP 起始于源端口的事务层,结束于目的端口的事务…

大摩闭门会:250321 学习总结报告

如果图片分辨率不足&#xff0c;可右键图片在新标签打开图片或者下载末尾源文件进行查看 本文只是针对视频做相应学术记录&#xff0c;进行学习讨论使用

深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析

引言 Spring Boot 是当今 Java 开发中最流行的框架之一&#xff0c;它以简化配置和快速开发著称。然而&#xff0c;要真正掌握 Spring Boot&#xff0c;理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期&#xff0c;从启动到关闭的各个阶段&…