详解即时通讯设计实现(PHP+GatewayWorker+Redis)

需要实现的功能

  • 一对一聊天(私聊)
  • 一对多聊天(群聊)
  • 类似QQ,微信等聊天列表 实时消息 显示

工具选择

  • GatewayWorker 有如下特性(更多请参考官网手册)

    • 基于Workerman开发
    • 基于Gateway、Worker进程模型
    • 支持分布式部署
    • 支持高并发
    • 支持全局广播或者向任意客户端推送数据
    • 支持各种应用层协议
    • 多协议支持
    • 支持对象或者资源永久保持
    • 高性能
    • 方便与其它项目集成
    • 支持长连接

我们主要使用它的WebSocket通讯协议,并且此框架非常方便的与 ThinkPHP,laravel 等框架结合使用,GatewayWorker可独立部署,php负责相关的业务逻辑

  • Redis 键值操作,集合列表等。

即时通讯中,最重要的是响应速度,我们需要展示 “消息列表” 那么这时会有 未读消息,未读数量,最后一条消息内容,时间等等。

websocket与GatewayWorker 原理使用 将不再叙述,不懂的童鞋 请上度娘

效果展示

群聊|私聊效果图

消息列表效果图

数据库设计(群聊,私聊 分开)

私聊设计(简要设计)


参数名 说明
id 主键
sender_id 发送者id
receive_id 接收者id
chat_identify 标识 :a与b聊天,b与a聊天。记录 a-b
message_details 消息内容
last_time_at 聊天时间间隔 超过一定时间时记录
  • chat_identify 字段用处,这个字段是为了更方便的查找 a,b 之间的聊天记录。
  • last_time_at QQ,微信聊天记录之间,隔一段时间会有 时间 记录,并不显示每一条聊天记录的时间

群聊(简要设计)

  • 与私聊很像,只不过接收者id,变成 group_id 群组id。

消息列表设计,希望看到的效果是 “私聊,群聊”等都在一个列表展示,并且数据实时发生变化。这里借助Redis

每个用户的列表都是一个集合 key = message_list:user_id

Redis集合存储 消息类型 1私信,2群聊

message_list:user_id{
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
} 查找每个人的消息列表,直接取出该列表即可,但每个成员 都要对应 ‘未读消息数量’,‘最后一条消息内容’,‘最后一条小时时间’。由于是可变的,所以需要单独存储 Redis 键值 key = message_content:user_id_消息类型_id key =>json_encode(['消息数量','最后一条消息内容','时间']) 上面 集合列表里的每一个成员都 对应这里的每个键值。
  • 消息更新都要操作Redis,相应的更新内容。
  • 速度上 毋庸置疑,redis 相当的迅速。

需要后续优化的地方

  • 私聊|群聊 记录表。目前设计是单表单库。显然,随着用户量增加,必然爆棚。影响查询的响应速度。

    • (解决方案无非:分库分表,转移备份历史记录)
  • GatewayWorker 通讯框架,是单服务器部署,不能支持太高的并发。

这里只是对 即时通讯 设计上做了一些简要的阐述,如有疑问和建议,请在评论区回复。

PHP即时通讯设计实现的更多相关文章

  1. IM即时通讯设计 高并发聊天服务:服务器 + qt客户端(附源码)

    来源:微信公众号「编程学习基地」 目录 IM即时通信程序设计 IM即时通讯 设计一款高并发聊天服务需要注意什么 如何设计可靠的消息处理服务 什么是粘包 什么是半包 解决粘包和半包 IM通信协议 应用层 ...

  2. (Android 即时通讯) [悬赏],无论是谁发现一个漏洞奖励人民币1000元!

    悬赏,无论是谁发现一个漏洞奖励人民币1000元!   3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通!  适用于: ...

  3. (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!

    悬赏,不管是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通!  适用于:小米 ...

  4. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  5. IM即时通讯:如何跳出传统思维来设计聊天室架构?

    因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来.本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的. 相关推荐阅读几十万人同时在线的直播 ...

  6. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  7. ActiveMQ 即时通讯服务 浅析

      一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...

  8. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  9. xmpp即时通讯的笔记(摘抄)

    xmpp的使用: 即时通讯 instant messaging(IM) :  -->实时收发信息! 即时通讯相关软件: **QQ,MSN,GoogleTalk,AIM,Jabber(XMPP别名 ...

随机推荐

  1. @ControllerAdvice和@ExceptionHandler

    1. 使用 @ControllerAdvice和@ExceptionHandler处理全局异常 1. 新建异常信息实体类 非必要的类,主要用于包装异常信息. package com.test.exce ...

  2. 【转帖】Webmin 安装 (centos7 rpm 方式)

    https://www.cnblogs.com/osfipin/p/5948803.html 这两天公众号都在手这个小工具, 今天早上试了下 挺好用的 还看到了启动 samba 的方法. 一会儿 再学 ...

  3. 网络协议及socket

    实体层:就是把电脑连接起来的物理手段.它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号. 链接层: 单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义? 这 ...

  4. DAG添边定理

    让DAG变成强连通就是把尾和头连起来,也就是入度和出度为0的点,添的边数:max(num_in==0,num_out==0)

  5. 【AC自动机】病毒

    [题目链接] https://loj.ac/problem/10062 [题意] 寻找一个没有模式串为子串的无限01串.是否存在. [题解] 其实就是用dfs找一个环. 1.环需要从根结点出发找到这个 ...

  6. k8s-搭建 EFK 日志系统

    搭建 EFK 日志系统 大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana( ...

  7. django API返回中文乱码

    renturn HttpResponse(json.dumps(data,ensure_ascii=False))

  8. 怎样理解JS的预解析机制

    JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...

  9. Angular7如何动态刷新Echarts图表

    1 概述 echarts是百度的开源图表插件 Angular中引入echarts网上教程很多 Angular引入echarts,并使用动态刷新 2 安装 请参考大神的博客:https://blog.c ...

  10. Apache开启.htaccess 支持

    (1) <Directory "${SRVROOT}/htdocs"> # # Possible values for the Options directive ar ...