首页
学习
活动
专区
圈层
工具
发布

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

9、“圈组”消息系统技术实现1:在线广播对于一般的IM群组来说,在线广播的一般过程是这样的:依次查询群组里的所有人的在线状态,如果在线,则将消息发送给对应的长链接服务器。...当有新消息的时候,服务器通过订阅关系(而不是在线状态)查询到需要广播的列表,通过这种方式就不再需要遍历服务器/频道里的所有用户。但是当一个服务器/频道里在线人数非常多的时候,这个订阅关系仍然是巨大的。...对于其他频道,如果你仅仅需要知道该频道有多少条未读消息(或者有无未读消息),则可以选择订阅该频道的未读计数(或者未读状态),此时服务下发时仅会广播精简的消息体用于维护客户端未读计数,并且当未读计数达到一定阈值之后...,我们也选择了不同的存储方案(历史消息使用分布式时间序列数据库,未读计数使用分布式 k-v 数据库),最大化地提升消息存储和查询的性能和效率。...有写就有读,针对读取操作:1)所有最近的消息和未读计数均会存储在中心化缓存中,并通过先进先出和缓存过期等不同的策略来确保缓存中存储的永远是最新和最热的数据;2)对于消息 ID 和消息内容本身,中心化缓存中也会有不同的数据结构和过期策略

57420

Laravel 消息通知

每个通知类都包含一个 via 方法以及一个或多个消息构建的方法比如 toMail 或 toDatabase,它们会针对特定的渠道把通知转换为对应的消息。...使用 Notification Facade 主要用在当你需要给多个可接收通知的实体发送的时候,比如给用户集合发送通知。...访问通知 默认情况下,通知将按 created_at 时间戳排序,最近的通知位于集合的开头: $user = App\Models\User::find(1); foreach ($user->notifications...as $notification) { echo $notification->type; } 如果您只想检索「未读」通知,可以使用 unreadNotifications $user =...//直接在通知集合上使用 markAsRead 方法,而不是循环遍历每个通知: $user->unreadNotifications->markAsRead(); //您还可以使用批量更新查询将所有通知标记为已读

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    腾讯频道Feed流系统架构设计

    同时频道相比于其他产品有更加复杂的功能和权限,综上所述频道在所有维度都有更高的复杂度,而这些对于 Feeds 流都有着直接的关联影响。...个人动态:单用户加入的所有频道的所有子频道的帖子聚合列表,按发表时间排序。 发现页:基于推荐设计的全局内容流。 话题帖子列表:所有发表带有某个话题的内容流,支持两条排序流。...于是: 这里我们依然选择读扩散,可能又有人会问这里为什么不把我关注的所有的频道的帖子写一份给我,像微信朋友圈一样的设计,这样我就可以简单的查询自己的列表就可以了。...大家可以想象一个场景,我们先从索引层获取了一页10个帖子的 FeedID,然后去查询 Feed 详情的时候,发现8个甚至10个都处于审核中(由于我们的内容是按发表时间从新到旧排序,这种情况很常见),全被过滤掉了...以下是一个比较基础的读扩散方案: 这里的读扩散的扩散量为:单页数量*查询的页数*子频道数*频道数。

    39710

    物联网平台MySQL:消息推送系统如何用分表方案解决百万用户广播难题

    send_timeDATETIME发送时间普通索引is_deleteBOOLEAN是否删除这样设计的好处很明显:一条系统广播消息只需要存储一次,不会因为有1万个用户就重复存储1万次。...3.3 查询用户的所有消息用户登录后,需要看到自己的所有消息,包括已读和未读的。...4.4 查询灵活可以轻松实现各种查询需求:查未读消息数量按消息类型分组统计查询某个时间段的消息查询某类设备的告警消息5 性能优化建议5.1 索引策略在 user_notification_relation...表上创建 (user_id, is_read, create_time) 联合索引,这样查询未读消息会很快。...', is_read BOOLEAN DEFAULT false COMMENT '是否已读,默认未读', read_time DATETIME COMMENT '阅读时间,用户点击查看时记录

    12120

    Web网站通知系统设计

    1)分发方式 分发方式与Feed系统类似,多采用Push方式,即在指定时间内主动推送给用户。部分特定类型需要用户请求(Pull)拉取未读消息。...noticezhuangtai.png 有几种情况需要变通处理: 若用户未读信息较多(m=100),但第一页列表只能显示(n=10)条的话,那未读数字即为m-n=90; 某些产品会将点击等同于已读...即用户只要点击无论是否打开列表查看均认为已读。 这样的处理一般用于重要级别较低的消息。点击即已读可有效降低骚扰。 某些重要级别较高的消息已处理状态可以定义为用户进行相关操作后才为已处理,而非查阅。...3)消息处理后的状态需要统一。 消息需要标记是否已处理的状态,且状态在不同的终端是打通的。 如:用户在客户端对消息进行了查看,在web站点本消息应自动标记为已读状态。...物理上可以设置是否备份。 过期但用户未处理消息(用户长时间未登录但收到他人的回复)可以根据业务需求来处理。 如未读的私信/评论/回复永久保留等。

    7.5K41

    Redis升级

    限制登录次数功能 判断用户是否被限制登录 有:做相应的提示 没有 登录成功:清除失败错误次数 登录不成功(查询key是否存在,即是否第一次 错误) 第一次错误:设次数为1,user:loginCount...:fail:用户名进行赋值,同时设置失效期 不是第一次 (判断是否4次,是的话这次加1等于5,限制1小时),user:loginCount:fail:用户名+1 小于第四次,失败次数加1 // 这里笔者用了不规范的返回值...消息订阅 subscribe channel[channel] 订阅频道 psubscribe pattern[pattern] 订阅匹配的频道 publish channel message...将消息发送到指定频道 unsubscribe [channel | channel] 退订频道 punsubscribe [pattern | pattern] 退订匹配的频道 应用场景: 构建实时消息系统...缓存与数据库的读写一致 读: 如果查询数据缓存里有,直接返回 缓存里没有,去数据库查询,将查询结果放入缓存,并返回给客户端 对于更新时:会导致缓存数据和数据库不一致,可以先修改数据库,再修改缓存。

    1.2K30

    消息通知子系统用户需求

    这类提醒一般附带操作按钮,点击按钮会触发相应的操作,这种情况一般使用实时提醒。 系统公告:有系统平台发送到用户的信息,可向单个用户发送,多个用户发送,或者某一个特定用户类型发送,还有向全部用户发送。...(用户查看消息、用户回复消息、用户标记消息已读、用户查询消息) 通知在推送之前需要进行汇总合并,目的在于提高消息传播处理效率,减少骚扰,降低噪音,平衡服务器压力。 1....对于通知的处理在逻辑上可以分为两层:通知状态的处理和通知内容的处理。 4. 状态是否已读(已处理)。...通常初始数字即为系统推送过来的未读总量,用户点击数字进入相关功能列表查阅后,读取的动作完成,未读数字相应减少,注意并发访问导致数量变化的问题。...根据消息提醒信息的重要程度,可以设置为“点击已读”只要点击无论是否打开消息查看均认为是已读。

    2.8K40

    站内信设计

    ,一用户对多个用户发送消息(垃圾广告),或者系统对某特定的用户群体推送内容 一对全体:属于公告,是对全体用户生效的,每个用户都能收到这个公告消息 根据站内信的内容可将其大致分为(参考Bilibili模型...): 回复我的 @ 我的 收到的赞 系统通知 我的消息 其他关注点: 消息的设置:是否开启消息提醒、免扰时间、消息提醒的范围 消息提醒的时限:消息也需要设置时限,不然几年前发的公告,现在刚创建的用户也会收到...用户群体:对某些特定的群体发送消息,比如对常浏览科技区的用户发送科技短讯 消息订阅:对那些订阅频道的用户推送更新提醒 说了那么多,开始说重点了。...=7 DEFAULT CHARSET=utf8; status表示阅读记录的状态,0表示未读,1已读,2删除。...筛选出用户10 未删除的私信 二、用户10 点击阅读时 UPDATE t_message_record SET status = 1 WHERE c_id = 5 AND rec_id = 10 将阅读记录的状态修改为已读

    5.7K80

    2024 RedisAnd Mysql基础与进阶操作系列(18)作者——LJS

    】 5.1简介 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的...发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑 客户端发到频道的消息,将会被推送到所有订阅此频道的客户端 客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来 5.2...message 则第二部分是来源频道的名称 第三部分是消息的内容 5.3消息类型与之对应的命令 订阅 SUBSCRIBE 频道名称 [频道名称 ...]...: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。...事务执行阶段 在命令标记阶段之后,用户通过 EXEC 命令提交事务,Redis会按顺序执行所有标记的命令。 如果在执行过程中出现任何问题(例如,某个命令无效),其他命令仍会被执行。

    18410

    Echo 的私信列表与详情页是怎么做的

    私信详情 从图片上可以看出来,我们要做的事情大概有这些: 1)私信列表: 查询当前用户的会话列表,且每个会话只显示一条最新的私信 查询某个会话的私信数量 支持分页显示 显示未读消息数量 显示与某个用户对话的未读消息数量...显示所有对话的未读消息消息 2)私信详情: 查询某个会话所包含的私信 支持分页显示 访问私信详情时,将显示的私信设为已读状态 OK,先回顾下私信表的结构: id:私信/系统通知的唯一标识 from_id...当然,这个字段是冗余的,我们可以通过 from_id 和 to_id 推演出来,但是有了这个字段方便后面的查询等操作 content:私信/系统通知的内容 status:私信/系统通知的状态(这个字段就是我们实现未读消息的关键...3)显示该用户的未读消息数量,这个功能包含两点:显示与某个用户对话的未读消息数量;显示所有对话的未读消息消息。...所以你看到的效果就是这样的: 当你点开一个会话后,你会先进入第一页,然后第一页消息列表中的所有未读消息的状态都会被设置为已读;你进入第二页,于是第二页消息列表中的所有未读消息的状态都会被设置为已读...

    1.3K31

    在线客服系统客服消息表设计,我到底在想什么?​

    简单来说,就是​​记录客服和访客的聊天记录​​。但真正做起来,要考虑的东西可不少: ​​消息归属​​:谁发的?客服还是访客? ​​状态管理​​:消息是否已读? ​​...消息可能很长(比如用户粘贴了一堆错误日志),TEXT 更灵活,不会像 VARCHAR(255) 那样被截断。 ​​(3)状态管理:消息是否已读?​​...(1)单字段索引​​ kefu_id、visitor_id:快速查找某个客服或访客的所有消息。 created_at:按时间范围查询(比如“查昨天下午的聊天记录”)。 ​​...(2)联合索引​​ idx_kefuid_mestype_status(客服ID + 消息类型 + 状态): 典型场景:​​“查某个客服未回复的访客消息”​​。 组合查询时,避免全表扫描。 ​​...(2)消息已读回执​​ 目前 status 只有已读/未读,未来可以细化成: delivered(已送达) read(已读) replied(已回复) ​​(3)支持富媒体消息​​ 现在只存文本,但未来可能要存图片

    21210

    超越实习期的AI自动化工具:播客工作流与Slack导出器实战

    具体流程如下:图1:播客工作流流程图用户可以手动运行或按特定日期和时间调度该流程。在检查剧集是否包含正确关键词后,Claude会生成各种关键信息:剧集摘要、演讲者观点、带时间戳的引用、外发邮件草稿等。...Slack导出器由于数百个Slack频道包含数百甚至数千条消息,搜索和分析历史信息非常耗时。...与在终端实现中手动阅读每个频道不同,用户现在拥有一个更高效的UI,可以搜索甚至一次性选择所有频道:图3:Slack导出器Electron应用实现中的频道搜索用户选择一个或多个频道后,会获得以下导出选项:...现在,通过Claude桌面应用和/或Claude代码,用户可以搜索所有公共频道和已加入的私人频道,而无需导出。需要了解每个公司项目的进度?我的改进实现只需一次查询即可完成。...需要入职新员工,但所有团队成员都很忙?同样,一次查询即可解决。由于该工具的广泛应用,我们的团队可以专注于推动网络安全的前沿,而不是在Slack频道中筛选信息。

    9310

    Java消息系统简单设计与实现

    ; 可以查看关注的用户最新发表的文章,得到类似推送的效果; 所有消息当然也要标注好消息已读or未读,登录就能得到消息提醒标识好有多少未读消息,像是QQ消息右上角的小红点那样类似; OK,大致就是以上的功能...所以我们的规定是:不考虑像简书这样超大用户量,能够应付毕设就好啦..简单设计,嘻嘻嘻..不过也不要太不相信MySQL的性能,还是有一定容纳能力的! 问题二:用户要怎样正确得到自己的未读消息呢?...暴力一点方法是,反正通知表里有用户所有的消息,直接读取完,然后通过是否已读字段就能够找到正确的所有未读消息了,这..这么简单吗?...,也就是查询接受者是自己和发送者是自己的数据,然后根据时间和已读未读来建立私信列表; 读取私信时:这时已经有了明确的接受者和发送者,那就查询所有 发送者是对方接受者是自己 Or 发送者是自己接受者是对方...的数据,然后在前端拼凑出一左一右的聊天框; 发送私信时:先查询之前是否有记录,然后同上建立聊天框,点击发送之后把发送方设为自己接收方设为私信对象,然后在通知表中新建一条未读数据通知私信对象有私信来了

    3.3K40

    常见分布式应用系统设计图解(一):即时消息系统

    有新的消息就发送给用户。...因此它知道用户的当前在线状态,也知道最后一条发送成功消息的时间戳(状态)。这个状态可以用于决定用户离线时消息是否要通过其它方式通知用户。...这种方式下,同一 thread 下的消息都是按时序存放在一起的,读的效率非常高,写因为基本是 append,也很方便。 用户数据的存储,可以使用 RDB,也可以使用 KV 数据库。...这里面存放的数据库表包括:用户表;对话表;用户对话关联表:二者是 M:N 的关系,并且每个用户都可以有对于特定对话的设置,例如设置对话中的昵称,是否屏蔽消息通知等等。...用户的好友,也就是感兴趣的 Notification Service 的个体去订阅消息;还有一种思路是把状态更新到用户表里面,这样所有人都可以查询得到,这后一种方式适合非好友也要查看用户状态的情况。

    1.4K20

    Redis 应用与原理(一)

    如果是 Set 记录用户 ID(通常为长整型),那么每一个用户都需要 32 bit 的空间来存储 如果是 BitMap,则只需要 1 bit 空间来表示用户是否登录即可 基础操作: SETBIT:为位数组指定偏移量上的二进制位设置值...15 1 设置 uid 的用户在 2024 年 3 月的 16 日进行了签到 检查某天是否签到:GETBIT uid:oneline:202403 15 返回 1 说明 uid 用户在 2024 年...Redis的发布订阅机制包括三个部分: publisher: 发布者,是发送信息或数据的一方 在Redis中,发布者可以是任何客户端 发布者通过 PUBLISH 命令将消息发送到一个特定的频道 subscriber...: 订阅者,是接收信息或数据的一方 订阅者可以 "订阅" 一个或多个频道,以便接收发布者发送的消息 订阅者使用 SUBSCRIBE 命令订阅自己感兴趣的频道 channel: 通道,是一种传输信息或数据的媒介...通道是发布者和订阅者之间的桥梁,发布者通过通道将信息发送到订阅者 通道没有明确的创建和销毁步骤:当有客户端订阅一个频道时,该频道就存在;当最后一个订阅该频道的客户端取消订阅,该频道并不立即消失,但是没有任何作用

    29910

    【Redis】常用数据结构之List篇:从常用命令到典型使用场景

    消费者端:通过 BRPOP 命令同时监听多个频道对应的 List Key,该命令会按照参数顺序依次检查各 List 是否有消息,一旦某个频道存在待处理消息则立即返回并处理,实现多频道消息的阻塞式优先级消费...:channel:体育" 2) "news:1001"(先返回有消息的频道及消息内容)2.5.3微博Timeline实现微博用户动态流(Timeline)是 Redis List 数据结构的典型应用场景...,其核心需求是高效存储用户发布的动态序列并支持分页查询。...查询历史动态时,先根据时间计算目标月份的键名,再通过 LRANGE 获取该月数据。适用场景:用户动态发布频率稳定,且查询多集中于近期或特定时间段(如“近 3 个月动态”)。...适用场景:用户动态发布频率波动大,或需支持“第 5000 条动态”等绝对位置查询。

    17910

    基于 Redis 实现 Laravel 广播功能(下):在私有频道和存在频道发布和接收消息

    false : true; }); 先模拟一个微信群与用户表的映射关系,然后根据传入的用户 ID 和群 ID 判断群 ID 是否有效,以及用户是否在这个群里作为授权是否通过的依据。...客户端: 然后在 /broadcast 视图,就可以在开发者工具 Console 标签中看到输出的问候信息了,这个信息来自私有频道的广播信息: 如果用户未认证、或者未通过授权(不再这个群里面),是无法接收到这个私有频道的广播事件消息的...在存在频道广播事件消息 存在频道是建立私有频道基础之上的,因此需要也需要认证和授权,所谓存在频道其实指的是订阅了特定私有频道的所有在线连接,还是以微信/QQ群为例,通过存在频道我们可以统计某个群(私有频道...定义存在频道广播事件类 我们以统计当前微信群在线用户数为例进行演示,每当有新用户进入时,更新在线用户数并广播这个事件消息,为此我们需要创建一个标识用户进入微信群的广播事件类: php artisan make...,可以在分发事件返回实例上调用 toOthers 方法告知系统将这个事件消息广播给排除当前用户的所有其他在线用户。

    3.8K30

    如何设计一个可靠的消息系统

    如下示意图:图片通过上面的截图,我们来分析一下大致的功能点:每一个消息都具备消息类型,用户可以根据消息类型进行数据筛选。消息有消息名称、消息内容和消息接收时间等基本字段。消息分为已读和未读状态。...-- 消息状态,不能为空[1已读2未读] create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间,默认为当前时间戳...# 查询某种指定类型SELECT * FROM message WHERE receiver = "alice" AND type = 1;# 查询所有的消息当用户阅读某条信息之后,就将该信息设置为已读状态...-- 按创建时间倒序排序上述的SQL语句能够直接查询出用户的所有信息,但存在一个问题。...SQL语句合并查询得到所有的消息。

    62911

    如何设计一个可靠的用户信息系统

    如下示意图: 通过上面的截图,我们来分析一下大致的功能点: 每一个消息都具备消息类型,用户可以根据消息类型进行数据筛选。 消息有消息名称、消息内容和消息接收时间等基本字段。...消息分为已读和未读状态。 用户勾选了阅读消息,则消息会被设置为已阅读。 基础设计 要设计一个可用性高的软件,很难一步就直接能够实现。接下来我们,先一步一步的实现,最后在一点一点的完善。...# 查询某种指定类型 SELECT * FROM message WHERE receiver = "alice" AND type = 1; # 查询所有的消息 当用户阅读某条信息之后,就将该信息设置为已读状态...-- 按创建时间倒序排序 上述的SQL语句能够直接查询出用户的所有信息,但存在一个问题。...,使用下面的SQL语句合并查询得到所有的消息。

    32630

    为什么以及如何弃用仪表板

    用户的归因源是否真的需要通过API公开,是否会在近实时中使用?(不,绝对不会。)...自动化的仪表板弃用策略会获取所有的BI元数据,并自动删除长时间未使用的可视化。...import looker_sdk sdk = looker_sdk.init31() 通过SDK直接获取所有可能的数据。对于Looker来说,最有用的信息是获取所有的仪表板、查询和用户。...为自动通信创建一个弃用的Slack频道。任何使用BI工具的用户都应该被添加到这个频道中。 查询最近X-7天内未访问的可视化并发送Slack消息。...包括未使用53天(如果在60天空闲时间后删除)或83天(如果在90天空闲时间后删除)的可视化。为每个可视化发送一个Slack消息,标记创建它的用户。

    38010
    领券