深度 | Web 3.0时代去中心化IM 的挑战与思考

news2024/9/20 19:38:34

前言

Web3.0时代的重要特点:

1、数据主权

用户将拥有自己的数据主权,用户所创造的数字内容,所有权和控制权都归属于用户,用户所创造的价值可以由用户自主支配。对于IM业务,就是用户的好友列表,聊天消息等数据属于用户,不属于任何商业机构。

2、去中心化

这个业务网络不被任何人和组织所控制,任何人和组织都可以参与这个网络,随时都可以加入和退出,为全网用户提供服务。用户不属于任何组织,组织是服务提供者不是用户的拥有者。

基于以上Web3.0两个特点,可以推导出Web3.0对IM的技术需求:

1.、动态网络:网络服务节点是动态的,全球任何一个地方的节点都可以随时加入和退出网络,任何节点的崩溃和退出都不影响网路正常运作。

2.、数据安全:用户数据必须是加密的,聊天消息要支持端到端加密安全,服务节点只做存储与转发,无法查看聊天消息和好友列表等数据内容。

这些需求对技术架构和实现具有非常大的挑战。

第2点需求意味着需要支持动态扩容和索容。大家都知道,传统web2.0技术是基于中心化的,服务器规格统一,性能都比较好,服务器之间的网络延迟极小一般在1毫秒以下,集群出口带宽可达到千兆甚至万兆。即使是在这么好的条件下,动态平滑地扩容和缩容,服务平稳运行都不是一件容易的事情。在去中心化环境中,参与网络的节点的性能,配置,可靠性,网络带宽等参差不齐,机器随时都可能关机,网络随时都可能断开,甚至还可能存在一些恶意节点,发送恶意数据影响网络正常运行。这些因素都是在设计和实现去中心化IM所要面对和考虑的,当然从另一个角度来看,如果这些问题都能得到解决,解决方案也可能反过来应用到中心化服务架构中,增强中心化服务的稳定性和鲁棒性。

在传统web2.0技术架构中,异地多活是一座高峰,是高可用服务架构的极致追求。从某种程度上来说,异地多活已经接近去中心化架构,所以我们先来重温一下异地多活架构,看看有哪些方面可以借鉴的。

图片引用自 《搞懂异地多活,看这篇就够了》

异地多活的思路和关键点:

• 提供一个路由层,对用户按地域或哈希把用户分配到某个机房

• 同一个用户的相关请求,只在一个机房内完成所有业务「闭环」,不再出现「跨机房」访问

• 机房之间互为热备份,每个机房都保存所有用户全量数据

• 当某个机房发生灾难时,备份机房的从库升级成主库,并在路由层切换用户到备份机房

异地多活的思路对于去中心化架构是非常具有借鉴意义的,可以把机房看成是一个节点,当无数个机房(节点)组成一个网络时,异地多活架构就泛化成了去中心化架构。

当然量变引发质变,当节点足够多时,传统的异地多活技术已经不能直接适用于去中心化架构,必须经过改进和改造才能为去中心化架构所采用。去中心化架构是另一座更高的山峰。

路由网络

路由网络的作用类似于异地多活中的路由层,提供了资源和服务发现(discovery)的服务。比如对于用户张三,我们需要知道当前服务张三的节点到底在哪里。一个直观的方案,是一个一个节点地问(查找),效率低下。在去中心化架构中,常用的路由发现技术是Gossip协议和Kademlia网络。

Gossip协议

Gossip协议的灵感来自于“好事不出门坏事传千里”,“办公室里的流言蜚语很快就传遍全公司”。比如张三连接的节点1随机向临近节点广播“张三在节点1上”, 临近节点再随机向它的临近节点广播,即一传十,十传百,消息很快传遍全网,所有节点都知道“张三在节点1上”。反过来,如果节点2不知道张三在哪里,它可以向全网询问“张三在哪里”,在传播的过程中,如果有节点指知道张三的地址,立即向节点2返回张三地址,结束查询过程。Gossip不是一个新的东西,大家熟知的redis集群采用了Gossip协议。

Gossip的优点是对网络的连通性和稳定性几乎没有任何要求,具有极强的鲁棒性。缺点是网络中的消息太多,而且有重复消息,增加了网络传输压力和节点的额外处理负载。

Kademlia网络

Kademlia是一种分布式哈希表(DHT)技术,被广泛应用于去中心化产品中,比如大家熟知的以太坊,磁力下载等。Kademlia 把成千上万个节点构成一个自我组织的网络,用户可以使用这个网络快速查找定位到资源。关于Kademlia技术在网络上能找到很多相关文章,但大多数都拘泥于细节中,这里简单介绍Kademlia的原理,能解决什么问题,至于详细原理请自行搜索其他文章。

1. Kademlia网络是一个索引网络,解决的是如何快速定位资源位置的问题

2. 每个资源都有唯一的哈希值

3. 每个节点都有唯一的哈希值

4. Node-900拥有一个资源,资源的哈希值是100

5. Node-900 把资源发布到与资源哈希值最近的Node-100(距离等于0)

6. Node-100的记录了一条目录,“哈希100的资源保存在Node-900上”

7. Node-800 想要访问资源-100,通过哈希值找到Node-100,再根据目录访问Node-900找到资源

8. 目录数据的高可用与冗余

a. 资源拥有者Node-900发布到距离资源最近的k个节点,比如 Node-99(距离为1),Node-100(距离为0),Node-102(距离为2)

b. 同样地,访问者访问距离资源最近的k个节点获取目录

c. 因为网络节点不断地上线下线,距离资源最近的k个节点集合会不断变化,所以资源拥有者Node-900 要周期性地发布资源,比如Node-100下线后,k个节点集合变成 Node-99(距离为1),Node-102(距离为2),Node-103(距离为3)

9. Kademlia的距离是逻辑距离,不是物理距离,两个逻辑距离很近的节点,物理上可能相隔很远。

消息顺序

IM 的核心功能是消息收发。在中心化架构中,所有上行消息通常都会归拢到一个地方,所以消息先后顺序由中心化来保证。但在去中心化架构中,上行消息可能是从不同的节点过来的,接收消息顺序可能会乱序。具体例子:

C先收到B的消息,后收到A的消息,导致最终C的聊天记录和A/B的不一样。

解决方案:

• 时间戳

每条消息都打上一个时间戳,在接收端根据时间戳排序。但是去中心化网络中,节点间的时钟不可能完全同步,仍然存在先后顺序错乱的可能性。

• 依赖消息

每条消息都带有依赖消息Id,表示当前消息排在依赖消息之后。客户端在收到一条消息后,先检查其依赖消息是否都已经收到并且上屏,如果没有收到则先暂存消息,直到所有依赖消息上屏。此方案的缺点是增加客户端处理消息的复杂度。

端到端加密

因为任何人都可以加入去中心化IM网络,任何节点都可能接触到消息,所以为了隐私和安全,消息必须是端到端加密的。常用的端到端加密方案是Diffie–Hellman 密钥交换协议(DH),可以使通讯双方无需预先沟通,在不安全的网络中即可确定一个“协商密钥”,这个密钥可以在后续的通讯中作为对称密钥来加密消息内容,这样避免了双方网上协商密钥带来的泄露风险。

从图中可以看出在网络上传输的是公钥,真正用来加密的“对称密钥S”是计算出来的,并没有通过网络传输,非常安全。但是如果所有消息都用同一个对称密钥S,一旦S被破解得到则所有消息都会被破解。最好的办法是每条消息都用不同的密钥,即一消息一密钥。

• 通过密钥函数计算得出消息密钥

• 密钥函数通常为不可逆函数,即知道输出很难反向计算出输入,比如大家熟知的哈希函数就是不可逆函数

• 密钥函数的输出被分为链密钥和消息密钥两部分,链密钥作为下一次密钥函数的输入,消息密钥用来加密消息

• 重复这个过程,即链式反应

链式反应生成的密钥虽然很安全,但带来一个新的问题,即如何读取历史消息。读取历史消息通常是从某条消息开始拉去n条消息。从上图可以看出,要想得到“消息密钥2”,必须从初始密钥开始计算2次才能得出,如果要得到“消息密钥10000”,则要计算10000次才能得出,显然这样做的效率非常低下。

推送

推送是IM业务里比较重要的功能,在app退到后台或者被杀死,仍然可以通知到客户。在去中心化IM架构中,因为消息是端到端加密的,节点在给app发送推送时,只有提醒“您有一条新消息”,不会有消息内容。这是在隐私保护与用户体验之间的妥协与平衡。

开源现状

目前在开源社区比较接近去中心化IM理念的产品matrix。

matrix的特性:

• 每个用户都有归属于一个Home Server,用户名格式@user:domain,比如 @Alice:163.com , 跟e-mail邮箱名很类似

• Home Server之间采用联邦式协议,Matrix网络由分布在世界各地,由不同个人和组织运营的服务器组成,因此Matrix协议不容易被单个组织垄断

• 私聊和群聊是端到端加密的,所有聊天内容加密存储、加密传输。Home Server无法看到用户的聊天内容

• 默认使用HTTPS+JSON APIs作为传输协议

• 可以通过Bridge与 Telegram, Discord, WhatsApp, Facebook, Hangouts, Signal 互通

• 支持通过WebRTC进行音视频通话

matrix的缺点:

-用户ID(地址)成本高,因为 @Alice:matrix.com 带有域名后缀,如果用户想拥有永久Id,必须购买域名。如果使用SP的域名,则用户Id本身并不被用户所拥有,这跟web3的理念是相违背的。

- matrix是 https + json,优点是容易理解,缺点是占用更多带宽,并且在序列化和反序列化时会消耗更多的cpu。

- Home Server之间是全连接(full mesh)方式,当参与的Home Server比较多时,比如有上千甚至上万个Home Server时,Server之间的连接消耗会导致性能急剧下降。

总的来说 matrix 更像是一个去中心化的e-mail,距离真正的去中心化还有一些差距。

目前Web3的技术创新和变革也是风起云涌,不断有新的算法和架构出现。环信作为国内IM云服务的开创者,在设计下一代IM技术架构时,也在积极借鉴和探索这些前沿技术,为我们的客户提供稳定、可靠、专业、低成本高质量的IM服务,为客户赋能和创造更多的价值。

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

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

相关文章

windowXP系统无法正常访问vue3网页

开发完的vue3项目需要在XP系统环境使用 由于在立项时采用了开发成本较低速度较快的vue3技术栈,并没有考虑到工厂的设备仍然在试用二十年前的机器,导致项目上线后有部分人员打开页面展示白屏。 经过排查,发现由于vue3使用ES6的Proxy代理实现响…

Linux-目录结构及文件基本操作

目录1、Linux目录结构1.1 FHS标准1.2 目录路径2、Linux文件的基本操作2.1 新建2.2 复制2.3 删除2.4 移动文件与文件重命名2.5 查看文件2.6 查看文件类型2.7 编辑文件1、Linux目录结构 Linux的目录结构和Windows的目录结构在实现上是完全不同的 Windows以存储介质为主&#xff…

Vue-Cli 脚手架 搭建 Vue项目

本篇目开始进行Vue基于项目中的介绍,Vue-cli 是官方提高用于搭建基于 Vue、Webpack、ES6 项目目的脚手架工具,可以前往在线官网查看:—— 官方文档 | Vue CLI 。 安装npm 1. 检测是否安装了Node.js ,未安装请前往下载;…

【内网安全-隧道搭建】内网穿透_Ngrok上线(美版、国版二开)

目录 一、准备 1、意义: 2、项目: 二、内网穿透 1、简介: 三、Ngrok(入门上线) 1、简述: 2、Ngrok入门上线(国版二开) 3、相关工具: 2、Ngrok入门上线&#xff…

低代码开发平台|SRM-招投标管理搭建指南

1、简介1.1、案例简介本文将介绍,如何搭建SRM-招投标管理。1.2、应用场景企业根据采购需求创建招投标需求,选择供应商进行邀标,供应商报名再投标,投标结束评标人员对投标项目进行评估。2、设置方法2.1、表单搭建1)新建…

Python build Exe 使用PyInstaller创建可执行的Python脚本

在本指南中,您将看到如何使用PyInstaller创建Python脚本的可执行文件? 下面是在Windows中实现这一目标的完整步骤。 使用PyInstaller创建可执行文件的步骤 步骤1:添加Python到Windows路径 首先,您可能想要将Python添加到Windows路径。 将Python添加到…

Spring Boot整合Redis笔记

文章目录前言Java 操作 RedisJedis 操作-测试Jedis 实例-手机验证码Redis与Spring Boot整合整合步骤Redis 的事务操作Redis的事务定义Multi、Exec、discard 基本命令事务冲突的问题为什么要做成事务悲观锁乐观锁WATCH key [key ... ]Redis事务三特性Redis事务秒杀案例解决计数器…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案…

docker-compose容器编排部署

docker-compose部署微服务1、Docker-Compose是什么?2、应用场景3、docker-compose部署SpringBoot项目3.1 编写Dockfile3.2 编写docker-compose.yaml3.3 修改工程配置3.4 将相关文件上传到服务器3.5 执行docker-compose up本文是对DockerNginx打包部署前后端分离项目…

E5061B矢量网络分析仪VNA概念

矢量网络分析仪VNA是一种测试仪器,它可以将网络的响应测量成矢量:实参数和虚参数,从而表征其性能。矢量网络分析仪VNA是射频设计实验室和许多制造和服务领域的重要测试仪器。虽然矢量网络分析仪主要侧重于研究和开发,但它也可以为所有类型的R…

2月3日 读书笔记

我们将程序改善一下,让程序在按下一个键后不结束,而是把所按键的编码在画面上显示出来,这样就可以切实完成中断处理程序了。 所谓中断处理,基本上就是打断CPU本来的工作,加塞要求进行处理。而且处理中断期间不再接收别…

创业30载,百亿市值奥瑞金未来可期

1994年,关玉香在海南文昌破土兴建海南奥瑞金包装实业有限公司(原名:文昌奥瑞金制罐公司),与儿子周云杰一起带领着16名工人进入了金属包装行业,从0到如今的百亿市值,就此拉开了一路“封神”的序幕…

字符串(一)BF算法与KMP算法

给一个主串s,在给一个子串substr,判断substr是否为s的子串 一、BF 暴力搜索 暴力,依次逐个比较字符,先从主串和模式串的第一个字符开始,如果相等一起比较下一个字符,如果不相等,那么重新回到模…

PTA L1-032 Left-pad(详解)

前言:本期是关于L1-032 Left-pad的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗? 题目: 根据新浪微博上的消息,有一位开发者不满NPM…

SpringCloud Alibaba—— 微服务网关GateWay

目录 1、GateWay网关概述 1.1、什么是GateWay? 1.2、为什么要使用微服务网关? 1.3、Zuul与GateWay网关的区别? 2、快速入门 2.1、创建项目 2.2、配置yml文件 2.3、controller层 2.4、启动类 2.5、启动整体项目 2.6、配置全局过滤器…

代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

一、昨日回顾与补充今天看了Day16讲解的视频,对于求二叉树最大深度、最小深度以及求完全二叉树的节点个数有了新的理解,总结如下:1.深度和高度的区别(之前就看看定义忽略了)二叉树节点的深度:指从根节点到该…

jvm垃圾收集器有哪些

Serial收集器 Serial收集器是最基本,发展最悠久的收集器,在JDK1.3.1之前是虚拟机新生代垃圾回收的唯一选择。这个收集器是一个单线程的。它的单线程的意义并不仅仅说明它只会使用一个CPU或者一条收集线程去完成收集工作,最重要的是&#xff…

量化选股股票和量化交易的两者有什么区别?

最近a股在频繁波动后终于开始走强。近几个月来,一些净值明显下降的量化产品业绩终于实现了阶段性回升。与此同时,根据金融终端,量化私募管理的规模已经超过1万亿元。面对目前市场上大量超额收益和大幅波动带来的不合理定价带来的收益&#xf…

磨金石教育摄影技能干货分享|春节街拍欣赏:大街上的年味

当然还有很多人依然沉浸在过年的喜庆氛围中,我们一般把除夕到十五这个期间段都归入春节期间。在这个时间段内街道上都是喜庆的氛围热热闹闹,年味十足。过了除夕之后,春节娱乐的主题除了走亲访友,就是出行了。春节小长假&#xff0…

jmeter脚本处理加密验签

一 、账号密码加密 1.1 背景: 一个登录接口,账号是明文传输,但是密码要先经过加密,再做传输。 比如: 一个用户,账号为123465 密码为 abcde 实际上登录接口,请求,传参为 账号 1…