我正在構建一個利用ZeroMQ N到N pub/sub模型的POC。從我們的應用服務器,當一個http請求被服務時,如果線程從數據庫中提取數據,它會用這些數據更新一個本地memcache實例。要應用服務器集羣中同步其他內存緩存的情況下,請求線程發送與使用ZMQ發行該數據的消息......所以問題是:什麼策略方面是最有效的減少插座創建/ destory開銷時應用程序有很多線程依賴於套接字發送消息?我們是否共享套接字池,我們是否創建/銷燬每個線程的套接字等?ZeroMQ多線程:按需創建套接字或使用套接字對象池?
策略1 - 線程管理髮布的Socket
在這種方法中,每個線程,T1
,T2
,並T3
,通過創建它,建立連接,發送管理Socket對象(發行人)的生命週期消息,最後關閉套接字。基於this,這當然是最安全的方法,但是當套接字重複創建,連接和銷燬時,我們擔心開銷問題;如果開銷對性能產生負面影響,我們希望避免它。
策略2 - 出版商套接字對象池
在這種方法中,父進程(應用服務器)初始化ZMQ出版商在啓動池。當一個線程需要一個發佈者時,它從對象池中獲取一個,發送它的消息,然後將發佈者返回到池;創建,連接和銷燬插座的過程中被消除相對於使用發佈線程,但訪問池同步以避免任何兩個線程使用相同的出版商對象在同一時間,而這正是死鎖和併發問題可能會出現。
我們還沒有成型的兩種方法,因爲想要做一個試金石上,因此,測試第一。就批量而言,我們的應用程序不會發布「繁重」,但可能需要發佈消息的同時需要100-150個線程(每個應用程序服務器)。
因此,要重申:什麼策略是相對於同時強調性能當應用程序有依賴於出版商發送消息的線程開銷最小化的最有效?
線程不能重用自己的專用套接字嗎? – flup
不,這些是HTTP處理程序線程,由應用程序服務器管理;我會更新問題,thx。 – raffian
什麼是編程語言/應用服務器? – flup