簡體   English   中英

boost :: asio多線程問題

[英]boost::asio multi-threading problem

我有一個使用boost::asio的服務器,我想做多線程。

服務器可以分解為幾個“區域”,套接字從連接區域開始,然后連接到客戶端,移動到認證區域(即登錄或注冊),然后在服務器的各個其他部分之間移動關於客戶正在做什么。

我並不特別想在單個io_service為所有套接字使用線程池,因為需要大量的鎖,特別是在與公共資源進行大量交互的區域。 但是,我想給每個服務器組件(比如說身份驗證)自己的線程。

但是我不確定如何做到這一點。 我考慮過為每個組件提供自己的io_service的想法,所以它可以使用它想要的任何線程,但是套接字區域綁定到io_service,我不知道如何將客戶端套接字從一個組件移動到另一個組件。

你可以用asio::io_service::strand來解決這個問題。 像往常一樣為io_service創建一個線程池。 一旦與客戶端建立連接,就可以使用io_service::strand包裝所有異步調用。 每個客戶一條鏈。 這基本上保證了從客戶端的角度來看它是單線程的。

首先,我主張考慮采用多進程方法 ; 它是一個非常簡單,易於推理和調試,易於擴展的架構。

一種服務器設計,您可以在其中水平擴展 - 服務器的多個實例,其中每個服務器中的狀態不需要在服務器之間共享(例如,共享狀態可以在公共數據庫中(SQL, Voldemort (持久)或Redis (集合和列表) - 非常酷,我對持久版本感到非常興奮), memcached (不可靠)等等 - 更容易擴展。

例如,您可以使用單個偵聽器線程在使用UNIX sendmsg()傳輸描述符的多個服務器進程之間進行平衡。 稍后,使用硬件負載平衡器將此體系結構直接遷移到多台計算機。

海報中的區域理念很吸引人。 可能是,您可以通過消息隊列完成所有操作,而不是鎖定。 磁盤IO的原因 - 即使是SSD等 - 以及網絡是真正的瓶頸而且沒有必要小心CPU; 在線程之間傳遞的消息的延遲並不是什么大問題,並且根據您的操作系統,線程(或進程)可以被調度到SMP設置中的不同核心。

但最終,一旦達到飽和狀態,要擴大區域概念,您需要更快的內核而不是更多內核。 這是一個有趣的獨白,來自我們的主人之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM