>写在前面 > 之前的版本,从 v1.0.0 - v1.0.4 都是采用的多进程的 Gatewayworker 框架编写的 socket 服务端。虽然多进程 在充分利用服务器多核方面,有着很大的优势。 > 但是,正如whisper 遇到的情况那样。由于 客服 和 访客的信息放到 内存中维护的,这部分数据,要进行实时的更改。又是因为在 多进程下,出现并发读写的问题。 > 之前是采用 workerman 的 globaldata 组件的 cas (原子读写)方法,解决全局共享数据的问题。但是这样导致了 globaldata 的压力很大。经常会出现 客服无法连接的情况。通过 php start.php status 命令,发现 是因为很都的worker 处于 busy 状态。而恰巧此时的 连接,被gateway 分配到这个 worker 上了,而继续查看,worker 为什么阻塞,得到的结论总是,出现了 原子存取 全局共享数据上。 > 曾试图想采用 redis 锁的方式实现 存取全局数据,但是依旧 会面临锁的粒度的问题,影响性能。采用 linux的共享内存,又不是很妥当。最后一度想放弃采用php的方案写 socket 服务端。 > 一次无意的查看到 workerman 的作者 写的 wolive 客服手册。发现他似乎只开了一个进程。后来仔细想想,也对。 必经我这是面向 中小站长的 客服系统。单个进程如果采用 linux的 select 。也能维持 1024 个tcp 连接。如果 安装了 libevent 或者 event (php的扩展),能实现单进程 更多的tcp连接,完全符合产品的定位。压测了一下,维持 2000 人在线(1核 1G 阿里云主机),完全没问题。而且避免了很多的 多进程的烦恼。降低了系统的复杂度。因为本身 gatewayworker 框架,就是几部分通信的。再加上与 globaldata 通信,这其中一个环节出现问题,都会导致一个 worker 不可用。 > 于是决定,将系统 采用单进程的方式运行,提升 整体的稳定性才是王道!! 1、重写单进程 服务端,去除 globaldata 的使用。 2、更换了更美观的测试连接网页 3、修复客服点击下班没有维护 连接用户的 结束时间问题