目前在制作一個(gè)聊天室,有聊天禁詞的需求。
目前是在 BussinessWorker::onWorkerStart 回調(diào)的時(shí)候,從 mysql 中加載這些禁詞。
?
現(xiàn)在碰到一個(gè)問題,目前想實(shí)現(xiàn)不連服務(wù)器下口令重啟 BussinessWorker 的狀況下,來重新加載這些禁詞。
所以想到的方式就是寫一個(gè) websocket client 端,透過發(fā)送消息的方式來呼叫 bussiness worker 來重新加載。
但現(xiàn)在擔(dān)心會有另外一個(gè)問題就是,如果我的 bussiness worker 有很多組的話,要怎么樣確保每個(gè) bussiness worker 都能重新加載這些禁詞?
首先這個(gè)場景沒有必要重啟BussinessWorker,也不夠平滑;
分享兩種參考方案:
1、單獨(dú)開一個(gè)text協(xié)議的gateway 實(shí)例并監(jiān)聽一個(gè)內(nèi)部端口,然后每次禁詞內(nèi)容發(fā)生變化就推送到這個(gè)端口;至于如何保證每個(gè)BussinessWorker都能收到,可以自行定制gateway->router的路由規(guī)則,然后路由給所有的BussinessWorker進(jìn)程,要絕對保證的話,那就結(jié)合業(yè)務(wù)弄上版本號或批次號采用ACK應(yīng)答機(jī)制來加固;
2、采用redis來做,禁詞都存放到 redis,然后每個(gè)BussinessWorker進(jìn)程定期去redis里拉數(shù)據(jù),這樣能保證每個(gè)BussinessWorker進(jìn)程都能拉到數(shù)據(jù),也比存mysql要高效,但是比較被動;
?
最后要是追求更高性能的話,禁詞一般也站用不了多少內(nèi)存,最后可以給每個(gè) $businessworker設(shè)置一個(gè)屬性存起來;