广告
返回顶部
首页 > 资讯 > 精选 >Swoole webSocket客服IM消息系统怎么实现
  • 130
分享到

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

2023-07-05 12:07:14 130人浏览 独家记忆
摘要

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

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

实现方案

技术的实现方案点主要PMQ,2组客户端(用户端、客服管理端),3个主要的部分组成(Push推送消息+Pull拉取未读消息+MessageQueue消息队列),具体流程和交互方式见上面的架构流程图。

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

建立链接,借鉴tcp3次握手的原理,将每一次的用户询问新增一个关系,询问结束时再将关系释放,因为每次随机分配的客服是不一致的,客服管理员控制台,进入控制台会触发检测客服映射关系的程序,以保证关系的唯一性。

客服分配:客服分配是根据用户是否为第一次进入链接进行判定依据,首次会随机分发配给在线客服中的其中一个,如果之前分配过的客服也在线,优化分配存在客服,这样处理的原因是客服不易变,用户异变,防止反复链接/断开操作,减少网络开销。

并发:相同用户在同一时间有3s的锁定状态,用来防止关系错乱,在客户端发来请求时优先获取缓存,近少可能的访问数据库,提高服务的稳定性和性能。

//设置分布式锁,3s之内只能请求一次$lock = RedisPool::invoke(function (Redis $redis) use ($toUid) {    return $redis->get(CateGory::$openLock . $toUid);}, self::REDIS_CONN_NAME);if ($lock) {    $msgErrorRet['code'] = 416;    $msgErrorRet['msg'] = 'Please try again';    return $this->response()->setMessage(JSON_encode($msgErrorRet));}//查询是否存在链接关系$imUserRelation = RedisPool::invoke(function (Redis $redis) use ($toUid) {    $redis->setEx(Category::$openLockPrefix . $toUid, 3, $toUid);    return $redis->get(Category::$imUserRelationName . $toUid);}, self::REDIS_CONN_NAME);

网络异常处理,回收服务:针对App崩溃、网络异常断开的链接,主动监听断开的fd,进行关系处理,对所有断开链接的websocket,进行回收,清除关系。

static function onClose(\swoole_server $server, int $fd, int $ReactorId){    $info = $server->getClientInfo($fd);    $fd = intval($fd);    if ($info && $info['websocket_status'] === WEBSOCKET_STATUS_FRAME) {        TaskManager::getInstance()->async(function () use ($fd) {            RedisPool::invoke(function (Redis $redis) use ($fd) {                //回收用户                $uid = $redis->hGet('PUSH_MSG_SOCKET_FD', $fd);                if (isset($uid) && !empty($uid) && is_numeric($uid)) {                    $redis->zRem('PUSH_MSG_USER_LOGIN', $fd);                    //检测是否有客服关系未断开                    $redis->del(Category::$imUserRelationName . $uid);                    $redis->hDel('PUSH_MSG_SOCKET_FD', $fd);                }                //回收客服管理用户                $cUid = $redis->hGet('PUSH_CUSTOMER_MSG_SOCKET_FD', $fd);                if (isset($cUid) && !empty($cUid)) {                    $redis->zRem('PUSH_CUSTOMER_MSG_USER_LOGIN', $fd);                    $redis->hDel('PUSH_CUSTOMER_MSG_SOCKET_FD', $fd);                }            }, 'redis');        });    }}

获取离线消息分配算法,按照客服管理员在线人数,把离线消息按照用户来重新组装,平均分配给在线管理员,如果数量不能被整除,也不会造成分配不均情况。

//验证客服管理员在线$vUid = [];$server = ServerManager::getInstance()->getSwooleServer();foreach ($virtualUid as $fd => $vid){    $info = $server->getClientInfo($fd);    if ($info && $info['websocket_status'] == 3) {        $vUid[$fd] = $vid;    }}if (!empty($pullData) && !empty($vUid)) {    $uIds = array_keys($pullData);    $row = ceil(count($uIds) / count($vUid));    $share = array_chunk($uIds, $row, true);    $keyDict = $vUid;    $pushList = [];    // code 组装代码略... }

websocket对象不回收:从控制台打开新窗口时,就会新增一个websocket对象,后来在浏览器中刷新处理的,没有找到回收的办法。

心跳:客服的websocket心跳使用的是实时push消息,5s循环一次,防止链接断开,服务下线。

实践Swoole里的坑

链接数变化正常,但是内存好像没有得到很好的释放,而且进程里也出现了很多野进程,野进程多可能存在的原因是这样的,你没有守护启动,然后主进程挂了,后面的进程找不到父进程,变成了僵尸进程或者是孤儿进程。

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

内存也不对劲,大概率是我执行脚本里出了问题,去掉了修改配置的语句,在Base类里加入了unset,及时释放掉内存。

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

出现问题的解决的原因是我在Crontab脚本里加了结束时长造成的问题,cli模式下的PHP生命周期进程得不到释放造成的,合理使用Swoole中的协程就好了。

ini_set('memory_limit', '1024M');set_time_limit(0);

感谢各位的阅读,以上就是“Swoole webSocket客服IM消息系统怎么实现”的内容了,经过本文的学习后,相信大家对Swoole webSocket客服IM消息系统怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Swoole webSocket客服IM消息系统怎么实现

本文链接: https://www.lsjlt.com/news/351593.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Swoole webSocket客服IM消息系统怎么实现
    这篇文章主要讲解了“Swoole webSocket客服IM消息系统怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole webSocket客服IM消息系统...
    99+
    2023-07-05
  • Swoole webSocket客服IM消息系统方案解析
    目录概述实现方案实践Swoole里的坑成果概述 基于Swoole的websocket服务,再之前的消息系统系列的第4篇,实现了更加复杂的业务场景,是对消息推送的完善和优化,代码本身...
    99+
    2023-03-14
    Swoole webSocket IM消息 Swoole webSocket 客服消息
  • Swoole webSocket消息服务系统怎么设计
    本篇内容介绍了“Swoole webSocket消息服务系统怎么设计”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现方案用户消息...
    99+
    2023-07-05
  • Swoole webSocket消息服务系统代码怎么写
    本文小编为大家详细介绍“Swoole webSocket消息服务系统代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Swoole webSocket消息服务系统代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-07-05
  • Swoole webSocket消息服务系统压力测试解析
    目录概述Jmeter 的基础使用step.01 Thread Group 线程组设置step.02 添加测试主体step.03 添加结果树 选择 Add > Listener ...
    99+
    2023-03-14
    Swoole webSocket压力测试 Swoole webSocket消息服务系统
  • Swoole webSocket消息服务系统压力如何测试
    本篇内容主要讲解“Swoole webSocket消息服务系统压力如何测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swoole webSocket消息服务系统压力如何测...
    99+
    2023-07-05
  • Swoole webSocket消息服务系统代码设计详解
    目录概述Swoole 与 EasySwoole安装EasySwoole框架注册服务 与启动加载异步和 DB(Redis/Mysql)使用WebSocket服务概述 已经Swoole...
    99+
    2023-03-23
    Swoole webSocket消息服务 Swoole webSocket
  • WebSocket如何实现服务器消息推送客户端
    这篇文章主要为大家展示了“WebSocket如何实现服务器消息推送客户端”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WebSocket如何实现服务器消息推送客户端”这篇文章吧。  一、背景  ...
    99+
    2023-06-02
  • HTML5 WebSocket怎么实现消息推送
    这篇“HTML5 WebSocket怎么实现消息推送”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2022-10-19
  • WebSocket实现简单客服聊天系统
    一 需求 一个多商家的电商系统,比如京东商城,不同商家之间的客服是不同的,所面对的用户也是不同的。要实现这样一个电商系统的客服聊天系统,那该系统就必须是一个支持多客服、客服一对多用户的聊天系统。 二 思路 ...
    99+
    2022-06-04
    客服 简单 系统
  • springboot怎么集成websocket实现消息推送
    要在Spring Boot中集成WebSocket实现消息推送,可以按照以下步骤进行操作: 添加依赖:在`pom.xml`文件中添...
    99+
    2023-10-26
    springboot websocket
  • SpringBoot怎么使用WebSocket实现群发消息
    这篇文章主要介绍了SpringBoot怎么使用WebSocket实现群发消息的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么使用WebSocket实现群发消息文章都会有所收获,下面我们一起...
    99+
    2023-06-08
  • SpringBoot中怎么使用WebSocket实现点对点消息
    本篇内容介绍了“SpringBoot中怎么使用WebSocket实现点对点消息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、添加依赖,配...
    99+
    2023-06-08
  • SpringBoot怎么整合WebSocket实现后端向前端发送消息
    这篇文章主要讲解了“SpringBoot怎么整合WebSocket实现后端向前端发送消息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么整合WebSocket实现后端向...
    99+
    2023-07-05
  • 怎么利用spring boot+WebSocket实现后台主动消息推送功能
    这篇文章主要讲解了“怎么利用spring boot+WebSocket实现后台主动消息推送功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用spring boot...
    99+
    2023-06-30
  • 怎么用redis发布订阅方式实现简易的消息系统
    这篇文章主要讲解了“怎么用redis发布订阅方式实现简易的消息系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用redis发布订阅方式实现简易的消息系统”吧!I. 基本使用1. 配置我...
    99+
    2023-06-19
  • Java怎么使用集合来实现一个客户信息管理系统
    这篇文章主要为大家展示了“Java怎么使用集合来实现一个客户信息管理系统”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java怎么使用集合来实现一个客户信息管理系统”这篇文章吧。1 客户类pub...
    99+
    2023-06-25
  • 怎么用RabbitMQ和Swoole实现一个异步任务系统
    这篇文章给大家分享的是有关怎么用RabbitMQ和Swoole实现一个异步任务系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统介绍从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产...
    99+
    2023-06-15
  • android怎么实现系统信息推送
    这篇文章主要介绍“android怎么实现系统信息推送”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android怎么实现系统信息推送”文章能帮助大家解决问题。判断是否是启动App,而非刷新界面执行该...
    99+
    2023-06-30
  • nodejs中怎么利用websocket实现一个实时聊天系统
    nodejs中怎么利用websocket实现一个实时聊天系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。client.html:<!D...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作