最新快讯!Swoole - webSocket消息服务系统方案设计篇
基于Swoole的websocket服务,计划整合3篇进行技术整理,该服务主要有2个核心业务,用户消息服务(消息计数统计)和客服IM消息系统服务,这篇先说用户
基于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请求用户消息服务,设置超时时间,允许丢失部分消息。
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服务,计划整合3篇进行技术整理,该服务主要有2个核心业务,用户消息服务(消息计数统计)和客服IM消息系统服务,这篇先说用户
欧盟统计局周三公布的数据显示,2022年第四季度的欧元区GDp与前一季度持平,低于环比增长0 1%的初步估计。欧元区经济在2022年底未能实现扩张,
1、钱塘江大潮的形成原因有三:天时、地利和大风。2、首先说天时:潮汐的形成,主要受到地球的自转和太阳、月亮引力的影响,引
咖啡吸金,但瑞幸难学。文|华商韬略谢泽锋成立五周年之际,瑞幸营收破百亿,首次实现全年盈利,重塑了中国咖啡行业的整体格局。尽管外部环境不
1、深圳市雅乐电子有限公司是位于中国深圳的一家专业电子产品公司,是中国首个金属耳机的开发者与领航者。2、于2006年投资
报道称,针对现役军人持有毒咖啡包涉案,台陆军第六军团8日表示,辖属3名士兵集中受训中,昨天外出被警方查获持有不明毒品咖啡包,军方全力配
一雷惊蛰始,夔牛唤春至。2023年3月6日,河南省三门峡市,渑池县仰韶酒庄仙门山景区陶香洞天白酒洞藏基地前,80面夔牛鼓整齐列开,传承了千
核桃它是我们平时比较常见的一种坚果,它的营养价值高,有很多人都喜欢吃。吃核桃也要讲究时间,若吃对了会有利于长寿,若吃错会对身体的健康
1、长安街,是北京市的一条东西轴线,因位于旧时长安左门、长安右门内而得名,“长安”是中国汉唐国都,有长治久安之意。2、东
星落凝成糖已经仅剩最后的六集了,现在高潮已经来袭了,下期预告当中,姐姐自刎下线,而妹妹悲愤不已,一下子就爆发出了身体的力量,黑化开始
蹭蹭族,意思是指通过共享别人资源享受某种便利的群体。在都市里,出现了以蹭”为乐的蹭蹭族”,“吃人家的嘴软”在他(她)们眼里已成过时...
景和作为剧中的二骑,也是一个重点塑造的对象,下面我们就来说说景和从开始到现在的变化吧。首先就是第1话的景和了,当时其还是一个刚刚毕业的
1、科罗拉多大学(博尔得)(UniversityofColoradoBoulder,简称CU-Boulder)创办
来源:期货日报作为国内最早提出实施碳中和路径的工业部门之一,纺织行业在绿色制造、再生循环、可持续管理创新等方面走在前列。纺织化纤企业
1、路桥费Highwaybridgeexpense。2、是过路费和过桥费的总称。3、依据《公路法》和《收费公路管理
今天小编岚岚来为大家解答以上的问题。有沢杏三围,有沢杏相信很多小伙伴还不知道,现在让我们一起来看看吧!1、有沢杏1。2、
1、成都这边,我坐的线路是龙泉到软件园的,已经坐了一个多月了。2、服务嘛,总体来说还不错,有点精细化运营的味道,但是个别的司机服务还是
1、上海市松江区妇幼保健院座落在松江区松江镇乐都路。2、成立于1984年。3、主要有产科、妇科、儿科、内科、乳腺科、皮肤
3月6日上午,全国政协委员、申万宏源证券研究所首席经济学家杨成长在小组讨论时表示,当前扩大基础设施投资,要着力突破五个瓶颈。一是突破项
1、地震预警是指在破坏性地震发生以后。2、在某些区域可以利用“电磁波”抢在“地震波”之前发出避险警报信息。3、以减小相关
“阿姨,您今天来得真早,麻烦您把身份证给我,我先帮您进行信息登记,把条码打出来后您就可以去体检了……”2月24日,梨园社区卫生服务中...
1、空压机是空气压缩机的简称(英文为:aircompressor)是气源装置中的主体,它是将原动机(通常是电动机)的机械能转换成气体压力能的装置,
1、连接电脑,登录计费软件。2、注意只能给个人开普通发票。3、选择普通发票填写,进入开票界面。4、在“买方”(发票抬头)
1、《狼狈》(又名《整容天后》)又肥又丑的莉莉子(泽尻英龙华饰)原本在专供有“肥妹廦”人士寻欢的夜店内工作。进行了风险极高的全身整...
1、没有。2、雷叔说过了--、。本文就为大家分享到这里,希望小伙伴们会喜欢。
1、《秀丽江山之长歌行》是上海剧合影视文化有限公司、林心如影视文化工作室等联合出品的古装历史剧,由林峰、陈权执导,林心如
农历惊蛰时节,武夷山举办2023年“喊山祭茶”活动,通过祭茶纳福,祈愿茶事顺利、茶叶丰收。
佳慕护肤品是香港希格美容科技有限公司旗下的一个品牌。是由国内中医与香港生物基因研究院,共同合作创立的美容科研机构。佳慕护肤品的科技研
振东制药3月6日公告,山西证监局决定对公司及董事长李安平、董秘周红军、财务总监刘长禄采取责令改正并出具警示函的监督管理措施,并记入证券
2 第二十四届冬奥会,即2022年北京冬奥会。北京2022年冬奥会定于2022年2月4日星期五开幕,2022年2月20日