首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

高并发系统架构设计之实战篇35:计数系统设计之读数系统

引言 上一节课中我们了解了如何设计一套支撑高并发访问和存储大数据量的通用计数系统,我们通过缓存技术、消息队列技术以及对于 Redis 的深度改造,就能够支撑万亿级计数数据存储以及每秒百万级别读取请求了。...你可以在计数系统中增加一块儿内存区域,以用户 ID 为 Key 存储多个读数,当有人 @你时,增加你的 @的计数;当有人评论你时,增加你的评论的计数,以此类推。...当你点击了读数字进入通知页面,查看 @ 你或者评论你的消息时,重置这些计数为零。相信通过上一节课的学习,你已经非常熟悉这一类系统的设计了,所以我不再赘述。那么系统通知的读数是如何实现的呢?...不过有一个折中的方法, 那就是在发送系统通知之前,先从线下的数据仓库中获取全量的用户 ID,并且存储在一个本地的文件中,然后再轮询所有的用户 ID,给这些用户增加计数。...你可以这样做:首先,在通用计数器中记录每一个用户发布的博文数;然后在 Redis 或者 Memcached 中记录一个人所有关注人的博文数快照,当用户点击消息重置读数为 0 时,将他关注所有人的博文数刷新到快照中

11211

关于 IMSDK 的几种消息的解释和对应接口

默认情况下,一个终端通过 SDK 把离线消息拉取到本地后,即时通信 IM 服务器便会删除这些离线消息. 从业务功能看消息的同步....假设终端A的用户1, 有几条用户2发的消息, 用户1想在终端B也有这几条消息的提醒 那么设置 disableAutoReport = YES, 关闭自动上报, 每次 Service 会通过 onNewMessages...下发消息提醒, 直到显式调用 setReadMessage 将消息进行已读上报才会停止下发 读数的逻辑 无论 disableAutoReport 为 YES 还是 NO, 获取当前消息数量 getUnReadMessageNum...SDK 接口为 getConversationList 历史消息 历史消息主要指本地的历史消息, 可以解释为本地数据库中获取历史消息.接口为 getLocalMessage 如果不希望某消息能够历史中拉到..., 可以发在线消息(即用户在线时收到消息,如果用户不在线,下次登录也不会看到消息,可用于通知类消息,这种消息不会进行存储,也不会计入计数), 在线 sendOnlineMessage

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

实时社群技术专题(二):百万级成员实时社群技术实现(消息系统篇)

对于其他频道,如果你仅仅需要知道该频道有多少条消息(或者有无消息),则可以选择订阅该频道的计数(或者状态),此时服务下发时仅会广播精简的消息体用于维护客户端计数,并且当计数达到一定阈值之后...技术角度看的话,主要解决2个问题:1)第一个是超大型服务器/频道的消息推送的效率问题;2)另一个是提供足够丰富的推送策略来帮助 C 端用户,避免被过量的推送消息给打扰。...基本的存储架构大致如下:图片消息的存储主要包括两部分:1)一部分是消息本身;2)一部分是计数。...,我们也选择了不同的存储方案(历史消息使用分布式时间序列数据库,计数使用分布式 k-v 数据库),最大化地提升消息存储和查询的性能和效率。...有写就有,针对读取操作:1)所有最近的消息计数均会存储在中心化缓存中,并通过先进先出和缓存过期等不同的策略来确保缓存中存储的永远是最新和最热的数据;2)对于消息 ID 和消息内容本身,中心化缓存中也会有不同的数据结构和过期策略

29620

消息之点不完的小红点(Node+Websocket)

当然在这个过程中涉及比较复杂的消息的存储,如何推送,获取,同步等问题,下面就是对这个过程进行详细的描述 ? 图上的流程解释 A....用户1进入房间,重置用户在房间1的消息,触发更新模块去更新B消息列表。 用户1向向房间B中发送了一条消息。 后端需要去获取房间用户列表,判断用户是否在房间?...是,因为在房间中的用户已经读取了最新消息,不需要进行计数。 否,若用户不在房间中,更新其的消息计数 从缓存中获取用户消息进行分发。 用户2登录我们的项目,离线用户变成了在线用户。...用户2登录时,触发查询模块,去获取其当前在各个房间消息情况。 查询模块去查询Redis中的消息,若Redis中没有数据,会继续向数据库中查询,若没有则返回0给用户。...,需要经过判断,哪部分用户需要计数,哪部分用户不需要计数图中可以看出,不在房间内的用户都需要计数

2.2K30

你问我答 | 即时通信IM(2021年5月-7月)

Q2:重新登录后,群聊消息如何第一条消息开始查看? SDK 提供的拉取历史消息支持指定的群消息 sequence 开始向前或者向后拉,也就是消息定位的能力。...消息开始的 sequece:可以通过会话最后一条消息的 sequece 减去会话的消息数得到。 Q3:消息没有收到或消息丢失如何处理?...Q7:即时通信IM群聊消息中,如何保证收发消息的顺序一致? 当消息发送成功以后能够获取一个序列号,通过序列号进行排序。 Q8:应用套餐退费后会马上停用应用么?...Q10:即时通信IM如何获取当前消息数量? 即时通信 IM 可通过 TIMConversation 的 getUnReadMessageNum 方法获取当前会话中消息的数量。...(对于聊天室,Server 不保存计数,每次登录后跟 Server 同步计数后将会清零。)

1K10

带你认识 flask 用户通知

为了让这个应用程序对我的用户更有用,我希望徽章自行更新消息的数量,而用户不必点击链接并加载新页面。上一节的解决方案的一个问题是,当加载页面时消息计数为非零时,徽章才在页面中渲染。...,以便在计数为0时隐藏徽章 07 向客户端发送消息通知 现在剩下的就是增加一种机制,通过这种机制,客户端可以定期接收有关用户拥有的消息数量的更新。...如果数据库已经有一个带有这个名称的通知,例如值为3,则当用户收到新消息并且消息计数变为4时,我就会替换旧的通知 在任何消息数改变的地方,我需要调用add_notification(),以便我更新用户的通知...第二个地方是用户转到消息页面时,计数需要归零: app/main/routes.py:查看消息视图函数 @bp.route('/messages') @login_required def messages...而当你点击消息链接时,消息数重置为零。

1.9K30

快给你的软件加IM聊天功能!

如何消息发出去?...就我个人而言,很多时候是看到了QQ或者微信App的角标,上面显示的多少条消息,才打开App,然后通过App里面具体某个联系人后面显示,和当前用户有多少条这个数字,来决定打开哪个联系人的聊天页进行查看...因此,我们在消息读数的实现上,一般需要针对用户维度有一个总读数的计数,针对某一个具体用户需要有一个会话维度的会话计数。...对于在IM服务端存储消息读数的分布式场景,如何保证这两个读数的一致性也是一个比较有意思的事情,这个问题我会留到第6篇来和你详细讨论。...IM服务端接收到发送的消息后,还会针对接收方进行读数的变更,以提醒用户查看消息消息读数的实现上一般分为:用户维度的总和会话维度的会话

1.6K10

《基于实践,设计一个百万级别的高可用 & 高可靠的 IM 消息系统》

(观察者),服务器无法一一监控客户端的状态,因此消息模块的数据交互使用拉模式,可以节约服务器资源; (2)当用户消息时,由客户器主动发起请求的方式,可以及时刷新客户端状态。...,服务器进而删除已消息。...ack机制的必要性 第一次获取消息完成之后,如果没有 ack 机制,流程是: (1)服务器删除已消息数据 (2)服务端把数据包响应给客户端 (3)如果由于网络延迟,导致客户端长时间取不到数据,这时客户端会断开该次...(业务数据提醒的接口性能优化) 可优化点 用户量巨大的系统的高可用方案之一,是部署多部连接管理服务器,以支撑更多的用户连接 用户量巨大的系统的高可用方案之二,是对单部连接管理服务,使用 Netty...《IM群聊消息究竟是存1份(即扩散)还是存多份(即扩散写)?》 总结 两年前架构师手上接过来的 IM 消息系统模块,让我逐步培养了架构思维,见贤思齐,感谢恩师。

1.6K42

如何设计一个亿级消息量的 IM 系统

通常有Android端、iOS端、Web端等等 读数 :指用户还没消息数量 用户状态 :指用户当前是在线、离线还是挂起等状态 关系链 :是指用户用户之间的关系,通常有单向的好友关系、双向的好友关系...,为了保证消息的实时性,一般采用推模式,拉模式一般用于获取历史消息 推拉结合模式:有新消息服务器会先推一个有新消息的通知给前端,前端接收到通知后就向服务器拉取消息 推模式简化图如下: ?...多端同步怎么做 扩散 前面也提到过,对于扩散,消息的同步主要是以推模式为主,单个会话的消息ID顺序递增,前端收到推的消息如果发现消息ID不连续就请求后端重新获取消息。...前端只需要记录最后同步的位点,同步的时候带上同步位点,然后服务器就将该位点后面的数据全部返回给前端,前端更新同步位点就可以了。 如何处理读数 在IM系统中,读数的处理非常重要。...如何存储历史消息 扩散 对于扩散,只需要按会话ID进行Sharding存储一份就可以了。

2.9K53

WEBIM计数不对?

确认是否开启自动已读上报,Server默认删除消息,切换终端、杀进程和退出登录读数会被清除,如果需要保留可以禁用已读上报disableAutoReport。...离线消息读数统计是根据离线消息进行统计,而离线消息有容量限制,如果容量超过会删掉老的消息,平均存储100条消息左右,消息内容越多,存储的越少。...web端计数统计 ALL ON ONE 的原则,一开始登录的第一条最近联系人的会话是不显示计数的 群计数初始值 web端群消息计数初始是通过最近联系人接口返回 登录成功后收到的群消息计数做加一的处理...C2C计数初始值 web端的计数是先获取到最近联系人的所有会话,然后sdk里面会将getmsg里面返回的消息对应之前的会话来做加一处理用来统计消息数 统计之后的计数用webim.MsgStore.sessMap...()i.unread()去显示 登录之后的计数根据消息监听做加一处理 //初始化最近会话的消息读数 function initUnreadMsgCount(){ var sess;

1.5K50

跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)

《IM通讯协议专题学习(六):手把手教你如何在Android上零使用Protobuf》8.《IM通讯协议专题学习(七):手把手教你如何在NodeJS中零使用Protobuf》9....2)客户端如何保证顺序:为什么要保证顺序?因为消息即使按照顺序到达服务器端,也会可能出现:不同消息到达接收端后,可能会出现“先产生的消息后到”“后产生的消息先到”等问题。...;3)群离线消息过多:群消息分页拉取,第二次拉取请求作为第一次拉取请求的ack;4)对于消息读数场景,每个用户维护一个全局的读数和每个会话的读数,当群聊非常大时,资源变更的QPS非常大。...这个时候应用层对读数进行缓存,批量写+定时写来保证计数的写入性能;5)路由信息存入redis会有写入和读取的性能瓶颈,每条消息在发出的时候会查路由信息来发送对应的gate接入层,比如有10个群,每个群...同时利用双buffer机制,避免计数写入阻塞。

99040

产品上新丨即时通信 IM SDK 5.3.425 版本发布了

新版本更新特性: 支持会话置顶 发送不计入计数消息 单聊消息免打扰 增加获取所有会话总数的接口 Android SDK 转移到 Maven Central 仓库发布 iOS SDK 新增 XCFramework...发送不计入计数消息 正常情况下,无论是发送 C2C 单聊消息还是发送 Group 群消息,都会计入消息数(通过会话对象 V2TIMConversation 的 getUnreadCount 接口...,可以拿到一个会话的消息数)。...当您希望发送一些不计入计数消息时,比如提示类或者控制类的消息,可以按照下面的方式来发送: ?...增加获取所有会话总数的接口 为了提高接口的易用性,新版本 SDK 增加了获取所有会话总数的接口 getTotalUnreadMessageCount。

1.4K30

IM即时通信探索(二)-- IM即时通信采坑

不支持 不支持 支持 不支持 成员变更通知(进群/退群等) 全员 全员 无 全员 是否需要在创建群组后发消息激活 需要 不需要 不需要 不需要 是否支持消息计数 支持 支持 不支持 不支持 是否支持导入群...同步消息过程完成,通过 OnRefresh 接口通知用户已完成消息同步。 用户调用 getMessage,如果本地消息不完整,SDK 自动拉取漫游服务器。...离线消息存储 即时通信 IM 支持离线消息缓存,即当用户不在线时,下次登录仍会拉取到离线消息。离线消息默认保存7天,如果用户7天内登录,再次登录时将不能获取到7天前的离线消息。...对于单聊消息,每个用户的离线消息缓存最多保存100个单聊会话的消息,每个单聊会话最多保存100条消息。超出限制的部分不会被计入计数,但这些消息仍会存到消息漫游中。...各类型群组消息能力差异 功能项 好友工作群(Work) 陌生人社交群(Public) 临时会议群(Meeting) 直播群(AVChatRoom) 是否支持消息计数 支持 支持 不支持 不支持 是否支持查看入群前消息记录

3.3K20

Redis在Php项目中的实际应用场景

id为123的商品相关信息 array('like_num '=> 1) 用户维度计数用户动态数、关注数、粉丝数、喜欢商品数、发帖数等计数 用户维度计数同商品维度计数都采用 Hash....:100000'); // 获取uid为10000的用户 array('like_num '=> 1) 存储社交关系 譬如将用戶的好友/粉丝/关注,可以存在一个sorted set中,score可以是...采用Hash结构对消息通知业务场景计数 $redis->hSet('user:1000:message:notice', 'system', 1); #设置1条系统消息 $redis->hIncrBy...('user:1000:message:notice', 'system', 1); #系统消息+1 $redis->hSet('user:1000:message:notice', 'comment...', 1); #设置1条评论 $redis->hIncrBy('user:1000:message:notice', 'comment', 1); #评论+1 $redis->hGetAll('

65130

某理财社区与微博Cache模型对比分析

因为一台专门负责获取信息流的 Redis 服务器每秒至少可以同时为 3,000 ~ 10,000 个用户获取信息流消息,所以这一操作对于规模较小的社交网站来说并不会造成什么问题。...但是对于规模更大的社交网站来说,程序每秒需要获取的信息流消息数量将远远超过单台 Redis 服务器所能处理的上限,因此我们必须想办法提升 Redis 每秒能够获取的信息流消息数量。...下面我们将会讨论如何使用只读的服务器提升系统处理查询的性能,使得系统的整体性能能够超过单台 Redis 服务器所能提供的查询性能上限。...在做好了能确保查询和写查询能够快速执行的一切准备之后,接下来要考虑的就是如何实际解决“怎样才能处理更多请求”这个正题。 提升 Redis 读取能力的最简单方法,就是添加提供能力的服务器。...通过将请求分散到不同的服务器上面进行处理,用户可以从新添加的服务器上获得额外的查询处理能力。

50210

高性能网络编程4--TCP连接的关闭

先不提其原理和实现,多进程、多线程下 close和shutdown方法调用时的区别说起。...如何关闭半连接?这时当然不能发FIN包,即正常的四次握手关闭连接,而是会发送RST复位标志去关闭请求。处理完所有半打开的连接close的任务就基本完成了。...检查是否有消息,若有则发RST关连接,不会触发等待。接下来检查是否有未发送的消息时与第2种情形一致,设好FIN后关闭angle算法发出。...调用close时,可能导致发送RST复位关闭连接,例如有消息、打开so_linger但l_linger却为0、关闭监听句柄时半打开的连接。...但关闭某方面来说是有意义的,例如不再接受新的连接。看看最右边蓝色分支,针对监听句柄,若参数为关闭写,则不做任何事;若为关闭,则把端口上的半打开连接使用RST关闭,与close如出一辙。

1.2K20

高性能网络编程4–TCP连接的关闭

先不提其原理和实现,多进程、多线程下 close和shutdown方法调用时的区别说起。...如何关闭半连接?这时当然不能发FIN包,即正常的四次握手关闭连接,而是会发送RST复位标志去关闭请求。处理完所有半打开的连接close的任务就基本完成了。...检查是否有消息,若有则发RST关连接,不会触发等待。接下来检查是否有未发送的消息时与第2种情形一致,设好FIN后关闭angle算法发出。...调用close时,可能导致发送RST复位关闭连接,例如有消息、打开so_linger但l_linger却为0、关闭监听句柄时半打开的连接。...但关闭某方面来说是有意义的,例如不再接受新的连接。看看最右边蓝色分支,针对监听句柄,若参数为关闭写,则不做任何事;若为关闭,则把端口上的半打开连接使用RST关闭,与close如出一辙。

1.7K50

即时通讯IM技术领域基础篇

用户在不同终端登录的情况下获取消息情况?...apns.在线的B,收到消息后回应ack进行确认.用户A发送消息到群C存储结构索引列表消息索引存在的意义在于保证消息的可靠性以及作为离线用户获取消息列表的一个索引结构。...消息索引由两部分构成,都存在redis中:记录用户每个好友的读数的hash结构每个好友对应一个zset结构,里面存着所有消息的id。假设A有三个好友B,C,D。A离线。...接收ack维护消息索引则相反,hash结构对应的field减1,然后将消息id相应好友中的zset结构中删除。消息下行(消息获取)该流程用户在离线状态的消息获取。...和在线的流程相同,离线客户端读取了消息后也要发送接收ack到业务端,告诉它消息已经下发成功,业务端负责维护该用户消息索引。

2.6K31

从新手到专家:如何设计一套亿级消息量的分布式IM系统

3)群:通常指多个用户之间因聊天而建立起的关联。 4)终端:指用户使用IM系统的机器(通常有Android端、iOS端、Web端等等)。 5)读数:指用户还没消息数量。...,为了保证消息的实时性,一般采用推模式,拉模式一般用于获取历史消息; 3)推拉结合模式:有新消息服务器会先推一个有新消息的通知给前端,前端接收到通知后就向服务器拉取消息。...8.4 多端同步怎么做 8.4.1)扩散: 前面也提到过:对于扩散,消息的同步主要是以推模式为主,单个会话的消息ID顺序递增,前端收到推的消息如果发现消息ID不连续就请求后端重新获取消息。...PS:多端同步这也是IM里比较坑爹的技术痛点,有兴趣请移步《浅谈移动端IM的多点登录和消息漫游原理》。 8.5 如何处理读数 在IM系统中,读数的处理非常重要。...8.6 如何存储历史消息 扩散:对于扩散,只需要按会话ID进行Sharding存储一份就可以了。

2.8K01

基于实践:一套百万消息量小规模IM系统技术要点总结

实现方案: 1)用户队列,zset(score 确保有序性); 2)消息实体列表,hash(msg_id 确保唯一性); 3)消息实体计数器,hash(支持群聊消息的引用次数,倒计时到零时则删除实体列表的对应消息...6、消息的消费模式 6.1 拉模式 选用消息拉模式的原因: 1)由于用户数量太多(观察者),服务器无法一一监控客户端的状态,因此消息模块的数据交互使用拉模式,可以节约服务器资源; 2)当用户消息时...,服务器进而删除已消息。...6.3 基于ack 机制的好处 第一次获取消息完成之后,如果没有 ack 机制,流程是: 1)服务器删除已消息数据; 2)服务端把数据包响应给客户端。...,第三方推送证书如何配置; 3)代码优化:单体架构拆分微服务; 4)存储优化:1.0 版本的 redis 存储到 2.0 版本的 redis+mysql; 5)性能优化:提醒等接口性能优化。

1.7K30
领券