我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Swoole webSocket消息服务系统怎么设计

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Swoole webSocket消息服务系统怎么设计

本篇内容介绍了“Swoole webSocket消息服务系统怎么设计”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

实现方案

用户消息服务主要有2部分组成,对外使用webSocket长链接服务提供给安卓/Ios手机客户端,web提供服务,对内使用Http服务。

鉴权和缓存周期设置

Swoole webSocket消息服务系统怎么设计

当服务端携带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请求用户消息服务,设置超时时间,允许丢失部分消息。

Swoole webSocket消息服务系统怎么设计

业务埋点处理

埋点再操作后异步触发,超时时间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;}

消息处理

Swoole有一个缺点就是如果没有建立websocket服务,就不能实时进行通信,所以这个地方我分两步处理,根据消息类型进行管理和消息的推送,存入redis list结构的队列中,使用Crontab,执行定时脚本处理。

设计方案为快慢2条双队列结构,快队列主要处理当前最新的消息,如果用户超过1天不上线,放入延迟队列执行,用户超过超过15天未登录,消息释放。

websocket的心跳时间是300s,所以crontab 4min,执行一次,延迟队列6分钟执行一次,我们的redis使用的是链接池单节点特点,整个服务都在依赖,所以这样设计的方案。

数据存储

数据使用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消息服务系统怎么设计”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Swoole webSocket消息服务系统怎么设计

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Swoole webSocket消息服务系统怎么设计

本篇内容介绍了“Swoole webSocket消息服务系统怎么设计”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现方案用户消息服务主要有
2023-07-05

Swoole webSocket消息服务系统代码设计详解

这篇文章主要为大家介绍了Swoole webSocket消息服务系统代码设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

Swoole webSocket消息服务系统代码怎么写

本文小编为大家详细介绍“Swoole webSocket消息服务系统代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Swoole webSocket消息服务系统代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-05

Swoole webSocket客服IM消息系统怎么实现

这篇文章主要讲解了“Swoole webSocket客服IM消息系统怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole webSocket客服IM消息系统怎么实现”吧!实现方
2023-07-05

Swoole webSocket消息服务系统压力测试解析

这篇文章主要为大家介绍了Swoole webSocket消息服务系统压力测试解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-14

Swoole webSocket消息服务系统压力如何测试

本篇内容主要讲解“Swoole webSocket消息服务系统压力如何测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swoole webSocket消息服务系统压力如何测试”吧!概述编程的内
2023-07-05

Swoole webSocket客服IM消息系统方案解析

这篇文章主要为大家介绍了Swoole webSocket客服IM消息系统方案解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-14

SwoolewebSocket消息服务系统方案设计详解

这篇文章主要为大家介绍了SwoolewebSocket消息服务系统方案设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

java开发微服务架构怎么设计消息队列

本篇内容介绍了“java开发微服务架构怎么设计消息队列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!消息队列的作用在微服务开发中我们经常会引
2023-06-25

云服务器怎么更换系统设备信息

一、系统设备信息系统配置云服务器的系统配置是指云服务器所运行的操作系统、网络协议、数据存储等信息。在云服务器的配置信息中,可以包含以下信息:系统名称:在云服务器的配置信息中,我们可以找到该系统的名称,如AliyunServer。CPU:云服务器的CPU类型是IntelCorei7或更高级别的处理器,如AMDRyzen3
云服务器怎么更换系统设备信息
2023-10-28

系统架构设计师报名信息怎么填?系统架构设计师报名信息填写要求

系统架构设计师报名信息怎么填?系统架构设计师报名职称栏怎么填?系统架构设计师报名在职情况选什么?针对这些问题,编程学习网小编整理了软考系统架构设计师报名信息填写要求的内容,详见正文。
系统架构设计师报名信息怎么填?系统架构设计师报名信息填写要求
2024-08-22

云服务器怎么做主备系统设计

一、主备系统设计云服务器主备系统设计主要包括以下几个方面:主系统和备系统的划分:在实际应用中,我们通常需要同时运行主系统和备系统。在云服务器中,通常将主系统放置在云服务器的中心位置,备系统则放置在云服务器的边缘位置。主系统负责提供云服务器的服务,而备系统则负责保障主系统的正常运行。数据备份策略:在云服务器的设计中,通常
2023-10-27

嵌入式系统设计师报名信息怎么填?嵌入式系统设计师报名信息填写要求

嵌入式系统设计师报名信息怎么填?嵌入式系统设计师报名职称栏怎么填?嵌入式系统设计师报名在职情况选什么?针对这些问题,编程学习网小编整理了软考嵌入式系统设计师报名信息填写要求的内容,详见正文。
嵌入式系统设计师报名信息怎么填?嵌入式系统设计师报名信息填写要求
2024-08-27

云服务器怎么做主备系统的设计

主备系统的可靠性设计云服务器的主备系统应该具备一定的可靠性,即在主系统出现故障时,备用系统可以正常运行。为此,主备系统需要进行冗余设计,可以考虑使用冗余系统、备用系统和主系统互为备份,以确保系统在出现故障时仍能够正常运行。此外,还需要定期进行系统的维护和检测,以保证系统的正常运行。主备系统的可扩展性设计在设计主备系统时
云服务器怎么做主备系统的设计
2023-10-28

云服务器怎么做主备系统设计教程

一、主备系统设计主备系统设计是指在一个云服务器平台上,针对不同的应用场景,设计相应的主备系统架构。通常情况下,主备系统架构的设计要考虑以下几个方面:负载均衡:云服务器需要支持多个服务器之间的负载均衡,确保系统在任何时候都能够正常运行。在负载均衡方面,通常采用硬件负载均衡器和软件负载均衡器两种方式。硬件负载均衡器主要用于处理服务器之间的负载均衡,软件负载均衡器则主要用于处理应用程序的负载均衡。数据备...
2023-10-27

云服务器怎么做内网穿透系统设计

访问控制:内网穿透系统应该对所有的用户和设备进行统一的访问控制。用户需要经过身份认证才能访问目标服务器,而设备则需要进行身份验证后才能访问目标服务器。例如,一个企业的内部网络可以使用IP白名单过滤来控制外部访问,只允许授权用户通过。身份认证:身份认证是内网穿透系统中最重要的环节。在内网穿透系统中,身份认证是通过验证用户
云服务器怎么做内网穿透系统设计
2023-10-28

Linux系统中怎么设置计划任务

这篇文章主要介绍了Linux系统中怎么设置计划任务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。cron 在 Linux 设置cron 是一个用于运行计划任务如系统备份、更
2023-06-28

云服务器怎么做内网穿透系统的设计

一、网络结构设计内网穿透系统需要将企业内部网络划分成多个区域,每个区域都需要一个网络IP地址,网络地址可以是内部员工或外部供应商提供的IP地址。同时,需要设置访问控制策略,例如仅允许授权用户访问特定的功能或区域。此外,还需要设计内网安全策略,例如防火墙规则、加密传输等。二、安全协议设计为了保护内部数据的安全,需要设计内
2023-10-27

云服务器怎么做内网穿透系统设计的

内网穿透系统通常由两部分组成:入侵检测和防御系统。入侵检测系统是一种基于网络安全技术的设备,它可以监测内部网络中的流量、网络设备、服务器等信息,并及时提醒管理员注意潜在的入侵威胁。防御系统是一种类似于安全审计的设备,它可以监测内部网络中的数据流、网络活动等信息,并及时发出警报和通知管理员。为了实现内网穿透系统的安全性,
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录