目前在制作一个聊天室,有聊天禁词的需求。
目前是在 BussinessWorker::onWorkerStart 回调的时候,从 mysql 中加载这些禁词。
现在碰到一个问题,目前想实现不连服务器下口令重启 BussinessWorker 的状况下,来重新加载这些禁词。
所以想到的方式就是写一个 websocket client 端,透过发送消息的方式来呼叫 bussiness worker 来重新加载。
但现在担心会有另外一个问题就是,如果我的 bussiness worker 有很多组的话,要怎么样确保每个 bussiness worker 都能重新加载这些禁词?
首先这个场景没有必要重启BussinessWorker,也不够平滑;
分享两种参考方案:
1、单独开一个text协议的gateway 实例并监听一个内部端口,然后每次禁词内容发生变化就推送到这个端口;至于如何保证每个BussinessWorker都能收到,可以自行定制gateway->router的路由规则,然后路由给所有的BussinessWorker进程,要绝对保证的话,那就结合业务弄上版本号或批次号采用ACK应答机制来加固;
2、采用redis来做,禁词都存放到 redis,然后每个BussinessWorker进程定期去redis里拉数据,这样能保证每个BussinessWorker进程都能拉到数据,也比存mysql要高效,但是比较被动;
最后要是追求更高性能的话,禁词一般也站用不了多少内存,最后可以给每个 $businessworker设置一个属性存起来;