Swoole - webSocket消息服务系统方案设计篇
概述
基于Swoole的websocket服务,计划整合3篇进行技术整理,该服务主要有2个核心业务,用户消息服务(消息计数统计)和 客服IM消息系统服务,这篇先说用户消息服务是怎么设计实现的。
【资料图】
实现方案
用户消息服务主要有2部分组成,对外使用webSocket长链接服务提供给安卓/Ios手机客户端,web提供服务,对内使用Http服务。
鉴权和缓存周期设置
当服务端携带Token来访问请求webSocket服务,进行用户中心进行权限验证,如果权限通过,在本地进行信息缓存,返回给请求端,为了防止缓存雪崩(雪崩就是指缓存同一时间到期),用户访问峰值是晚间21-24点这个时间段,峰值大概100w/请求,持续4个小时左右,但因为用户中心的缓存时间为7300s,所以这里的过期时间公式:
$uid = $redis->get($token);$expireTime = 3650 + rand(1, 3000); $uid = OAuth::getUserInfo($token);if (!empty($uid) && intval($uid) > 0) { //存入缓存时间,过期时间小于 7300s $redis->setEx($token, $expireTime, $uid);}if($uid && $uid > 0){ $key = "token_".$uid; $redis->setEx($key, $expireTime, $token);}
本地服务的缓存怎么存储,具体看自己的业务情况,适合自己的就是最好的。
Http服务
Http服务的安全依赖于服务只针对云服务器内网访问,主站有服务变更时,异步埋点在功能里,比如有系统消息、评论、站内信等一系列操作的时候,会通过http请求用户消息服务,设置超时时间,允许丢失部分消息。
2.1 业务埋点处理
埋点再操作后异步触发,超时时间2秒,如果失败再进行一次重试,如果失败,其实基本就是服务挂了,局域网处理,性能传输成本几乎为0,这个地方相当于消息的生产方。
public function swooleComment($uid, $data){ $url = $this->swooleUrl . "/api/comment/message"; $commentUid = empty($data["comment_uid"]) ? 0 : $data["comment_uid"]; $msg = [ "uid" => $uid, "msg" => json_encode(["comment_uid" => $commentUid]) ]; $res = Curl::posturl($url, http_build_query($msg), $this->_headerQArr, 2); if ($res === false) { // 请求失败再重试一次 usleep(100000); $res = Curl::posturl($url, http_build_query($msg), $this->_headerQArr, 2); } return $res;}
2.2 消息处理
Swoole有一个缺点就是如果没有建立websocket服务,就不能实时进行通信,所以这个地方我分两步处理,根据消息类型进行管理和消息的推送,存入redis list结构的队列中,使用Crontab,执行定时脚本处理。
设计方案为快慢2条双队列结构,快队列主要处理当前最新的消息,如果用户超过1天不上线,放入延迟队列执行,用户超过超过15天未登录,消息释放。
websocket的心跳时间是300s,所以crontab 4min,执行一次,延迟队列6分钟执行一次,我们的redis使用的是链接池单节点特点,整个服务都在依赖,所以这样设计的方案。
2.3 数据存储
数据使用Mysql存储,Uid进行分表取模,采用分表的初衷是因为当时已经有300w+的用户,消息多,所以采用分表设计,所有的操作依赖于uid这个变量,所有的操作都采用TaskManager异步操作,以保证最大的性能。
protected function _getTableName(int $uid): string{ $tableIndex = intval($uid % 128); return "user_push_msg_" . $tableIndex;}
protected function addAsyncMysql( array $pushMsg, int $uid): ?bool{ $tableName = $this->_getTableName($uid); if (empty($pushMsg) || empty($tableName) || empty($uid)) return false; TaskManager::getInstance()->async(function () use ($pushMsg, $tableName) { DbManager::getInstance()->invoke(function (ClientInterface $client) use ($pushMsg, $tableName) { $model = PushMsgModel::invoke($client, $pushMsg); $model->tableName($tableName)->save(); }, self::MYSQL_CONN_NAME); });}
用户消息数统计
在业务中有全体用户,全体作者,签约作者等分组的情况,成为统计中的重点和难点,一共分分2步解决。
第一步,在http消息接收端专门放置一个消息计数器对用户单条发送的消息进行计数,只统计针对用户的消息。
第二步,新建一个mysql表,专门用于统计用户最近查看消息的时间戳,根据用户最后的查看消息时间来统计群组中的未读消息数,把两个结果进行相加,得出用户未读消息数和。
表的设计用uid做主键,保持用户的唯一性,使用REPLACE INTO
进行更新,REPLACE INTO
的好处是如果主键uid存在,更新时间,如果不存在则新增数据。
CREATE TABLE `table` ( `uid` int(10) unsigned NOT NULL DEFAULT "0", `unixtime` int(10) unsigned NOT NULL DEFAULT "0", PRIMARY KEY (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="用户查看消息最新时间"
标签:
推荐
- Swoole - webSocket消息服务系统方案设计篇
- 抽象劳动转移了什么价值_抽象劳动
- “妖镍”事件余波:港交所旗下LME遭5机构索赔逾千万英镑
- 罪城电视剧剧情
- 如何走出失恋 一切都会过去的|心理学:走出失恋的5个要点 天天微动态
- 天天热点!怎样修复win7系统(win7如何修复系统)
- 锅巴饭的做法
- 神医喜来乐主题曲原唱_神医喜来乐片头片尾曲都是谁唱的|重点聚焦
- 吴费曼 天天新动态
- 湿地深处的“护鸟人” 全球快资讯
- 凯大催化登陆北交所,持续经营能力曾遭两轮问询
- 环球精选!2008奥运会中国拿多少块金牌
- 窗棂是什么意思 快资讯
- 慈善基金
- 观速讯丨杭州小鱼家科技有限公司_关于杭州小鱼家科技有限公司简述
- 各地名小吃大全_各地名小吃|世界快播报
- 泰国免核酸向全球游客开放什么情况 世界球精选
- 长沙浏阳两所中学结对共建 促进农村义务教育高质量发展 微动态
- 环球新消息丨台风凡亚比
- 红楼梦里最有趣的人物是谁?不是刘姥姥,不是史湘云_快消息
- 百联集团与上海建科集团达成战略合作 每日热文
- 暖宝宝成分及原理_天天最资讯
- 兴业银行与Visa联合发布《2023年度消费洞察白皮书》
- 最帅的名字-最新快讯
- 2023杭州湘湖半程马拉松线上马拉松的成绩证明有效吗?
- 速7 天天看点
- 【全球独家】常熟cnz_中国常熟网官网
- 怎么降低图片文件大小_降低图片文件大小|每日报道
- 微信怎么发文字
- CBA排名!广东反超辽宁升第2,同曦5连败,马布里基本无缘季后赛
- 当前速读:工程可行性研究报告
- 红酒有保质期在哪里看_红酒有保质期
- 世界播报:关于头尾的成语
- 证监会下场捉妖,搅局者现身说法,四大操纵股价案独家剖析:有一种操纵叫两招制胜,有一种打击叫一击致命-世界滚动
- 花旗将在巴黎开设一层新的交易业务办公室 拟将当地员工人数增加一倍
- 海岭
- 邱国正首透露:台美正商谈“美军弹药存放台湾”
- 内蒙古几月份旅游最佳_内蒙旅游最佳时间 环球简讯
- gta5怎么两个人联机
- 全球实时:嘀嗒出行三战IPO 宋中杰的四个考题
- 属龙人2019年运势怎么样 世界微资讯
- 开局之年传递高质量发展信心 十四届全国人大首场“部长通道”开启 世界最资讯
- hp m1136mfp打印机卡纸怎么办_hp m1136mfp打印机驱动
- 03月06日00时广东珠海疫情数据 阳了以后为什么会腰疼?应该怎么办?
- crp检查哪些指标_crp是什么指标 环球微头条
- 中国艺人去朝鲜演出_中国艺人网-天天热消息
- 要闻:40平米小户型装修效果图_40平米小户型装修
- 环球关注:「视频」南京鸡鸣寺景区本周末客流量井喷式增长,交警扩大管控合围区域
- 天天讯息:2岁宝宝拉肚子一周精神状态良好_2岁宝宝拉肚子怎么办
- 世界热门:百米最新排名_百米记录排名
- 环球观察:七夕王圆坤_王圆坤生日
- 国乒阻击张本智和兄妹,梁靖崑与林诗栋会师男单决赛
- 十大美容院加盟连锁品牌前十名 美容院加盟哪个牌子比较好 今日热文
- 范乔丹25+10比尔空砍21+10 猛龙加时力克奇才_世界快讯
- 世界新动态:茉莉花可以放卧室吗 卧室里放茉莉花好吗
- 玩具品牌排行榜前十名 儿童玩具品牌十大排名
- 断桥铝是什么意思啊_断桥铝是什么意思
- 约翰逊发声:不支持苏纳克与欧盟达成的北爱新协议|通讯
- 环球速看:word立方米符号怎么打_立方米符号怎么打
- 环球快播:爱的流刑地
- 东湖樱花园预约公告及防疫须知-环球今头条
- 半条命2_关于半条命2的介绍
- 全球关注:2022年国内生产总值超121万亿元 发展质量稳步提升
- 2010年版·生态学基础模拟试题|天天观察
- 7.0潘达利亚怎么去_魔兽世界7.0怎么去潘达利亚 全球热文
- 历组词有哪些_历的组词有哪些
- 住宅公摊面积包括哪些部分_公摊面积李嘉诚
- 自做糍粑怎么做_糍粑的做法步骤说明
- 张家界著名景点作文_张家界著名景点_世界聚看点
- 当前头条:今日全国碳市场收盘价55.50元/吨,较前一日上涨0.91%
- 财通证券给予中微公司增持评级 营收规模快速扩张 关键刻蚀设备取得进展
- 全球简讯:后继无人!又一支中国传统强队失去竞争力,阵容已残缺不全
- 环球热推荐:电脑开机启动项在哪里设置开机启动项目_电脑如何设置开机启动项目
- 全球看热讯:中国足彩网竞彩1日推荐:热刺客场小胜
- 邮储银行鹰潭分行:让存款保险宣传成为习惯 全球短讯
- 个人缴纳社保一年要交多少钱_社保一年要交多少钱 环球今日讯
- 全球要闻:横琴新区板块2月28日涨0.8%,华发股份领涨,主力资金净流出9587.32万元
- 氧化镨、氧化钕、氧化铒最新价格 环球热门
- 大幅降低企业交易成本,上海推出食品相关产品生产许可补充检验方法改革
- luv me luv me 要说出来 环球时快讯
- 福特与里维安宣布达成3.8亿英镑的合约 以开发新的电动福特
- 赵峥_说一说赵峥的简介
- 对不起我弃剧了,三大原因给《九霄寒夜暖》拉胯,条条致命
- 闫妮演过的电影大全_闫妮演过的电影
- 印象深刻的一个人450字作文_印象深刻的一个人_热闻
- 上海临港新片区将构建全域AI场景示范区 加快发展智能汽车产业
- 今日看点:TiO2介晶的可控合成及其形成机理与储锂性能的研究
- 甲流进入高发期奥司他韦被抢断货,囤药其实是“囤积”恐慌-天天实时
- qq飞车情侣名字_qq飞车4字情侣名字
- 焦点热议:一按灵
- 天天最资讯丨联想g460配置_联想g460
- 世界微动态丨凯特终于“翻身”!3年来首次力压梅根成王室最具时尚影响力人物
- 梦里全是桂花香
- 为啥叫崔泽喜东东_崔泽为什么叫喜东东 焦点速看
- 《活法》2022读后感
- 安阳:精准帮扶 助力女性就业
- 个人社保缴费要交多少年?个人社保缴费怎么交?
- 世界即时:xlive.dll不兼容_xlive dll丢失
- 全球旅游业喜迎中国游客(国际论道)
- 《三体》中用太阳放大信号并不靠谱_即时焦点
X 关闭
行业规章
X 关闭