大规模IM在线用户的计算和数据存储方案

2023-11-16

用户模型以及概念

在线消息用户模型 
月活量:基本上是总用户量,一个月不活动的用户基本上是死用户 
日活量:一天中大于一定活跃时间的用户 
峰值用户:一天中用户在线最高峰的用户总量 
峰值并发用户:峰值用户可以同时在一秒钟发出一条消息的用户

业务消息的计算模型

当前假设为简单的单一业务,实际情况会更复杂 
1、如果一秒钟处理1000笔请求(每条都进行存储),那么一天的数据量是:24*60*60*1000=8640万;如果每秒1万笔的话,数据大概是8.64亿 
2、行业里一般的统计方法是峰值是日活量的五分之一,日活是总用户的8%,峰值用户产生并发的转化率为:0.5%到1%就不错(网络游戏可能有点不一样,会高一点) 
3、峰值用户: 1万/0.01=100万 
4、日活跃用户:100万*5=500万 
4、月活跃用户:500万/0.08=6250万 
5、付费用户一般是月活跃数的5%来进行计算

业务保活消息计算模型

参考:微信Android客户端后台保活经验分享 
https://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=403254393&idx=1&sn=8dc0e3a03031177777b5a5876cb210cc&utm_source=tuicool&utm_medium=referral 
运营商NAT超时时间如下 
运营商nat超时时间 
1、按照微信4.5分钟做一次心跳,100万峰值用户的心跳消息量:100万/(4.5*60)=0.37万 
2、假设每台机器长连接处理能力为:10万/台,需要对应的接入的计算机为10台,不考虑冗余

数据存储方案

这部分的数据存储主要是实时消息的的存储,针对在线的实时处理方案,当前流行的是使用redis,个人认为比较成功的方案有: 
1、 redis缓存,数据库持久存储 
方案参考:http://blog.codingnow.com/2014/03/mmzb_redis.html 
  在数据服务器的物理机上启动一个监护服务。当游戏服务器向数据服务推送数据并确认成功后,再把这组数据的 ID 同时发送给这个监护服务。它再从 Redis 中把数据读回来,并保存在本地。 
  因为这个监护服务和 Redis 1 比 1 配置在同一台机器上,而硬盘写速度是大于网络带宽的,它一定不会过载。至于 Redis ,就成了一个纯粹的内存数据库,不再运行 BGSAVE 
2、redis缓存,levelDB存储 
参考:http://bbs.chinaunix.net/thread-3777230-1-1.html 
  RedisStorage 是基于 redis 2.6.2基础上,加上 leveldb存储引擎。 这个项目是源于 公司项目的passport 用户认证改造。 
总结:单纯使用redis做缓存和数据存储是个坑

redis相关的资料

redis二种数据存储方法 
  SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:• SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。

redis重要参数回顾 
http://blog.itpub.net/29254281/viewspace-2099173/

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/everlasting_188/article/details/51456156
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大规模IM在线用户的计算和数据存储方案 的相关文章

  • 写入操作的 Netty ChannelFuture 何时“完成”?

    在 Netty 4 中 确切地说 什么时候ChannelFuture对于写操作 假设NioSocketChannel 变得 完成 Netty 是否等待ACK包 中的输入和输出处理程序之间是否存在相互依赖关系 ChannelPipeline将
  • netty源码:(24)EventExecutorChooserFactory类

    该类定义了一个内部接口EventExecutorChooser 该接口有一个方法 next EventExecutorChooserFactory类有个默认实现类 DefaultEventExecutorChooserFactory 该类有
  • Java NIO 窗口实现

    在使用 NIO 2 AIO 功能进行项目时 我查看了 旧的 NIO 选择器实现 发现在 Windows 上使用了默认的选择函数 由于内部实现不良 该函数在 Windows 上根本无法扩展 大家都知道 在 Windows 上 IOCP 是唯一
  • 使用 Netty 的 UDP 服务器中丢失大量 UDP 请求

    我用 Netty 编写了一个简单的 UDP 服务器 它只是在日志中打印出收到的消息 帧 为此 我创建了一个简单的帧解码器解码器和一个简单的消息处理程序 我还有一个可以顺序和 或并行发送多个请求的客户端 当我配置我的客户端测试器以顺序发送数百
  • Netty 支持哪个 TLS 版本? TLS 1.0、1.1 还是 1.2?

    Netty 支持哪个 TLS 版本 TLS 1 0 1 1 还是 1 2 我在看http netty io 5 0 xref io netty handler ssl SslHandler html http netty io 5 0 xr
  • 使用多个线程处理单个连接

    我有 3 个异步服务器和客户端 它们像一条链一样相互连接 一个请求会经过 3 个系统 例如 gt System 1 gt System 2 gt System 3 gt 和回应 gt System 3 gt System 2 gt Syst
  • 使用 TLS 1.2 将客户端连接到 TCP 服务器

    我尝试将设备连接到 Net 4 5 2 服务器 但没有成功 它是设备打开的 TCP 连接 使用 TLS 1 2 在服务器端 我有一个 TCP 服务器的标准 Net 实现 SslStream包裹着DotNetty https github c
  • Spring Webflux 不明时间损失

    我们最近切换到 ExpediaGroups GraphQLlibrary https github com ExpediaGroup graphql kotlin它基于 Spring Webflux Since switching our
  • 严重:泄漏:在垃圾收集之前未调用 ByteBuf.release()。内蒂

    我已经创建了一些游戏服务器 并且刚刚与大约 10 个伙伴进行了测试 一切都很顺利 我们玩了大约 10 分钟 在游戏的某个时刻 游戏服务器停止为客户端提供服务 断开了每个人的连接 而且我连接到运行游戏的 VPS 的 SSH 也断开了连接 我不
  • JBoss Netty 与 JSON

    我希望我的 Ajax 代码能够通过 Netty 连接服务器 为此 我需要在服务器端 Netty 处理程序中使用 JSON 解码器和编码器 是否有任何开箱即用的实现 或者我应该编写自己的实现 Thanks Gil 据我所知 没有内置的 JSO
  • 使用 Netty 的异步 HTTP 客户端

    我是 Netty 新手 仍在努力寻找自己的方法 我正在寻找创建一个异步工作的 http 客户端 http的netty例子只展示了如何等待IO操作 并没有展示如何使用添加监听器 所以最近几天我一直在努力解决这个问题 我正在尝试创建一个请求类
  • 客户端 ECC SSL 证书包含“未知命名曲线”

    问题背景 我正在一个现有的库中工作 该库在远程服务器上使用 SSL 和 netty 框架 我遇到 SSL TLS 握手错误 错误如下 javax net ssl SSLProtocolException java io IOExceptio
  • Netty如何使用线程池?

    您能解释一下 Netty 如何使用线程池来工作吗 我是否理解正确 有两种线程池 老板和工人 Boss 用来做 I O worker 用来调用用户回调 messageReceived 来处理数据 这是来自 NioServerSocketCha
  • Netty连接限制

    我正在开发一个使用 netty 3 6 5 的应用程序服务器 我想先了解一下期权积压的完整含义 另外 为什么没有关于 serverbootstrap 选项的文档来帮助我们开发人员 我的另一个问题是如何最好地限制服务器的并发连接数以获得更好的
  • Netty websocket客户端闲置5分钟后不从服务器读取新帧

    我在服务器端和客户端都使用 Netty 来建立和控制 websocket 连接 我在服务器端有一个空闲状态处理程序 http netty io 4 1 api io netty handler timeout IdleStateHandle
  • netty DefaultChannelPipeline 异常捕获

    不幸的是 我不明白 netty 服务器的输出 BUILD SUCCESSFUL Total time 3 seconds Jul 27 2014 2 04 44 AM io netty handler logging LoggingHand
  • Java 互操作——Netty + Clojure

    我正在尝试通过 clojure 使用 netty 我可以启动服务器 但是它无法初始化接受的套接字 下面分别是错误消息和代码 有谁知道什么是 或可能是错误的 我相信问题在于 Channels pipeline server handler T
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • Netty通道读取混乱

    我三个月前开始使用 Netty 最初 它看起来非常简单且易于使用 因为我遵循了 4 x 系列主页中给出的示例 当我更深入地探索它时 我无法理解某些事件或回调名称 例如 我无法理解以下内容之间的区别 ChannelRead ChannelHa
  • 如何查找以下 netty 错误的根本原因:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s)

    我经历过从负责将数据发送到 TCP 客户端的管道引发的以下异常 2017 03 02T18 00 53 749 epollEventLoopGroup 3 1 ERROR ExceptionHandler null Unknown exce

随机推荐

  • 在Idea中调试ant应用

    Ant调试 Ant调试 ant 是一种非常方便的打包 部署的工具 通过ant 可以一键构建整个项目 虽然MVN也支持这种功能 但是MVN混杂了package管理的功能 并且不是很自由 学习成本比较高 通常 我们调试ant构成的程序 是通过远
  • 零散算法

    1 字符串匹配 朴素的串匹配算法 KMP匹配算法 2 广度优先搜索BFS 3 深度优先搜索DFS 4 狄克斯特拉算法Dijkstra 5 贪婪算法 6 动态规划 7 安全散列算法SHA 用递归分析问题 基于循环写代码 10 关于查找算法 1
  • unity+射线检测

    private Camera aRCamera Ray ray RaycastHit hit aRCamera GameObject Find RenderCamera GetComponent
  • JavaScript节流与防抖

    一 节流 概念 在规定的间隔时间范围内不会重复触发回调 只有大于这个时间间隔才会触发回调 把频繁触发变为少量触发 类似于技能CD 应用 点击按钮 轮播图点击左右箭头 插件lodash js 它里面封装了函数的防抖与节流业务 p 计数器 sp
  • 抓包工具篇|Charles

    1 简介 Charles 是在 Mac 下常用的网络封包截取工具 在做 移动开发时 我们为了调试与服务器端的网络通讯协议 常常需要截取网络封包来分析 Charles 是收费软件 可以免费试用 30 天 试用期过后 未付费的用户仍然可以继续使
  • 怎样使用BAT脚本实现自动按键盘的某个键

    批处理是不行的 用VBS 很简单 例子如下 Set objShell CreateObject Wscript Shell do WScript Sleep 3000 objShell SendKeys F5 WScript Sleep 3
  • Weblogic 12c 集群部署和session复制

    在上一篇Weblogic12c集群搭建的基础上 这一篇介绍Weblogic12c集群应用的部署和session复制 1 启动服务 首先在weblogic12c控制台 启动受托管服务server1 server2 server3 2 将要部署
  • 前端实现微信支付(H5,微信小程序)

    一 微信支付 H5 微信小程序 通常一些电商项目使用到微信支付操作 所以简单地介绍一下微信支付的具体流程 1 1 什么是微信支付 在什么业务场景会使用到微信支付 微信支付是微信内置微信浏览器 其他浏览器不支持 或者微信小程序的支付接口 主要
  • ubuntu如何修改首次登入不是anaconda的base环境

    ubuntu安装anaconda后 每次用户登录进去后所在环境都是anaconda的base虚拟环境 如果用户不想一开始登进去就是anaconda的base环境 想在需要使用anaconda时再激活anaconda环境 输入下面的命令就可以
  • 在Flutter里面构建布局

    https flutter io tutorials layout 可以学到 Flutter的布局机制 如何水平与垂直布局控件 如何构建一个Flutter布局 布局的效果图 https flutter io tutorials layout
  • 西山小菜鸟之Scrapy学习笔记---splash简介

    前言 本文主要介绍scrapy splash的理论知识 文中如有不正确的地方望大家指正 本文的主要内容出自书 精通Scrapy网络爬虫 虫术 Python绝技 背景 近几年随着前端技术和手机端App的飞速发展 互联网架构也发生了巨大的变化
  • 经典兔子问题python(头歌教学实践平台)

    第1关 经典兔子问题 递归 任务描述 问题 有一对兔子 从出生后的第三个月起 每个月都生一对兔子 小兔子再长三个月后每个月又生一对兔子 假如兔子都不死 请问每个月的兔子的数量是多少对 本关任务 编写程序求解上面的问题 相关知识 兔子问题的分
  • java——集合框架

    文章目录 接口 实现 类 算法 1 排序算法 2 查找算法 3 拷贝算法 4 填充算法 5 比较算法 6 随机算法 7 迭代器算法 8 交集 并集 差集 9 分割集合 10 数组和集合的互转 集合框架是一个用来代表和操纵集合的统一架构 所有
  • EFSM(事件驱动型有限状态机:Event Finite State Machine)

    一 介绍 EFSM event finite state machine 事件驱动型有限状态机 是一个基于事件驱动的有限状态机 主要应用于嵌入式设备的软件系统中 EFSM的设计原则是 简单 EFSM的使用者只需要关心 当事件到来时 通过EF
  • 手撸算法-最大子数组和-牛客

    描述 给定一个数组arr 返回子数组的最大累加和 例如 arr 1 2 3 5 2 6 1 所有子数组中 3 5 2 6 可以累加出最大的和12 所以返回 题目保证没有全为负数的数据 要求 时间复杂度为O n O n 空间复杂度为O 1 O
  • css如何让块无间隙,CSS 去掉inline-block间隙的几种方法

    最近做移动端页面时 经常会用到inline block元素来布局 但无可避免都会遇到一个问题 就是inline block元素之间的间隙 这些间隙会导致一些布局上的问题 需要把间隙去掉 对于inline block元素及去掉间隙的方法 在这
  • antd中的Cascader级联选择框怎么清空重置React

    项目场景 React项目 使用antd中的Cascader级联选择框 问题描述 通过其他按钮无法重置选择框中的项 原因分析 对应解决办法一和二 1 级联选择框的数据默认是根据options绑定的数组中的value值来进行赋值显示的 可以使用
  • Python中Update()函数的使用

    简介 Python 字典 update 方法用于更新字典中的键 值对 可以修改存在的键对应的值 也可以添加新的键 值对到字典中 语法 d update e 参数说明 将e中键 值对添加到字典d中 e可能是字典 也可能是键 值对序列 详见实例
  • JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五 JVM监控及诊断工具 命令行篇 1 概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题 在用户体验至上的今天 解决好应用软件的性能问题能带来非常大的收益 Java作为最流行的编程语言之一 其应用性能诊断一直受到业界广泛关注
  • 大规模IM在线用户的计算和数据存储方案

    用户模型以及概念 月活量 基本上是总用户量 一个月不活动的用户基本上是死用户 日活量 一天中大于一定活跃时间的用户 峰值用户 一天中用户在线最高峰的用户总量 峰值并发用户 峰值用户可以同时在一秒钟发出一条消息的用户 业务消息的计算模型 当前