1.背景描述:用Swoole作為TcpServer,配置了worker_num = 8 ,task_worker_num =8 .也就是會有16個進程。 建立了一個redid串連,在 onTask(8個task,每個task都會回調onTask方法)方法中讀取redis儲存的值。
2.問題描述:現在發現會報錯Uncaught exception 'RedisException' with message 'read error on connection' 。初步判定是多個進程調用redid導致的,我只用一個task,是沒有問題的。
看到swoole的文檔:
需要在onWorkerStart中建立redis串連,那麼有work 、task 各8個,如果這樣的話就會有16個redis串連(task、work啟動時都會調用onWorkerStart函數)。
1)需要建立16個redis串連,我這樣理解對嗎?該如何改進呢?
2)每個redis串連我都要儲存嗎?這樣豈不是用起來有點麻煩。
3)如果我以後work、task的數值增加,豈不會有更多的redis串連,我該怎麼辦呢?
4)是不是我使用方式有問題,那麼我該怎麼使用呢?
回複內容:
1.背景描述:用Swoole作為TcpServer,配置了worker_num = 8 ,task_worker_num =8 .也就是會有16個進程。 建立了一個redid串連,在 onTask(8個task,每個task都會回調onTask方法)方法中讀取redis儲存的值。
2.問題描述:現在發現會報錯Uncaught exception 'RedisException' with message 'read error on connection' 。初步判定是多個進程調用redid導致的,我只用一個task,是沒有問題的。
看到swoole的文檔:
需要在onWorkerStart中建立redis串連,那麼有work 、task 各8個,如果這樣的話就會有16個redis串連(task、work啟動時都會調用onWorkerStart函數)。
1)需要建立16個redis串連,我這樣理解對嗎?該如何改進呢?
2)每個redis串連我都要儲存嗎?這樣豈不是用起來有點麻煩。
3)如果我以後work、task的數值增加,豈不會有更多的redis串連,我該怎麼辦呢?
4)是不是我使用方式有問題,那麼我該怎麼使用呢?
對,每個進程都要建立一個串連。如果啟動了200個進程就一定需要200個串連。你的使用方式沒錯。
這樣使用確實會建立16個串連。
不想儲存串連的話,可以在用到redis時再建立串連,用pconnect方式。
由於不同進程的redis串連不能共用,隨著進程數增加是會有更多的redis
可以在worker進程中寫主要邏輯。涉及redis操作的部分封裝成任務,由task進程執行。在啟動task時,使用taskwait方法,等待任務的返回。這樣相當於把task進程當成了串連池。
如果還有其他的慢速任務需要用task非同步處理,則可以在啟動task時,傳入指定workerid,這樣其實就是把task進程區分功能,有的負責redis資料處理,有的負責慢速任務。
1: redis和mysql機制不一樣, 不怕串連多。
2: 沒必要用pconnect, swoole本身是長駐記憶體的,connect之後,除非是worker重啟了,串連才失效。
3: read error on connection, 只能你複用了同一個串連,但這個串連可能在其他的進程是被close了。