高可用消息服务消息一致、可靠性、链路稳定性核心关注点

news/2024/4/26 17:36:39/文章来源:https://blog.csdn.net/John_ToStr/article/details/130306068

面临的问题

初期业务主要的场景是直播间的群聊消息以及一小部分的单聊消息。由于是教育场景,所以业务在划分聊天室的时候是以班级为单位进行划分的,假设每个聊天室的人数为500人。

问题一:用户的维护

直播场景的群聊与微信等常见的群聊在用户维护上有很大区别。微信的群用户关系相对比较固定,用户进群退群是相对低频操作,用户集合相对固定。而直播间里的用户进出是非常频繁的,而且直播间是有时效性的。实际进出直播间峰值QPS不会超过1万,使用Redis可以解决聊天室用户列表存储及过期清理问题。

问题二:消息转发

当一个500人的聊天室所有用户同时发送消息时,消息的转发QPS为500*500=2.5w。从直播用户端视角考虑:

​ 实时性:如果消息服务做消峰处理,峰值消息的堆积会造成消息延时增大,而有些信令消息具有时效性,太大延迟会影响用户的体验及互动实时性。

​ 用户体验:端展示各类用户聊天和信令消息一般一屏不会超过10-20条; 如果每秒超过20条消息下发会出现持续刷屏的现象; 大量的消息也会给端上带来持续的高负荷。

因此我们为消息定义了不同的优先级。高优先级消息优先转发处理并且保证不丢弃; 低优先级消息进行一定丢弃策略后再进行转发。

问题三:历史消息

业务上需要生成回放视频,需要获取历史信令、互动聊天等消息。要求能够快速写入历史消息以保证消息转发的时效性。

消息的保存主要包含写扩散和读扩散两大类。我们采用读扩散的方式,读扩散可以减少存储空间,也可以减少消息保存的时间。考虑到回放的优先级不高,所以在存储组件的选择上我们选择了PikaPika是接口与Redis类似可以减少学习、开发成本。同时由于它是采用追加的方式,所以写性能可以与Redis媲美。

问题四:消息顺序

信令消息顺序的要求,需要保证同一个人发送消息的顺序,以及需要保证同一个聊天室内的用户收到消息顺序都是相同的。

解决消息顺序可以使用Kafka之类的队列来保证,但是用Kafka有一定的延迟。为了降低延迟我们采用一致性哈希的策略来处理消息的转发,稍后会详细介绍。

设计目标

打造稳定、高效的消息通讯服务端。

  • 提供高可靠、高稳定、高性能的长连接服务;
  • 支撑百万长连接同时在线;
  • 支持多集群快速部暑,扩容;

稳定性和扩展性

稳定性和扩展性在整体架构是非常重要的部分,消息服务主要的策略是动态配置策略下发,可以有效的实现多机房的动态调度,故障的自动转移,同时也具备了横向扩展的能力。

  • 配置:每个端在连接服务端之前,会获取SDK的常用配置信息,比如重试策略、超时时间等核心参数和业务的调度地址
  • 调度:根据不同的业务类型和用户信息,请求调度地址获取到当前服务的连接地址
  • 连接:向目标服务集群发起连接
  • 故障转移:如果服务中途发生问题导致断线,会再次发起调度,后端集群会重新计算可用的集群,将用户调度到可用集群节点
  • 断线的可能有多种多样,常见的有以下方面:
    • 网络不稳定,导致网络丢包,触发心跳超时
    • 客户端,服务端发生异常,主动关闭连接
  • 在配置和调度接口高可用的层面,会采用多地址轮询,多次重试, CDN 静态资源兜底等策略来依次保障

大家应该会疑问,为什么不把调度地址在第一步的配置服务中一起返回,要拆分为两步进行?这里其实是考虑消息服务支持多业务的并发,配置服务在初始化SDK的时候只获取一次,获取 SDK 的核心控制参数。后续不同的业务可以在不同时机动态获取各自的调度地址,可以有效的提升业务的隔离性和稳定性,做到业务之间互不影响。

安全性

在安全性和抗攻击性方面采取了一系列的措施,对消息内容的加密和账户的安全认证,我们目前采用的方式有:

  • 为每个 App 业务方下发 AppKey,在调度过程中会校验签名,以免不安全的流量拿到调度地址,或者至少需要突破 App 的防御才能拿到
  • 调度拿到的接入地址中会有合法的 Token,服务端 Auth 模块会验证 Token 的时效性以及合法性,以及用户的账户体系,以免不法分子投机,增加破解成本
  • 可动态开启内容加密功能,会获取用户独立的对称加密AES密匙,进行内容加密传输
  • 数据传输使用 TLS / SSL 隧道加密
  • 利用安全的网络环境,比如 IDC 的机房防护,云厂商的智能防护等

连接的稳定性

在真实复杂的网络环境中,可能有极少部分用户网络稳定性方面比较差,存在丢包,导致频繁断线,或者彻底无法建立连接。我们一方面会收集客户端的网络状态日志,对用户进行诊断;另一方面还针对这最后一公里的问题进行网络加速。

   使用云厂商的 TCP 加速,Websocket 加速,解决部分边缘用户的连接问题

   自建边缘节点,可以更加精细化的控制

   海外网络加速,对接多家云服务厂商

可靠性和一致性

作为消息服务的核心保障,分别会在服务端和客户端的架构中重点介绍,主要保障策略为:

  • 消息的严格确认机制,保证客户端发送到服务端的消息,只要确认后,就一定会落盘,从而保障上行消息不丢,之后下行消息可以多次重试
  • 客户端失败重传,排序,超时等策略,主要借鉴 TCP 滑动窗口的思想,可以将已确认顺序的消息返回业务层,乱序的消息要根据策略超时等待
  • 服务端的防止重复提交和重发策略
  • 全局唯一的消息 ID 和局部有序的序列号,来保障唯一性和顺序性

服务端消息ID的设计

消息 ID 的设计对消息的可靠一致性有着非常重要的意义,一方面要保证任何一条消息可追溯查询,保证消息的唯一性;另一方面需要保证消息的顺序性。

全局消息唯一ID 

消息服务生成唯一 ID 的算法借鉴 Twitter 雪花算法 Snowflake,做了一些切合服务的微调。

局部有序的序列ID

在有序序列 ID 上,我们采用一些创新的设计,为每个会话,例如一组单聊,一组群聊都会生成独立的序列号。互相没有影响,可以大幅提升序号的发号性能。序号的主要的目的是为了保障消息的局部顺序性。那么服务端在实现可靠性和一致性上做了哪些工作呢?首先我们对消息结构做了重新设计,新的消息结构如下图:

新的消息结构是类似于单向链表,与传统的单向链表的区别在于链表是逆序的,每条消息都有一个前序消息的 SeqId、本条消息的 SeqId、全局消息 Id (消息追踪使用)。消息的 SeqId 都是针对于聊天对象的,例如聊天室 A 和聊天室 B 的消息 SeqId是相互独立的。

这里采用一个前序 ID 的主要考虑是可以利用单调递增的序列来保障消息的可靠一致性,注意这里并没有要求连续单调递增。比如图中我们的序列号为:101102104107。我们可以采用一些支持海量高性能的序列号生成服务来支持,采用预先分配号码段的策略来提升性能。有兴趣的话大家可以网上查询一些比较成熟的方案。当然,消息体量不大的基础上可以简单粗暴的使用 Redis 生成连续递增的序号。

消息可靠性一致性保障

消息的可靠性一致性主要体现在以下几个方面:

  • 端上收到的消息不丢,不重,不乱序
    有了前面介绍的 SeqId,客户端就可以对消息进行排序、空洞判断等逻辑处理,具体流程如下图:

  • 同一房间内用户看到的消息顺序一致
  • 用户发送的顺序和用户接收到的顺序一致

后面两个特性,服务端主要是通过将同一发送者的消息 Hash 到同一线程中进行处理,同一个房间内的消息,也 Hash 到同一个线程内处理。

  • 发送重传

        客户端如果消息发送失败了怎么保证消息可靠呢?

        为了保证发送重传并且消息不重复我们做了两件事:

  1. 首先同样我们也引入一个序列号,这个序列号是用户级别的,一个用户在线期间只会维护一个序列号,这个序列号是单调递增的。当客户端发送失败时会尝试一定次数的重发,如果 N 次都重发失败会回调通知业务层。客户端重发的时候序列号是保持不变的,因为序列号是单调递增的,所以服务端就可以通过判断序列是否重复来区别是否是重发的消息。

  2. 其次服务端会缓存一定时间的消息发送结果,当判断消息为重传时会查询上一次发送结果,直接把结果返回给客户端。整体流程如下图:

  • 现场恢复

用户遍布全国各地,每个用户的网络情况都不一样,而且质量千差万别,所以对于 TCP 长连接掉线的情况是再正常不过。因为在掉线到重新连接上这段时间内服务端是无法正常将消息转发该用户的,我们通过下图所示的流程来保障用户重连后能收到丢失的消息。

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

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

相关文章

OpenPCDet复现过程记录

0、前言 OpenPCDet项目之前我就复现过,一个很优秀的项目,这几天又需要用到这个项目,再次复现遇到了不少问题,特此记录复现的流程 1、环境准备 1.1、前置条件 以下是我安装的版本 CUDA 11.3CUDNN 8.2.1 CUDA和CUDNN安装可以参考…

61 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库用户

文章目录 61 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库用户61.1 创建用户示例 61.2 查看用户示例 61.3 修改用户61.3.1 修改用户名61.3.2 修改用户示例61.3.3 修改用户密码61.3.4 修改用户密码示例 61.4 删除用户示例 61.5 用户授权示例 61.6 删除用户权限示例 61…

c实例练习笔记(拓展)

本博文参考题目的地址看右边----》C技能树 我跟你说!!!!!c语言有bool类型!!!!!你是不是百度跟你说没有只有c才有? 是有的!&#xf…

统计学 实验5

8.14 总体平均值(μ):7.0 cm 总体方差(σ):0.03 cm 样本平均值(x̄):6.97 cm 样本方差(s):0.0375 cm 样本大小(n&#xff…

数百家数科公司齐聚用友BIP技术大会,共享企业数智化领先实践

4月19日~4月21日,由用友公司主办的“2023用友BIP技术大会“在用友产业园(北京)盛大召开,用友介绍了更懂企业业务的用友BIP-iuap平台,并发布了全面数智化能力体系,助力企业升级数智化底座&#x…

构建高效数据中台——数据只有被使用起来,才能创造价值

产品经理们时常会碰到这种问题: 我刚上线一个功能,请研发同志们帮我拉个数据出来分析,却被残酷告知需要排期。 我这里急得跺脚,但也只能理解。 数据研发们每天有查不完的数据和写不完的表,业务部门要的数据迟迟拿不到&…

CCBN 2023看点分析:国产8K摄像机国产化替代趋势增强

4月21日,为期3天的CCBN 2023(第29届中国国际广播电视信息网络展览会)在北京首钢会展中心圆满落幕,CCBN展会是亚洲广播电视设备展览会,也是中国广电行业规模最大、影响力最强的国际性展会之一,更是广电行业内…

同为科技(TOWE)防雷科普篇(二)——雷击灾害急救方法大全

前 言 当雷击发生时,空气中的各种微粒互相碰撞和摩擦便会使该空气介质两面的正负电荷的量持续积累,这时加于该空气介质的电压也会同时增加,当局部电压达到当时条件下空气的击穿电压时,该空气介质的局部便会发生电击穿而持续成为等…

23种设计模式-代理模式

代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 意图:为其他对象提供…

发展文旅夜游,活络城市文化生态

城市是一个对外的窗口,其夜间文化生态值得进一步挖掘,发展夜间文旅产业,并活络城市文化生态是重要的城市发展举措。实现这一目标需要保护和利用好城市夜景资源、挖掘城市夜生活文化内涵以及利用特色文化吸引夜游人流量。 第一、要保护和利用好…

ArcGIS、ENVI、InVEST、FRAGSTATS多技术融合提升环境、生态、水文、土地、土壤、农业、大气领域应用

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平 点击查看原文 一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 …

20、Theos越狱调试Wallet

前面的总结中使用砸壳重签后的App进行调试,本篇在越狱环境下不重签App进行调试,但是还是需要砸壳获取Headers. 一、Cycript 1.1 在越狱环境中使用Cycript 在越狱环境上,安装Cycript插件.需要先安装adv-cmds插件,因为被Cycript插件所依赖、在Cydia中,安装Cycript 在设备中找到…

苦熬10年,国产操作系统“归零”,新操作系统上新,跟Excel很像

苦熬10余年,国产操作系统自主研发 说到国内自主研发的操作系统,经验最丰富的品牌,当然是麒麟OS. 从诞生到发展,历经10多年的努力,麒麟os逐渐成为了国内自主研发操作系统领域中的一颗耀眼的明珠。麒麟OS不仅推出了许多…

typescript全局安装卸载以及npm相关问题

全局安装 npm install -g typescript 全局安装之后,如果想要卸载要使用 npm uninstall -g typescript 全局安装之后可以在终端使用 tsc xxx 编译ts文件 本地安装,也就是在项目目录下安装 npm install typescript 本地卸载 npm uninstall type…

DHCP 给内网客户端分配ip地址

~ 为 InsideCli 客户端网络分配地址,地址池范围: 192.168.0.110-192.168.0.190/24; ~ 域名解析服务器:按照实际需求配置 DNS 服务器地址选项; ~ 网关:按照实际需求配置网关地址选项; ~ 为…

基于Html+Css的图片展示25

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

自动化工具 基于 Antd+DRF 开发了一款适配 JMeter 的接口自动化测试报告

JMeter Report 基于 AntdDRF 开发的一款 JMeter 测试报告服务,用于在 JMeter 接口测试中使用。 🌴 背景 JMeter 是测试工作中常用的一款工具,除了压测还可以用来做接口自动化的测试。 从事测试多年,接口自动化也做过很多的尝试…

基于PWM技术的三相光伏逆变器研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

一文让你熟练使用 JSONObject 和 JSONArray

依赖 导入阿里的 fastjson 依赖。 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency>类型转换 String 与 JSON 相互转换 通过 JSONObject.parseObject…

面试2个月没有一个offer?阿里技术官的800页知识宝典打破你的僵局~

在经历了一波裁员浪潮后&#xff0c;大环境似乎有所好转&#xff0c;但对于面试者来说&#xff0c;面试愈发困难&#xff0c;现在面试官动不动就是底层原理&#xff0c;动不动就是源码分析&#xff0c;面试一定会抓你擅长的地方&#xff0c;一直问&#xff0c;问到你不会为止。…