男女做羞羞事网站/百度代理公司怎么样
1. 背景信息
上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅.
本文Agenda:
- (How)如何同步
- (How)如何设计同步位点
- 如何设计 Gap过大(SyncGapOverflow) 机制
- 如何设计Ack机制
- 总结
提示: 本系列文章不会单纯的给出结论, 希望能够分享的是"如何分析, 如何得出的结论"的思路.
2. 同步协议如何设计
什么是同步协议
同步是通过将server的位置同步到client的位置, 最终实现了消息的同步.
大前提条件
- 知道client 在哪里
- 知道server 在哪里
小前提条件
3. client可以同步到server的位置
4. server在此流程中, 将消息内容带给端上
结论
实现消息内容的同步
示例
用户A发送了10,000条消息给B, 并且B仅有A一个会话. server的同步队列, 仅能记录单人的1000个同步事件, 在不同的场景下(场景为何如此划分, 请参考上篇文章)的处理.
scene: 首次登录
scene: 用户在线同步/短暂离线后再次在线同步
scene: 用户长期不在线再次在线后同步
示例场景总结
总共有四个步骤
- client告诉server, client的同步位点
- server计算client的同步位点与server的gap
- server推送之间的gap与最新的同步点
- 如果server推送之间的gap过大, server会告知client需要自己处理, client标记gap, 拉取最新的会话信息
此四个步骤便是同步协议的核心流程.
如果加上建联的过程. 便是完整的同步协议方案.
如何同步
完整的同步协议方案, 整体可以认为分为四个阶段.
- 通讯层建连
- 离线消息同步
- 在线等待指令
- 在线消息同步
而细化处理的逻辑如下
如图所示, 可以得出以下的结论
- 通讯层建联后, 协议层的首个通讯是确定的, 是协议层建连同步.
- 整个同步协议的核心要素有两个: 同步位点 以及 是否有gap.
- Ack机制
- 同步协议中的目的是同步位点同步, 以及消息同步. 那么消息同步是否一定要归属到同步协议中?
因而
- 同步位点以及 gap过大(SyncGapOverflow)的设计 ,成为了解决同步协议端到端方案的核心问题.
- Ack机制如何设计?
- 消息同步是否一定要归属到同步协议中, 是否可以拆出来?
如何设计同步位点
什么是同步位点
同步位点, 是server和client用于判定server的同步队列, 当前已经同步到的位置信息.以及用于server和client之间判断还有那些信息未同步的判断依据.
如何设计
版本号?
版本号的方式, client是OK的. 但是对于server而言, 如果server需要清空对应的队列时, 便需要记录已经清空的最新的版本号. 这样在新消息来临时, 才能比较准确的记录.
时间戳?
时间戳的方式, client是OK的. 如果是比较活跃的群聊, 单位时间内的消息暴涨, 采用毫秒的时间戳, 也是可能会有重复的记录. 建议采用纳秒.
其他方式?
如生成单独的uuid, 也是可以的. 不过对于server而言, 由于是字符串匹配, 检测client已经同步到的位置, 耗时会比较久.
因而采用纳秒级别的时间戳是一种比较好的解决方式.
结论
采取纳秒的方式作为同步位点, 另外, 为了做方便做后续的协议升级, 除了同步位点外, 还需要增加一个同步协议版本号的元素.
即同步协议版本号 + 纳秒的同步位点. 作为同步协议的同步位点解决方案
谁来持有同步位点?
client和server均需要持有同步位点.
server记录client的设备维度的同步位点 + 天然持有的同步队列的同步位点信息.
client记录当前设备上账号的同步位点信息.
如何设计 Gap过大(SyncGapOverflow) 机制
什么是Gap过大(SyncGapOverflow)
ps: 英文名字是我定义出来的.
英文名便比较好理解. Sync Gap Overflow. 同步gap时, 内容过多, server拒绝主动同步. 即告知client, 需要client主动拉取. 从推模式切成了拉模式.
如何做SyncGapOverflow
gap一般的处理, 也是一个端到端的问题.
出现SyncGapOverflow, 是client的同步位点, 已经不在同步队列中.
而不在同步队列中, client的位点太老可以导致, 也可能是server对同步队列做了定期清理机制导致.
因而一般的SyncGapOverflow的触发原因有两类
- client侧的设备首次登录或者超过了长期未登录
- server侧的清理机制导致
如何设计Ack机制
什么是ACK机制
ACK机制, 即ACK消息. “回复已经收到数据”. 而在同步协议的场景下, 是指 client 确认收到了sever的同步数据, 给到server的一个确认消息.
目的:
1. server确认同步消息消费了, 即保证消息的可靠性投递和消费
2. server根据此确认消息, 标记client的当前同步位点
如何设计Ack机制
以用户短暂离线再次在线为例.如图所示.
当用户离线后时, server记录的最新同步位点的index位于10,000, 而client的同步位点的index位于9,000.
用户再次登录时,
- 通讯层建联
- client将index为9,000的同步位点上传给到server.
- server处理9,000的同步位点, 发现位于同步队列中, 并且未达到SyncGapOverflow的条件. 于是批次的下发同步的内容. 如. 50个sync消息作为一个业务包下发.
- client在收到了9,001 ~ 9050的同步位点数据后, 进行处理
- 对于处理的结果需要Ack server. 而Ack server有两种结果. SUC和FAIL.
- 对于SUC的case. server更新client 同步位点到index为9,050.
- 对于FAIL的case, server认为client处理失败. 进行重试机制的处理, 如 等 3s 在进行重试.
- 如果重试的次数, 超过了三次. server告知client sync同步失败, client进行兜底的处理. 如端侧reset, 重新初始化.
Ack的逻辑, 可以直接参考TCP的Ack机制.
消息同步是否属于同步协议?
一般来讲, 消息同步是附属于同步协议的, 但是严格来讲, 同步协议与消息同步是可以做分割的
同步协议仅推送最新的同步位点信息,同步后, client 回复ack. 而client每次在收到同步位点信息时, 跟本地做比对, 然后主动拉取中间的消息内容,
即同步协议仅推送server最新的变更通知, client收到通知后, 回复ack. 主动拉取. 最大程度的使用拉模式. 依然以用户短暂离线再次在线为例.如图所示.
处理流程
而这种Ack机制, 也确实保证了是收到了消息通知, 但是没有保证client的消息数据正常处理了. 选择此种方案需要慎重.
3. 结论
本文通过同步协议的各个场景细化, 比较完整的介绍了同步协议的方案. 以及在设计同步协议中, 几个比较关键的元素的设计, 同步位点, Gap过大机制, 以及Ack机制.
相关文章:

即时通讯系列-4-如何设计写扩散下的同步协议方案
1. 背景信息 上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅. 本文Agenda: (How)如何同步(How)如何设计同步位点如何设计 Gap过大(SyncGapOverflow) 机制如何设计Ack机制总结 提示: 本系列文章不会单纯的给出结论, 希望能够分享的是&…...

tui-swipe-action组件上的按钮点击后有阴影的解决方法
大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 目录 前言问题描述问题解决前言 一直未敢涉足电商领域,总觉得这里面的道道很多,又是支付、又是物流的,还涉及到金钱,所以我们所做的项目,一直都是XXXX管理系统,XXX考核系统,移动端的也是,XX健康管理平台…… 但…...

【大数据Hadoop】Hadoop 3.x 新特性总览
Hadoop 3.x 新特性剖析系列11. 概述2. 内容2.1 JDK2.2 EC技术2.3 YARN的时间线V.2服务2.3.1 伸缩性2.3.2 可用性2.3.3 架构体系2.4 优化Hadoop Shell脚本2.5 重构Hadoop Client Jar包2.6 支持等待容器和分布式调度2.7 支持多个NameNode节点2.8 默认的服务端口被修改2.9 支持文件…...

Python-第三天 Python判断语句
Python-第三天 Python判断语句一、 布尔类型和比较运算符1.布尔类型2.比较运算符二、if语句的基本格式1.if 判断语句语法2.案例三、 if else 语句1.语法2.案例四 if elif else语句1.语法五、判断语句的嵌套1.语法六、实战案例一、 布尔类型和比较运算符 1.布尔类型 布尔&…...

失手删表删库,赶紧跑路?!
在数据资源日益宝贵的数字时代公司最怕什么?人还在,库没了是粮库、车库,还是小金库?实际上,这里的“库”是指的数据库Ta是公司各类信息的保险柜小到企业官网和客户信息大到金融机构的资产数据和国家秘密即便没有跟数据…...

技术树基础——16排它平方数(Bigdecimal,int,string,数组的转换)
题目:03879 * 203879 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你…...

04动手实践:手把手带你实现gRPC的Hello World
这篇文章就从实践的角度出发,带大家一起体验一下gRPC的Hello World。文中的代码将全部使用Go语言实现,使用到的示例也是GitHub上提供的grpc-go,下面我们开始: Hello World官方示例 首先我们要clone GitHub上gRPC的源代码到我们本地 git clone https://github.com/grpc/g…...

区块链技术与应用1——BTC-密码学原理
文章目录比特币中的密码学原理1. 哈希函数2. 数字签名3. 比特币中的哈希函数和数字签名简单介绍:比特币与以太坊都是以区块链技术为基础的两种加密货币,因为他们应用最广泛,所以讲区块链技术一般就讲比特币和以太坊。比特币中的密码学原理 1…...

PyTorch学习笔记:data.WeightedRandomSampler——数据权重概率采样
PyTorch学习笔记:data.WeightedRandomSampler——数据权重概率采样 torch.utils.data.WeightedRandomSampler(weights, num_samples, replacementTrue, generatorNone)功能:按给定的权重(概率)[p0,p1,…,pn−1][p_0,p_1,\dots,p_{n-1}][p0,p1,…,pn…...

SpringMVC对请求参数的处理
如何获取SpringMVC中请求中的信息 ? 默认情况下,可以直接在方法的参数中填写跟请求参数一样的名称,此时会默认接受参 数 ,如果有值,直接赋值,如果没有,那么直接给空值 。Controller RequestMapp…...

12年老外贸的经验分享
回想这12年的经历,很庆幸自己的三观一直是正确的,就是买家第一不管什么原因,只要你想退货,我都可以接受退款。不能退给上级供应商,我就自己留着,就是为了避免因为这个拒收而失去买家。不管是什么质量原因&a…...

电子电路中的各种接地(接地保护与GND)
前言多年以前,雷雨天气下,建筑会遭遇雷击,从而破坏建筑以及伤害建筑内的人,为了避免雷击的伤害,人们发明了避雷针,并将避雷针接地线,从而引导雷击产生的电流经过地线流入到地下。地线࿱…...

php实现农历公历日期的相互转换
农历(Lunar calendar)和公历(Gregorian calendar)是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的,而农历是基于月亮的运动来计算时间的。农历中的月份是根据月亮的相对位置来确定的,而公历…...

基于SpringBoot的房屋租赁管理系统的设计与实现
基于SpringBoot的房屋租赁管理系统的设计与实现 1 绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高,越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中,大家也面临着各种各样的问题&…...

一文带你为PySide6编译MySQL插件驱动
1.概述 最近使用PySide6开发程序,涉及与MySQL的数据交互。但是qt官方自pyqt5.12(记不太清了)以后不再提供MySQL的插件驱动,只能自己根据qt的源码编译。不过网上大部分都是qt5的MySQL驱动的编译教程。后来搜到了一个qt6的编译教程…...

图论算法:树上倍增法解决LCA问题
文章目录树上倍增法: LCA问题树上倍增法: LCA问题 树上倍增法用于求解LCA问题是一种非常有效的方法。 倍增是什么? 简单来说,倍增就是 1 2 4 8 16 … 2^k 可以发现倍增是呈 2的指数型递增的一类数据,和二分一样&…...

Java线程池中submit() 和 execute()方法有什么区别
点个关注,必回关 文章目录一. execute和submit的区别与联系1、测试代码的整体框架如下:2、首先研究Future<?> submit(Runnable task)和void execute(Runnable command),3、submit(Runnable task, T result) 方法可以使submit执行完Run…...

Vue.extend和VueComponent的关系源码解析
目录 0.概念解释 前言 需求分析 Vue.extend 编程式的使用组件 源码分析 0.概念解释 Vue.extend和VueComponent是Vuejs框架中创建组件的两种不同方式。Vue.extend方法能够让你根据Vue对象(继承)来定义一个新的可重用的组件构造器。而VueComponent方…...

【动态规划】01背包问题(滚动数组 + 手画图解)
01背包除了可以用形象的二维动态数组表示外,还可以使用空间复杂度更低的一维滚动数组。 目录 文章目录 前言 一、滚动数组的基本理解 二、确定dp及其下标含义 三、确定递推公式 四、确定初始化 五、确定遍历顺序 1.用物品(正序)遍历背…...

javaEE 初阶 — 超时重传机制
文章目录超时重传机制1. 数据重复传输问题2. 如何解决数据重复传输问题3. 重传次数问题TCP 的工作机制:确认应答机制 超时重传机制 如果传输数据的时候丢包了该怎么办? 利用 超时重传,也就是超过了一定的时间,如果还没响应就重新…...

小米5x wlan无法打开解决
诱因:想要利用空置设备做节点服务器或者边缘计算,因此解锁并刷了magisk,印象中在刷之前wlan已经无法打开无法进行wifi联网 表现: 1 WLAN开关无法打开,或者虚假打开,无法扫描wifi 2 设置->我的设备->全…...

负载均衡之最小活跃数算法
文章目录[toc]一、概念二、场景与设计思路三、实现四、代码下载一、概念 活跃数 集群中各实例未处理的请求数。 最小活跃数 集群中各个实例,哪个实例未处理的请求数据最小,就称之为最小活跃数。 二、场景与设计思路 场景 以获取微服务地址为场景。 设计…...

JavaScript 评测代码运行速度的几种方法
一、使用 performance.now() API 在 JavaScript 中,可以使用 performance.now() API 来评测代码的运行速度。该 API 返回当前页面的高精度时间戳,您可以在代码执行前后调用它来计算代码执行所需的时间。 例如: let t0 performance.now();…...

Linux 编译器 gcc/g++
本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 目录 前言 正文 gcc/g常用命令 自定义可执行程序名命令-o 预处理指令-E 编译指令-S 汇编指令-c 链接指令gcc 命令巧记口诀 链接库 动态库-动态链接 静态库…...

2.Java基础【Java面试第三季】
2.Java基础【Java面试第三季】前言推荐2.Java基础01_字符串常量Java内部加载-上58同城的java字符串常量池面试code讲解intern()方法---源码解释02_字符串常量Java内部加载-下whyOpenJDK8底层源码说明递推步骤总结考查点03_闲聊力扣算法第一题字节跳动两数求和题目说明面试题解法…...

Java高级-多线程
本篇讲解java多线程 基本概念: 程序、进程、线程 **程序(program)**是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程…...

mysql高级(事务、存储引擎、索引、锁、sql优化、MVCC)
文章目录1.事务1.1 四大特性ACID1.2 并发事务2.存储引擎2.1 InnoDB2.2 MyISAM2.3 Memory2.4 存储引擎特点2.5 存储引擎的选择3.性能分析3.1 查看执行频次3.2 慢查询日志3.3 profile3.4 explain4.索引4.1 索引结构B-TreeBTreeHash面试题4.2 索引分类思考题4.3 语法4.4 使用规则最…...

Java后端开发功能模块思路
文章目录前言一、查找接口及参数信息1.1 找访问路径1.2 参数及返回结果信息1.3 编写功能模块函数二、代码设计思路三、总结前言 对于正在学习Java后端开发的同学来说,对于Java后端功能模块的开发过程及思路要有一个整体清晰的流程。才能保证在开发过程中更加的顺畅…...

CAPL(vTESTStudio) - DoIP - TCP发送_05
TCP发送 参数定义 版本号:02 FD or 01 FE or 其他任意值数据类型:00 05 or 00 06 or 80 01 or其他任意值数据长度:想要发送的任意长度...

使用IntelliJ IDEA搭建datax-web开发环境
记录:372场景:使用IntelliJ IDEA搭建datax-web开发环境,以及datax-web基本使用。版本:JDK 1.8Python 2.7.5datax-web开源地址:https://github.com/WeiYe-Jing/datax-web1.配置Maven环境1.1安装目录目录:D:\…...