环境说明
- php7 + predis 扩展 + swoole2.0.7 扩展 + swoole framework框架
- mysql5.7 + redis 3.2.1
- supervisor(进程监控,自动重启进程等功能)
https://github.com/yeyute/php-swoole-IM.git 后端代码,README.md 有前端接入方法(ps:如果对你开发有帮助,请来个start)
使用swoole framework开发 IM 系统
优点:
- 简单易用且开发效率高
- 有大平台选用案例,例:虎牙直播,yy语音
- 纯C编写性能强等
supervisor 进程监控 说明
查看http://www.cnblogs.com/shijingjing07/p/6024066.html 文章,清晰
系统架构逻辑
以下是 微信端 用户通讯信息的逻辑架构示例:
注:
- 有区分不同的直播频道,每个频道的用户都写入在不同的redis集合中,每次发信息广播时,都会在web层广播该频道的所有用户。
- 图中*号代表每次广播给所有用户
- ios手机关屏会断会断开链接
系统性能(根据官方给的压测信息)
根据开发环境的压测结果(cpu:2, 内存:4G),只进行消息通讯(未连接redis,mysql等),结果准确性待考验。
并发数 | 总请求数 | qps | 平均响应/ms | 请求失败数量 | 请求成功数量 |
---|---|---|---|---|---|
1000 | 10000 | 2949 | 0.339 | 0 | 10000 |
2000 | 10000 | 1574 | 0.635 | 0 | 10000 |
3000 | 10000 | 1089 | 0.917 | 0 | 10000 |
4000 | 10000 | 807 | 1.238 | 0 | 10000 |
测试机压开发环境,结果如下:
并发数 | 总请求数 | qps | 平均响应/ms | 请求失败数量 | 请求成功数量 |
---|---|---|---|---|---|
800 | 5000 | 1461 | 0.684 | 0 | 5000 |
1000 | 5000 | 1209 | 0.826 | 0 | 5000 |
1200 | 5000 | 1032 | 0.968 | 0 | 5000 |
2000 | 5000 | 628 | 1.592 | 0 | 5000 |
在可控的并发请求情况下,性能尚可。
系统健壮性
监控方案
发生情况:在某些情况下,如系统负载过大swoole无法申请到内存而挂掉、swoole底层发生段错误、Server占用内存过大被内核Kill,或者被某些程序误杀的情况,
监控原理:supervisor 进程管理工具,检测server的master进程是否存活,如果存在则跳过。如果发现主进程已经挂掉,则执行restart逻辑,先kill掉所有残留的子进程,然后重新启动Server。
保证服务进程挂后可以重新启动
聊天频率限制
- 限制 1秒内1条信息(条件信息可改)
数据表结构
消息表
字段 | 说明 |
---|---|
id | 主键 |
client_id | 用户id |
user_name | 用户名 |
user_id | 用户id |
message | 消息内容 |
type | 业务类型 |
activity_id | 直播活动id |
create_time | 创建时间 |
ip | 用户ip |
直播活动表
字段 | 说明 |
---|---|
id | 主键 |
title | 标题 |
details | 活动详情 |
share_title | 分享title |
share_digest | 分享摘要 |
start_time | 开始时间 |
end_time | 结束时间 |