当前位置: 首页 > news >正文

IM消息数据库调研

IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步和存储:

  • 1)消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的IM系统还支持『多端同步』;
  • 2)消息的存储:消息存储即消息的持久化保存,这里不是指消息在客户端本地的保存,而是指云端的保存,功能上对应的就是『消息漫游』。『消息漫游』的好处是可以实现账号在任意端登陆查看所有历史消息,这也是高级IM系统特有的功能之一。

数据库选型

消息系统最核心的两个库是消息同步库和消息存储库,两个库对数据库有不同的要求:

数据模型Timeline模型Timeline模型
写能力高并发写,10万TPS高并发写,少量读,万TPS
读能力高并发范围读,10万TPS少量范围读,千级TPS
存储规模保存一段时间内的同步消息,TB级。保留千万级的Timeline模型保存全量消息,百TB级。保留亿级Timeline模型

总结下来,ToC IM对数据库的要求有如下几点:

  • 1)表结构设计能够满足Timeline模型的功能要求:不要求关系模型,能够实现队列模型,并能够支持生成自增的SeqId;
  • 2)能够支持高并发写和范围读,规模在十万级TPS;
  • 3)能够保存海量数据,百TB级;
  • 4)能够为数据定义生命周期。

对于ToB的IM要求可以降低:

  • 1)表结构设计能够满足Timeline模型的功能要求:不要求关系模型,能够实现队列模型,并能够支持生成自增的SeqId;
  • 2)能够支持高并发写和范围读,规模在万级TPS;
  • 3)能够保存海量数据,TB级;
  • 4)能够为数据定义生命周期。

对于以上要求首先排除OLAP 数据库,OLAP 数据库在高并发写和实时更新场景性能都比较差。

其次排除elasticsearch这类搜索数据库,对于IM系统来说,高并发写的场景是远比高并发读的场景多的。

罗列出以下数据库:

支持生成自增的SeqId专为时间序列数据设计的数据库,支持队列模型和自增的 SeqId高度可扩展的分布式数据库,支持队列模型和自增的 SeqId分布式 SQL 数据库,支持队列模型和自增的 SeqId支持通过 AUTO_INCREMENT 实现自增的 SeqId,可以设计队列模型支持通过 SERIAL 或 IDENTITY 列实现自增的 SeqId,也可以设计队列模型适用于需要存储大量非结构化数据的场景,通过额外设计可支持生成自增序号提供了 Timeline 模型,能够满足 Timeline 模型的功能要求,支持队列模型和自增的 SeqId
支持高并发写和范围读,规模在万级TPS支持,优化了对高并发写入和范围查询的支持,适用于处理大规模时间序列数据支持支持,适合处理大规模数据在高并发写入和范围读取方面表现良好,特别是在简单的读写操作中在高并发写入和范围读取方面表现出色,特别是在处理复杂事务时支持,范围读和实时更新性能没有前面数据库性能好能够支持高并发写入和范围读取
能够保存海量数据,TB级支持 PB 级数据存储支持 PB 级数据存储支持 PB 级数据存储能够处理 PB 级数据,需要合理的表分区和索引设计来优化性能能够处理 PB 级数据,并且支持多种存储选项和优化技术,如表分区、索引优化等支持 PB 级数据存储支持 PB 级数据存储
能够为数据定义生命周期支持数据生命周期管理,可以通过设置保留策略来自动删除过期数据。支持数据生命周期管理,可以通过 TTL(Time To Live)实现支持数据生命周期管理,可以通过表分区和数据清理策略实现支持通过事件调度程序(Event Scheduler)实现数据生命周期管理,例如定期删除旧数据。支持通过 TTL(Time To Live)索引实现数据生命周期管理,也可以使用 cron 作业或 PostgreSQL 的 pg_cron 扩展来实现定期数据清理支持数据生命周期管理,可以通过 TTL 索引等方式实现支持数据生命周期管理,可以为数据定义生命周期
使用/维护成本非常高(没人用过,使用成本和维护成本都很高)非常高(没人用过,使用成本和维护成本都很高)高(与mysql类似,国内有一些公司在用,但我们公司没有用过)使用成本很低,维护成本较高(需要进行分库分表,可作为过渡版本)一般(用的不多,线上只有少量非核心业务使用)低(高并发实时更新和范围查询可能会遇到瓶颈,使用WiredTiger 引擎万级别应该不会有问题)不可用,阿里云独有存储库

通过上面比较,我们计划先用mysql存储,后面替换成tidb或者Cassandra和InfluxDB数据库(需要一段时间的调研和学习)。

http://www.dtcms.com/a/313847.html

相关文章:

  • Lecture 1 Overview and Tokenization 课程笔记
  • Go语言select
  • Redis真的是单线程的吗?
  • 跟着顶刊学写论文-摘要1
  • codeBuddy IDE 使用教程
  • Web 开发 12
  • ZYNQ-按键消抖
  • labview解析S7协议
  • Neo4j 社区版 Mac 安装教程
  • Django集成图片验证码功能:基于django-simple-captcha实现
  • 数据结构----排序
  • EdgeView for macOS:解决图像管理痛点的利器
  • c# 属性操作(2)
  • PyCharm代码规范与代码格式化插件安装与使用:pylint和autopep8
  • javacc学习笔记 01、JavaCC本地安装与测试
  • C++-异常
  • Go语言实战案例:编写一个简易聊天室服务端
  • 从零开始的云计算生活——项目实战
  • 【Pytorch✨】LSTM04 l理解长期记忆和短期记忆
  • 计算机视觉(1)-图像采集设备选型全景表(工业 + 医疗 + 车载)
  • 编程算法:技术创新与业务增长的核心驱动力
  • 【Spring AI快速上手 (一)】ChatModel与ChatCilent构建对话
  • Rust:如何开发32位的DLL动态库
  • 单向链表(补充)与linux虚拟机网络配置
  • JS--获取事件的子元素与父元素
  • ZooKeeper 深度实践:从原理到 Spring Boot 全栈落地
  • 【unitrix】 7.1 二进制位加法(bit_add.rs)
  • 哪些第三方 Crate 可以直接用?
  • Mac桌面仿制项目--让ai一句话生成的
  • Qt 使用QtXlsx库处理Excel文件