大规模群消息推送如何保证实时性?

第一版红包功能上线后,收集到不少问题。核心问题是消息延迟,导致有些人先看到红包,有些人晚看到红包,同时导致消息顺序混乱。

分析一下问题产生的原因:

消息量瞬间大增。抢红包时大家都比较活跃,不停在群里发消息,尤其群成员比较多的群(500人),每条消息都会给服务端带来大量的计算工作。

后台逻辑不够优化。比如红包消息没有单独的通道,时效性会受到其他消息影响;没有采用批处理方式;异步处理有些环节还不到位。

先看一下系统架构和消息处理流程(如下图):

大规模群消息推送如何保证实时性?

精确定位问题:

c2g模块没有采取批处理方式。1条群(500人群)消息到达c2g模块后,c2g模块为每个人写收件箱(这里时间延迟较大,优化点),然后将这条消息变成500条投递消息(需要批处理,就给Kafka放入一条消息),通过Kafka送给Deliver节点投递。

Deliver模块,会到Redis中逐条(500条)检索接收消息用户的在线状态(这个点需要批处理,根据用户Id分布,一次检索若干用户的在线状态),在线的投递消息(批处理),离线的发送第三方push(批处理)。

整体流程上,每条消息是先写了离线收件箱,再推送。这样效率也不高,需要对这个流程细化以及异步化。

看一看微信在这个逻辑上的一些优化思想:

大规模群消息推送如何保证实时性?

微信在这块的一个重要优化思想是批处理,腾讯的做法是单次批量操作(我们本次优化目标)裸写,多条消息的聚合(MapReduce过程)下沉到了MQ中间件中。

具体怎么做:

红包逻辑单独部署

现阶段,当消息(尤其是大群消息)量大的时候,Deliver节点会成为瓶颈。红包对时效性要求很高,架构上采用独立为红包部署Deliver节点的方式确保红包消息走单独通道进行推送。即使其他消息出现延迟,红包消息依然能保证及时送达。

大规模群消息推送如何保证实时性?

裸写批处理逻辑

处理一条群消息,服务端要进行大量的工作,需要查询所有群成员的路由表、在线状态,在线人员需要推送及时消息,离线人员需要推送第三方push(比如IOS的apns)。这些工作逐条执行,性能会非常差,如果遇到大群,系统会不可用。

批处理可以较好解决这个问题。比如用户状态及路由表数据,采用hash算法分布在几台服务器上。收到群消息后,根据群成员,计算出用户状态及路由表数据的分布情况,从缓存服务器中一次检索出该服务器可能存在的所有群成员状态及路由信息。这样可以极大减少RPC调用次数,及计算量。

推送操作也类似,批量向接入层投递消息即可。

ViiTor实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译 离线消息异步写收件箱

在处理大群消息推送时,写离线消息也是一个非常影响性能的地方。现有的逻辑是先为每个人写一条离线消息,再执行推送。这样做的初衷是确保消息投递绝对可靠(参看《一个海量在线用户即时通讯系统(IM)的完整设计》的离线消息章节)。由于大群人数较多,写离线消息也有较多时间开销。

优化思路是现将消息及时推送给用户,再异步写离线消息,同时处理好写离线消息和推送消息的ack时序。

具体步骤如下图:

大规模群消息推送如何保证实时性?

(1)Deliver节点收到一条群消息,检索用户在线状态及路由信息,用户在线(离线的逻辑相对简单,略过)

(2)批量推送消息(2、批处理逻辑)

(3)异步将消息写入消息总线,同时写入第三方push的延迟推送任务

(4)异步写离线消息(不影响在线用户收到消息的速度)

(5)第(2)步推送消息的ack信息回到服务端

(6)c2g模块将ack信息放入消息总线。(确保消息时序性,ack需要在写离线消息之后处理,否则可能出现消息重复)

(7)删除对应的离线消息

(8)第(3)步写入的延迟推送任务,在规定时间(如10秒)后生效,判断是否存在此条离线消息(如果ack回来了,离线消息会被删掉),如果离线消息还存在,发送第三方push

通过以上3个方面的优化,能够确保在并发消息量较大时,推送消息依然及时。

相关阅读:

基于消息总线的高可扩展性IM系统后台架构设计

IM系统海量消息数据是怎么存储的?

一个海量在线用户即时通讯系统(IM)的完整设计

以上就是大规模群消息推送如何保证实时性?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/348649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
傲腾内存(Optane)的遗产:在专业应用中的低延迟优势
上一篇 2025年11月5日 21:26:25
深圳传感器又要“出圈”了,1000多家国内外企业齐聚助推AI落地应用
下一篇 2025年11月5日 21:26:35

相关推荐

  • WPS怎么办批量打印文件_WPS多文档批量打印与队列管理步骤

    使用WPS内置批量打印功能,通过工具→批量处理→批量打印添加文件并设置参数后一键打印;2. 在资源管理器中多选文件右键以WPS打开,再在文件菜单中选择打印所有文档;3. 通过控制面板的设备和打印机进入打印队列,可实时监控、暂停或取消任务,确保批量打印过程稳定可控。 如果您需要在短时间内处理多个WPS…

    2026年9月24日
    400
  • Intel OpenCAS缓存加速方案

    open cas 架构概览:数据从hdd盘读取后被复制到open cas的缓存中,后续的读取操作从内存中进行,从而提高读写效率。在write-through模式下,所有数据同步刷新到open cas的ssd和后端的hdd中。在write-back模式下,数据同步写入到open cas的ssd中,然后…

    2026年9月24日
    400
  • windows8如何取消开机密码_windows8取消开机密码的操作

    1、通过netplwiz取消密码验证并设置自动登录;2、在控制面板中更改密码为空实现无密码开机;3、使用命令提示符执行net user命令清除账户密码,三者均可实现Windows 8.1启动时跳过密码输入。 如果您希望在启动Windows 8系统时跳过手动输入密码的步骤,可以直接通过系统内置工具配置…

    2026年9月24日
    000
  • iPhone8Pro微信收款语音怎么开启?教你一步步设置语音提醒

    iPhone8Pro微信收款语音怎么开启?教你一步步设置语音提醒iPhone8Pro微信收款语音怎么开启?教你一步步设置语音提醒iPhone8Pro微信收款语音怎么开启?教你一步步设置语音提醒iPhone8Pro微信收款语音怎么开启?教你一步步设置语音提醒

    首先在微信内开启收款到账语音提醒,再确保iPhone通知权限、音量及勿扰模式设置正确,即可实现收款语音提醒;若不响,需检查微信开关、系统通知、静音状态、网络等;该功能可即时确认收款、提升效率、防范风险;同时应设置支付密码、生物识别、安全锁并定期查账单,保障资金安全。 在iPhone 8 Pro上开启…

    2026年9月24日 用户投稿
    000
  • Java中固定长度用户ID输入验证:解决int类型长度检查问题

    本文详细介绍了在Java程序中如何实现用户输入固定长度ID的验证机制。针对常见的int cannot be dereferenced错误,我们将探讨将ID作为字符串读取并进行长度及格式校验的最佳实践,并提供处理字母数字型和纯数字型ID的示例代码,确保数据输入的准确性和程序的健壮性。 引言:用户输入验…

    2026年9月24日
    500
  • Laravel 表单验证失败后保留输入值:最佳实践教程

    本文旨在帮助 Laravel 开发者解决表单验证失败后,如何保留用户已输入数据的问题。我们将深入探讨 withInput() 方法的使用,并提供清晰的代码示例,确保即使在验证失败的情况下,用户体验也能保持流畅。通过本文的学习,你将掌握在 Laravel 中优雅地处理表单验证,并提升应用的可用性。 在…

    2026年9月24日
    000
  • 怎么在mysql中创建数据库表 mysql建表完整流程解析

    在 mysql 中创建数据库表的步骤包括:1) 选择合适的数据类型,如 int、varchar、timestamp;2) 设置索引,如主键和唯一索引;3) 应用约束条件,如 not null 和 unique;4) 设计表结构以满足业务需求,如使用 foreign key 和 enum;5) 优化性…

    2026年9月24日
    000
  • 电脑网络连接限制为100Mbps怎么办_网速被限制的解决方法

    首先确认网卡是否支持千兆速率,进入设备管理器查看网络适配器型号并核实规格;接着在网卡属性中将“速度和双工”设置为1.0 Gbps全双工或自动协商;更换符合Cat 5e及以上标准的网线,确保物理连接可靠;检查路由器或交换机端口设置,确保未强制限制为100Mbps;更新或重装网卡驱动程序至最新版本;最后…

    2026年9月24日
    100
  • win10软件不兼容怎么办_win10软件兼容性处理方法

    首先使用兼容性疑难解答工具检测并修复问题,若无效则手动设置兼容模式为Windows 7或8,同时安装必要的Visual C++和.NET运行库,更新显卡等驱动程序,并尝试以管理员身份运行程序。 如果您尝试在Windows 10系统上运行某个软件,但出现“此应用无法在你的电脑上运行”或程序闪退等错误提…

    2026年9月24日
    000
  • VSCode 怎样配置终端默认路径 VSCode 终端默认路径的配置技巧​

    在 vscode 中配置终端默认启动路径需修改 terminal.integrated.cwd 设置项;2. 可通过用户设置(全局生效)或工作区设置(项目专属)进行配置,优先级为工作区设置覆盖用户设置;3. 路径可使用绝对路径或相对路径(推荐相对路径以提升协作性),windows 系统需注意反斜杠转…

    2026年9月24日
    000
  • OriginOS 6 深度体验:当操作系统回归「体验为王」

    OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」

    2020 年,智能手机刚刚进入 5g 普及阶段,手机的硬件与软件都迎来了一次迭代浪潮——新形态的需求对操作系统的设计与交互都提出了诸多新的问题,originos 的首个版本,可以看作 vivo对这些问题的回答。 彼时,我曾有机会与 OriginOS 开发团队沟通,正如 OriginOS 的中文名原 …

    2026年9月24日 用户投稿
    100
  • 《Python完全自学教程》免费在线连载1.5

    《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5

    说明: 本节内容,是针对非计算机专业的读者提供的补充知识。 1.5 操作系统 本节不是全面介绍操作系统知识,是提醒读者从开发者的角度认识自己的操作系统——根据多年的经验,至少要能熟练使用一些命令完成常见操作。 首先要声明硬件设备,本书所演示的代码都是基于个人计算机( Personal Compute…

    2026年9月24日 用户投稿
    700
  • 迅雷浏览器怎么开启深色模式_迅雷浏览器夜间模式设置

    开启迅雷浏览器深色模式可减少夜间用眼疲劳,具体方法包括:一、通过浏览器菜单进入设置,选择外观中的深色或夜间主题,或开启“跟随系统”选项实现自动切换;二、在操作系统中启用深色模式(Windows路径为“设置>个性化>颜色”,macOS为“系统设置>通用>外观”),并确保浏览器版本最新以兼容显示;三、若…

    2026年9月24日
    100
  • windows11控制面板在哪里打开_windows11进入传统控制面板的办法

    windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法

    1、通过Win+R输入control命令可快速打开控制面板;2、任务栏搜索“控制面板”并点击结果即可进入;3、开始菜单中展开“Windows 工具”文件夹可找到控制面板;4、文件资源管理器左侧导航栏下拉选择控制面板;5、桌面新建快捷方式输入explorer shell:ControlPanelFol…

    2026年9月24日 用户投稿
    200
  • 如何解决MySQL安装时配置不生效的处理方法?

    如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?

    配置mysql时遇到配置不生效的问题,常见原因包括配置文件路径错误、语法问题、命令行参数覆盖及数据目录权限或初始化问题。1. 配置文件路径是否正确?mysql只会读取特定路径的配置文件,建议使用命令mysql –help | grep “default options&#82…

    2026年9月24日 用户投稿
    000
  • 三星S系列手机微信收款语音播报怎么开启?配置语音的详细方法

    要开启三星S系列微信收款语音播报,需先在微信“收付款”中开启“收款到账语音提醒”,再确保手机通知权限开启、媒体音量正常,并将微信设为电池不优化应用。 三星S系列手机要开启微信收款语音播报,核心步骤其实不复杂:首先要在微信应用内部找到并激活“收款到账语音提醒”功能,同时,非常关键的一点是,确保你的三星…

    2026年9月24日
    100
  • VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    vscode通过集成语言服务协议(lsp)、内置quick fixes和refactoring actions,并结合扩展如eslint、prettier等,实现代码自动修复与智能重构;2. 启用editor.formatonsave和editor.codeactionsonsave设置可在保存时自…

    2026年9月24日 用户投稿
    100
  • win10更新后网络适配器不见了怎么办_win10网卡驱动丢失修复教程

    网络适配器在Win10更新后消失主因是驱动不兼容或丢失,可依次重启检查物理开关、扫描硬件改动、显示隐藏设备并启用、重置网络协议栈、手动更新或回滚驱动解决。 如果您在完成Windows 10系统更新后发现网络适配器无法识别或完全消失,这通常是由于新版本系统与现有驱动程序不兼容、驱动在更新过程中被错误替…

    2026年9月24日
    100
  • IOS17新功能大

    一、个性定制与操作体验的全面进化 在ios 17中,苹果显著提升了系统的个性化能力。用户现在可以对锁屏进行更深层次的自定义,包括自由搭配背景图像、调整色彩主题以及更换字体风格,轻松打造专属视觉风格。新增的“动态壁纸”功能让主屏幕更加生动,随着设备角度变化呈现出不同的视觉效果。同时,通知系统也更加智能…

    2026年9月24日
    400
  • VSCode如何运行终端命令 VSCode内置终端的使用指南

    在VSCode里运行终端命令,最直接、最核心的方式就是利用它内置的集成终端。这玩意儿简直是开发者工作流的“心脏”,你可以在不离开编辑器界面的情况下,直接敲入并执行各种命令行操作,无论是跑测试、安装依赖,还是启动项目,都方便得要命。它把代码编辑和命令执行无缝衔接起来,大大减少了上下文切换的开销。 解决…

    2026年9月24日
    200

发表回复

登录后才能评论
关注微信