要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送。
下列测试不考虑防火墙等。仅测试可行性和效率。
消息服务器
转发服务器
公共缓存
软件环境
client1 可向 client2 或者其他 client 发送消息,并接收其他 client 发送的消息
Redis 中保存 client 连接的信息,给每个用户分配唯一的 key ,包括链接的哪台服务器,转发服务器定时检测消息服务器,如消息服务器挂掉,由转发服务器清理掉Redis已经挂掉的所有链接。
1 Client1 给 Client2 发送一条消息
2 Socket1 接收到消息,根据 key从Redis 取出 Client2 的连接信息,连接在本机,直接推送给 Client2 ,流程结束。
3如果连接不在本机,把消息推送到转发服务器,由转发服务器把该消息推送给连接所在消息服务器,消息服务器接收消息,推送给 Client2 。
服务器上创建一个serverphp,内容如下:
上只需把ip变更一下即可。1921680201变更为1921680202
在转发服务器上建立脚本proxyphp,内容如下:
注意开启顺序
1开启转发服务器php proxyphp
2分别开启socket服务器php serverphp
可以在转发服务器上看到两个消息服务器已经连接
3开始测试,分别打开两个telnet,连接两个消息服务器,发送消息测试:
登陆
基于强大的 swoole 扩展,让php高效的实现这些成为可能,目前消息服务器到转发服务器是长连接,转发服务器到消息服务器是短连接,存在性能瓶颈,也浪费了连接资源。下一步改造成长连接,消息服务器的client使用异步。WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新。
该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十几个版本了,目前最新的是版本17,所对应的协议版本号为13,目前对该协议支持最完善的浏览器应该是chrome,毕竟WebSocket协议草案也是Google发布的。1WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。可以在一次特殊的websocket握手后,客户端和浏览器进行双向通信,而>第二字节的低7位表示内容长度,最大值为127,但126和127是预留的,当内容长度大小125字节且小于ushortMaxValue时,第3和第4字节表示一个ushort的真正内容长度,此时第二字节的低7位的值设置为127,如果内容长度大小超过ushortMaxValue,就有ulong表示,此时就是8个字节表示真正的数据字节长度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)