分层架构 IM 系统之 Router 假在线分析

通过对分层架构 IM 系统的分析,Router 的核心职责是作为中央存储记录在线客户端与 Entry 节点之间的映射关系,在本质上 Router 是一个内存数据库。

客户端已经离线,Entry 还未感知,或者 Entry 已经感知并且切断了连接,但是 Router 中仍记录着该客户端的在线状态数据;如图中,uid 是 102 的用户已经离线,但是 Router 中仍然记录着 102 与 Entry 节点的映射关系。这样造成的直接后果就是,当要向 102 推送消息时,Router 提供的数据则是无效的。

怎么定性 Router 假在线问题呢?

造成这个问题是不是由于整个 IM 系统的分层架构设计有缺陷呢?不是的, Router 假在线问题是一个合理的异常现象,说 【合理】是因为造成这个问题是正常的,是合理的,不是因为整体设计有问题;说【异常】是因为这毕竟会导致不好的结果,的确是一个问题,是需要解决的!

Router 假在线问题是怎么造成的呢?

客户端是移动设备,处于弱网络的环境中,客户端与 Entry 之间的 TCP 连接是很容易断开的;TCP 连接中断后,其两端节点的反应具有延迟性,到 Entry 捕捉住 TCP 连接中断事件时具有一个窗口期,所以 Router 的数据状态与实际情况不一致就是必然的。

更主要的情况是:Entry 感知到连接中断后,需要通过 Logic 写入到 Router 中进行更新,Logic 是业务模块,升级迭代和进程重启非常频繁,会很容易丢掉 Entry 发送的 “连接中断” 事件,所以 Router 假在线问题就产生了。

怎么避免或解决 Router 假在线问题呢?

既然经常重启的 Logic 导致了 Entry 不能百分百成功写 Router,那是否可以由 Entry 直接写 Router 呢?见下图。

由 Entry 直接写 Router 是不可取的。我们在前面的文章(分层架构 IM 系统之架构解读)中分析过,Entry 的核心职责是维护与客户端之间的长连接,不负责处理任何的业务逻辑;而 Router 中存储了与业务逻辑相关的很多字段(比如:deviceType、deviceToken等),由 Entry 直接访问 Router 会造成极大的耦合性,破坏最初的架构原则。

常见的解决 Router 假在线问题的手段有:

  1. Router 通过自身的心跳扫描机制,扫描并清理掉过期的数据;

  2. Entry 推送消息时,若发现用户已经离线,则 Entry 回调 Logic 的 “unreachable” 接口,由 Logic 清理Router 中的假在线数据;

  3. Entry 推送消息时,若没有收到客户端回复的 ACK 时,Logic 也会修复 Router 中的假在线数据。

对 Router 假在线问题进一步抽象:假在线其实是一个分布式系统的 “数据一致性” 问题,为什么不采用 “强一致性” 方式来彻底消除假在线问题呢?也就是采用 CAP 模型中的 CP 模型。

因为 CP 模型会导致系统的可用性大大降低,在访问 Router 时,Router 需要通过类似于一致性协议的手段与Entry 进行通信确认在线状态,其效率可想而知;在互联网中,尤其是非金融领域, AP模型才是最合适的。

IM 以及其他互联网系统,在研发过程中遇到的所有问题,在实践中需要通过低成本的方式来解决,而不能只站在理论层次来纸上谈兵,即【降本增效】。

最后,总结文中关键:

1、什么是 Router 假在线?简单理解为: Router 认为用户在线,而 Entry 中用户已经离线。

2、怎么定性 Router 假在线?合理的异常现象。

3、 Router 假在线问题是如何造成的?主要因素是 中间节点 Logic 的 “不稳定性”。

4、 怎么解决 Router 假在线问题? Router 自身扫描机制 或 由 Entry 通知 Logic 及时修复。

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

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

相关文章

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

在Java的xml的sql语句里面的某一个参数是list集合的时候

经常在Java里面,遇到这样的问题,sql的一个查询语句,它的某一个参数是一个List集合,然而,在xml.mapper文件里面的时候,不知道如何去组成这个查询语句,不知道兄弟们是否经常忘记如何去写这个语句&…

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具,支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面,适用于学术、商业、金融、法律等多领域,提高数据获取效率。一站式、开源、高质量的数据提取工具&…

一文讲清楚ROS2中多线程、并发、回调组的概念和基础使用

前言 在机器人开发中,多线程的使用司空见惯。ROS2借助executor类帮助开发者简化多线程的使用,但是还是得先把基本概念搞清楚,才能正确的使用。本文解释了ROS1和ROS2中的并发/多线程概念,并且给出了ROS2版本一些实际例子帮助理解。…

《向量数据库指南》——Mlivus Cloud:OPPO的向量数据库选型秘籍

Why Mlivus Cloud? —— 向量数据库选型的深度剖析与实战分享 在当今这个数据驱动的时代,向量数据库作为处理非结构化数据的重要工具,正逐渐受到业界的广泛关注。OPPO,作为全球知名的智能手机制造商,也在这场技术变革中积极探索和实践。他们在向量检索的道路上,从最初的…

MySQL:锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效…

HTMLCSS :动态效果的玫瑰花

这段代码通过 HTML 和 CSS 的结合&#xff0c;创建了一个动态的花朵效果&#xff0c;展示了 CSS 动画和定位的强大功能。 演示效果 HTML&CSS <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equ…

深入浅出:SOME/IP-SD的工作原理与应用

目录 往期推荐 相关缩略语 SOME/IP 协议概述 协议介绍 SOME/IP TP 模块概述和 BSW 模块依赖性 原始 SOME/IP 消息的Header格式 SOME/IP-SD 模块概述 模块介绍 BSW modules依赖 客户端-服务器通信示例 Message 结构 用于SD服务的BSWM状态处理 往期推荐 ETAS工具…

【AI系统】EfficientFormer 系列

EfficientFormer 系列 本文主要介绍一种轻量化的 Transformer 结构&#xff0c;在获得高性能的同时&#xff0c;能够保持一定的推理速度。以延迟为目标进行优化设计。通过延迟分析重新探讨 ViT 及其变体的设计原则。 EfficientFormer V1 模型 EfficientFormer V1:基于 ViT 的…

vue3 vite ts day1

创建项目&#xff1a; npm init vitelatest 来创建项目 第二布&#xff1a; y 第三步&#xff1a;project name &#xff1a;项目名称 第四步&#xff1a;select a framework 选择框架 熟悉那种选择那种&#xff0c;当前选择vue 第五步&#xff1a;select a variant&…

dbus接口方法的variant类型传参详解

python实现c++中so库调用及dbus服务开发-CSDN博客 之前写的这篇博文介绍了如何创建一个dbus服务,但是注册的接口方法的入参还是比较简单的,实际上dbus的参数类型有很多种,调用方式也有多种,我们来逐一介绍下。 其实基础数据类型,如字符串、整型、浮点型、布尔型等大多数…

路由策略一

目录 匹配C类网络全部的子网 ip ip-prefix 1 permit 192.0.0.0 3 greater-equal 25 less-equal 32 ACL的组成&#xff1a; ACL编号&#xff1a;在网络设备上配置ACL时&#xff0c;每个ACL都需要分配一个编号&#xff0c;称为ACL编号&#xff0c;用来标识ACL。不同分类的AC…

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/03

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…

基于 MindQuantum 实现对 “天衍” 量子云平台真机的比特映射

MindQuantum 目前只支持量子模拟器&#xff0c;如果需要获得量子算法在真机上的实测数据&#xff0c;可以借助“天衍”量子云平台提供的真机。本文将介绍如何基于 MindQuantum 绘制“天衍”真机的拓扑图&#xff0c;并进而实现比特映射。 关于 MindQuantum 涉及比特映射的教程…

2025客服知识库工具推荐哪些?

在2025年&#xff0c;企业对于客服知识库工具的需求日益增长&#xff0c;这些工具不仅能够提升客户服务的效率和质量&#xff0c;还能增强客户满意度和忠诚度。以下是几款备受推崇的客服知识库工具。 1. HelpLook AI知识库 HelpLook AI知识库是一款企业级AI知识库系统&#x…

Docker运行hello-world镜像出现错误

错误类型&#xff1a; 解决方案&#xff1b; 配置加速地址&#xff1a;设置registry mirror sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work"…

西南大学软件工程考研录取情况分析

西南大学软件工程学硕近三年呈现出招生规模稳定、复试线稳中有升的特点。2024届实际录取8人&#xff0c;复试分数线305分&#xff0c;复试录取率67%&#xff0c;相比去年复试线略有下降但仍高于2022届&#xff0c;显示出温和的竞争态势。 详细分析 1. 统招录取人数分析 2022-…

【测试工具JMeter篇】JMeter性能测试入门级教程(八):JMeter参数关联

JMeter参数关联&#xff0c;就是请求或者线程之间通过传递参数建立联系。一般&#xff0c;我们将一个请求的响应参数&#xff0c;作为另一个请求的入参。比如登录后的操作&#xff0c;第一步用来实现登录操作&#xff0c;然后将请求返回的token提取出来保存到某一个变量当中&am…

运算符重载(五)

目录 const成员函数const对象不可以调用非const成员函数非const对象可以调用const成员函数const成员函数内不可以调用其它的非const成员函数非const成员函数内可以调用其它的const成员函 取地址及const取地址操作符重载const补充场景1场景2场景3场景4 const成员函数 将const修…