PHP即时通讯设计实现
详解即时通讯设计实现(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即时通讯设计实现的更多相关文章
- IM即时通讯设计 高并发聊天服务:服务器 + qt客户端(附源码)
来源:微信公众号「编程学习基地」 目录 IM即时通信程序设计 IM即时通讯 设计一款高并发聊天服务需要注意什么 如何设计可靠的消息处理服务 什么是粘包 什么是半包 解决粘包和半包 IM通信协议 应用层 ...
- (Android 即时通讯) [悬赏],无论是谁发现一个漏洞奖励人民币1000元!
悬赏,无论是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通! 适用于: ...
- (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!
悬赏,不管是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通! 适用于:小米 ...
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- IM即时通讯:如何跳出传统思维来设计聊天室架构?
因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来.本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的. 相关推荐阅读几十万人同时在线的直播 ...
- 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...
- ActiveMQ 即时通讯服务 浅析
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- xmpp即时通讯的笔记(摘抄)
xmpp的使用: 即时通讯 instant messaging(IM) : -->实时收发信息! 即时通讯相关软件: **QQ,MSN,GoogleTalk,AIM,Jabber(XMPP别名 ...
随机推荐
- Beta冲刺博客
这个作业属于哪个课程 当然是属于程序分析与设计呀 这个作业要求在哪里 在这儿 团队名称 六扇门编程小组(团队博客) 这个作业的目标 完成为期两周的β版本冲刺 1.团队信息 姓名 学号 曹欢(组长) 2 ...
- python一个源文件调用另一个源文件的函数
使用软件:pychram 这个是使用了Dight.py的mai()函数,也已经成功运行,但是为什么pychram在下面划红色的波浪线呐.
- kafka producer 生产者客户端参数配置
在生产者向broker发送消息时,需要配置不同的参数来确保发送成功. acks = all #指定分区中有多少副本必须收到这条消息,生产者才认为这条消息发送成功 acks = 0 #生产者发送消息之后 ...
- 【转帖】龙芯将两款 CPU 核开源,这意味着什么?
龙芯将两款 CPU 核开源,这意味着什么? https://www.oschina.net/news/78316/loongson-open-source-two-cpu-core 文章挺不错的 也讲 ...
- [转帖]Kafka 原理和实战
Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读 · 读完需要 101 分钟 ...
- 小菜鸟之oracle触发器
1.触发器说明 触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用 2.触发器类型 根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类 (1)DML触发 ...
- ROS的初步学习--创建一个工作空间和一个程序包
快速开始 创建工作区(workspace) 工作区可以作为一个独立的项目进行编译,存放ROS程序的源文件.编译文件和执行文件.建立工作区的方法如下: mkdir -p ~/catkin_ws/src ...
- Python 异常处理与反射机制
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 核发电站 (dp前缀优化)
大意: $n$个城市, $m$种核电站, 第$i$种假设要建在第$x$个城市, 必须满足$[x-i,x+i]$范围内无其他核电站, 求建核电站的方案数. 简单$dp$题, 设$dp[i][j]$为位置 ...
- Mybatis 多个参数传入的多种方法
ist<XXXBean> getXXXBeanList(HashMap map); <select id="getXXXBeanList" parameterTy ...