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

IM同步服务

设计概述

后台同步方案的设计就是数据存储结构的设计,如何快速体现“信息变化”,如何快速计算出“变化信息”。后台数据存储结构是由同步协议中同步契约决定的。

设计方案

该方案的同步是按照业务粒度来划分,只需要同步sdk要求同步的数据。

缓存数据模型

//用户信息
UserInfo
{int64 uid; int64 user_info_version; //个人信息版本号string nickname; int64 nickname_version; //昵称版本号string avatar; int64 avatar_version; //头像版本号string signature;int64 signature_version; //签名版本号
}
//群组信息
GroupInfo
{  int64 gid;int64 group_info_version;//群组信息版本号string group_name;string group_desc;  
}
//事件信息
Event
{int64 event_id;//事件idint32 event_type; //事件类型  int64 from_uid; //事件发起者int64 gid;//群组idint64 to_uidlist; //事件当事人int64 event_version;//事件版本号 
}
//群组成员
GroupUser 
{ int64 gid; int64 user_info_version=2; //群组的所有成员中,用户信息最新的成员,他的个人信息版本号 int64 user_list_version=3; //群组成员列表版本号,只要user_list发生变化,该版本号也要发生变化list<UserInfo> user_list; //群组成员列表
}
//用户群组
UserGroup
{ int64 uid;int64 group_info_version; //用户的所有群组中,群组信息最新的群组的版本号 int64 group_list_version; //用户群组列表版本号,只要group_list发生变化,该版本号也要发生变化list<GroupInfo> group_list; //用户群组列表 
}
//好友
UserFriend
{int64 uid;int64 user_info_version;//用户的所有好友中,用户信息最新的好友,他的个人信息版本号 int64 user_list_version;//好友列表版本号,只要user_list发生变化,该版本号也要发生变化list<UserInfo> user_list;//好友列表
}
//群组事件
GroupEvent
{list<Event> event_list;//事件列表
}
// GroupMemberSync业务契约需要的请求信息 
GroupMemberSync { int64 gid; int64 user_info_version=2; //群组的所有成员中,用户信息最新的成员,他的个人信息版本号 int64 user_list_version=3; //群组成员列表版本号
}
// GroupMemberSync业务契约需要返回的信息 
GroupMemberSyncRsp { GroupMemberSync group_member_sync; list<UserInfo> users; list<Event> events; }

同步流程

业务请求处理流程:业务请求->service模块->业务在改变信息本身的同时也要记录信息的变化。

用户信息更新

->用户信息更新请求
->service模块
更新用户信息UserInfo中user_info_version版本号和相应属性nickname_version、signature_version等的版本号。
更新用户所属群组的GroupUser中user_info_version版本号和成员列表中该用户的user_info_version版本号。
更新用户所有好友的UserFriend中user_info_version版本号和成员列表中该用户的user_info_version版本号。
(复杂度为o(n),n表示数据库中操作元素的量级,key-value数据库以key为单位,sql数据库以行为单位)

群组操作(创建群组、退出群组、添加群组成员、删除群组成员)

->创建群组、退出群组、添加群组成员、删除群组成员请求
->service模块
更新用户所属的群组GroupUser中user_list_version版本号。
更新用户群组列表UserGroup中group_list_version版本号。
在群组事件列表GroupEvent中添加一条新记录。
给SDK下发一条业务契约的同步通知,让SDK决定是否要及时同步信息。

// 同步通知
SyncNotification
{list<GroupMemberSync> group_member_sync;
}

同步驱动处理流程:同步驱动->sync模块->业务契约需要的增量更新结果

获取群组成员增量信息

->同步驱动

// 同步驱动
SyncRequest
{list<GroupMemberSync> group_member_sync;
}

->sync模块
比较GetGroupMemberList业务契约请求信息中group_list_version_1 和后台数据库中Group_User的 group_list_version_2,找出该群组的两个版本号之间的Event,得到群组中成员的增量变化。(复杂度为o(n))
比较GetGroupMemberList业务契约请求信息中user_info_version_1 和后台数据库中Group_User的 user_info_version_2,找出该群组两个版本号之间信息发生变化的用户,得到增量的用户信息变化。(复杂度为o(n))
->增量同步结果

// 业务契约的同步结果
message SyncResponse
{list<GroupMemberSyncRsp> group_member_sync_rsp; 
}

缺陷

按业务粒度划分会导致业务和业务之间的同步信息有交集,也就是说会产生某些元信息出现重复同步。

难点

KEY-VALUE数据库需要提供批量操作KEY的接口。
需要一个可容灾的生成全局增量序列的服务。

相关文章:

IM同步服务

设计概述 后台同步方案的设计就是数据存储结构的设计&#xff0c;如何快速体现“信息变化”&#xff0c;如何快速计算出“变化信息”。后台数据存储结构是由同步协议中同步契约决定的。 设计方案 该方案的同步是按照业务粒度来划分&#xff0c;只需要同步sdk要求同步的数据。…...

MySQL 运维常用脚本

常用功能脚本 1.导出整个数据库 mysqldump -u 用户名 -p –default-character-setlatin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件…...

ABC322刷题记

ABC322刷题记 T1.A A - First ABC 2。 妥妥的简单题…… 用find函数做就行。&#xff08;如果不存在那个子串就返回-1&#xff0c;否则返回第一次出现位置&#xff09; 注意题目中编号是从1开始的。 时间复杂度&#xff1a;O(log(n))。find函数有一定代价&#xff0c;我记…...

visual studio的安装及scanf报错的解决

visual studio是一款很不错的c语言编译器 下载地址&#xff1a;官网 点击后跳转到以下界面 下滑后点击下载Vasual Sutdio&#xff0c;选择社区版即可 选择位置存放下载文件后&#xff0c;即可开始安装 安装时会稍微等一小会儿。然后会弹出这个窗口&#xff0c;我们选择安装位…...

React生命周期

React的生命周期主要是指React组件从创建到销毁的过程&#xff0c;包括三个阶段&#xff1a;挂载期&#xff08;实例化期&#xff09;、更新期&#xff08;存在期&#xff09;、卸载期&#xff08;销毁期&#xff09; 挂载期&#xff1a; constructor&#xff08;props&#…...

SpringBoot整合RocketMQ笔记

SpringBoot版本为2.3.12.Release RocketMQ对比kafka 学习链接 https://zhuanlan.zhihu.com/p/335216381 代码实战 https://www.cnblogs.com/RedOrange/p/17401238.html Centos安装rocketmq https://blog.csdn.net/chuige2013/article/details/123783612 RocketMQ详细配置与…...

【【萌新的RiscV学习之在写代码之前对于关键路径的分析-11】】

萌新的RiscV学习之在写代码之前对于关键路径的分析-11 首先我们最简单的control 模块 全分段 因为只有分段 &#xff0c; 分开使用之后 &#xff0c; 各个阶段的具体功能才会合理使用 就像是为了后续 “气泡” 赋值 为 0 还有单独比较前递这种 EX &#xff1a; ALUOP ALUSrc …...

A. Sequence with Digits

题目&#xff1a;样例&#xff1a; 输入 8 1 4 487 1 487 2 487 3 487 4 487 5 487 6 487 7输出 42 487 519 528 544 564 588 628 思路&#xff1a; 暴力模拟题&#xff0c;看这数据范围&#xff0c;有些人可能会被唬住&#xff0c;以为是高精度或者容易超时&#xff0c;实际上…...

gitlab配置webhook限制提交注释

一、打开gitlab相关配置项 vim /etc/gitlab/gitlab.rb gitlab_shell[custom_hooks_dir] "/etc/gitlab/custom_hooks" 二、创建相关文件夹 mkdir -p /etc/gitlab/custom_hooks mkdir -p /etc/gitlab/custom_hooks/post-receive.d mkdir -p /etc/gitlab/custom_h…...

蓝桥杯Python scratch C++选拔赛stema个人如何报名?

如果不会操作&#xff0c;可以微信makytony协助。...

Cesium实现动态旋转四棱锥(2023.9.11)

Cesium实现动态悬浮旋转四棱锥效果 2023.9.11 1、引言2、两种实现思路介绍2.1 思路一&#xff1a;添加已有的四棱锥&#xff08;金字塔&#xff09;模型实现&#xff08;简单但受限&#xff09;2.2 思路二&#xff1a;自定义四棱锥几何模型实现&#xff08;复杂且灵活&#xff…...

2023最新PS(photoshop)Win+Mac免费下载安装包及教程内置AI绘画-网盘下载

2023最新PS(photoshop)WinMac免费下载安装包及教程内置AI绘画-网盘下载 2023最新PS(photoshop)免费下载安装教程来咯&#xff5e; 「PhotoShop」全套&#xff0c;winmac&#xff1a; https://pan.quark.cn/s/9d8d8ef5c400#/list/share 所有版本都有 1&#xff0c;复制链接…...

【JAVA】为什么要使用封装以及如何封装

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 Java的封装指的是在一个类中将数据和方法进行封装&#xff0c;使其可以保护起来&#xff0c;只能在该类内部访问&#xff0c;而不允许外部直接访问和修改。这是Java面向对象编程的三…...

18.示例程序(编码器接口测速)

STM32标准库开发-各章节笔记-查阅传送门_Archie_IT的博客-CSDN博客https://blog.csdn.net/m0_61712829/article/details/132434192?spm1001.2014.3001.5501 main.c #include "stm32f10x.h" // Device header #include "Delay.h" #incl…...

【超详细】Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell(CVE-2017-18349)

前言&#xff1a; 看了很多别人关于漏洞复现过程&#xff0c;很多博客过程简洁&#xff0c;有的过程过于复杂&#xff0c;比如看到写java代码&#xff0c;用javac进行编译等等。所以我想写出比较详细的漏洞复现过程。 一&#xff0c;漏洞介绍 1-1 fastjson是什么 fastjson是…...

【牛客网】JZ39 数组中出现次数超过一半的数字

题目 思路 思路1 将数组排序,再保证有结果的情况下,此时数组中间的数字就是想要的结果 思路2 在保证有结果的情况下,此时数组的的众数是数组长度的一半以上 所以我们可以通过抵消的做法来找到最终的结果 我们可以从头遍历这个数组,如果两个数不相同,则消去这两个数,最坏的…...

【Mysql】Lock wait timeout exceeded; try restarting transaction

出现这种问题通常是有事务长时间未提交导致的 可以使用以下sql 查询事务进程 然后通过 kill 线程ID 的方式 ,结束该事务 SELECTtrx_id AS 事务ID,trx_mysql_thread_id AS 线程ID,trx_state AS 事务状态,trx_started AS 开始时间,trx_tables_locked AS 锁定的表,trx_query AS …...

python生成中金所期权行权价

参考沪深300股指期权的合约表&#xff0c;写一个工具函数&#xff1a; 使用方法 def get_format_option_gap(value: float, deviation: int 0): # 根据中证1000指数获取点位"""根据标准的行权价&#xff0c;生成不同档位的期权列表&#xff0c;适合中金所:…...

CentOS7.9 安装postgresql

# 添加postgres账户 sudo groupadd postgres sudo useradd -g postgres postgres # 修改postgres账号密码 passwd postgres # 安装postgresql cd ~tar zxvf postgresql-15.3.tar.gz cd postgresql-15.3./configure --prefix/usr/local/pgsql --without-readlinemake -j4 …...

qt线程介绍

目录 介绍 线程类 QThread 方式1 方式2 案例 线程资源释放 介绍 qt为多线程提供了完美的支持&#xff0c;实现多线程一般是从从QTHread中继承定义自己的线程类&#xff0c;QT也提供了QMutexLocker,QwaitCondition等类实现线程同步&#xff0c;与Linux系统或C中的线程库类似…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...