使用 acl 服務器框架編寫負載均衡的應用服務

      acl 服務器框架的幾種服務器模型(進程模型,多線程模型,非阻塞模型,協程模型,觸發器模型,UDP通信模型)中,使用比較多的是多線程模型、協程模塊及非阻塞模型,這三種模型可以配置成啓動多個進程實例(即成爲:多進程多線程、多進程多協程及多進程非阻塞),但在實際應用中因爲系統 TCP 連接分配的不均勻性,會導致每個進程實例的 TCP 連接數極不均勻甚至相差很大的問題(便出現了有的進程“撐死”,有的進程“餓死“的現象),acl 服務器框架提供了一個 TCP 連接分配器,該分配器負責接收外來 TCP 連接,然後將該 TCP 連接的文件句柄通過 UNIX 域套接字”平均傳遞給“後端的每一個子進程,從而保證了應用服務器進程池中的每個進程實例都能獲得相等數量的 TCP 連接,從而達到負載均衡的目的。



 

      如上圖所示,整個網絡連接處理過程如下:

      一、在 acl_master 服務器框架下啓動兩個服務:TCP連接分配器和應用服務進程

      二、TCP 連接分配器監聽兩個地址:一個是網絡地址(如:192.168.188.1:80)和一個本機的 UNIX 域套接字(如:/opt/acl/var/private/dispatch.sock)

             :acl 服務器框架支持同時監聽多個網絡地址或 UNIX 域套口地址,參見:使用 acl 服務器框架編寫監聽多個地址的服務器程序

      三、應用服務的每個進程通過該 UNIX 域套接口連接 TCP 連接分配器:

        1、通過該連接向TCP連接分配器報告自己當前的 TCP 連接數

        2、在該UNIX套接口接收TCP連接分配器發送的客戶端TCP連接的套接字句柄

      四、客戶端通過網絡連接 TCP 連接分配器監聽的網絡地址

      五、TCP 連接分配器從後端進程池中選取一個連接數最少的進程,並通過與該進程的 UNIX 套接字將客戶端的 TCP 連接句柄傳遞給該進程

      六、後端獲得 TCP 連接分配器傳遞來的 TCP 連接句柄,從而與前端客戶端建立聯繫,開始處理客戶端的請求。

 

      通過以上處理流程,就可以保證客戶端連接可以均勻地分配給後端服務進程池中的每一個進程實例,這樣,每個進程實例佔用的系統資源(如:CPU、內存、IO 等)就相對比較均勻。

      在 UNIX/LINUX 平臺下,通過 UNIX 域套接字傳遞描述字過程是由內核完成的,應用層只需負責相關的系統 API 調用即可,如何使用系統 API 傳遞描述字可以參考 acl 庫中的 lib_acl/src/stdlib/sys/unix/acl_transfer_fd.c 源文件。

      另外,上面所提的 TCP 連接分配器是使用 acl 服務器框架中的非阻塞服務模型編寫的一個服務器程序,具體實現在 app/master_dispatch/server 目錄下;應用服務器程序可以使用 acl 服務器框架中的線程池模型或非阻塞模型編寫。

      在部署時,需要將 TCP 連接分配器(app/master_dispatch/server/master_dispatch) 及用戶自己寫的服務器程序拷貝到執行目錄下,在應用自己的服務器程序中需要將配置文件中的域接口連接地址打開(對於線程池模型需要打開 ioctl_dispatch_addr 配置項,對於非阻塞模型需要打開 aio_dispatch_addr 配置項)

      參考:

      1、使用 acl 生成嚮導快速創建服務器程序

      2、使用 acl 服務器框架編寫監聽多個地址的服務器程序

      3、使用 acl 的生成嚮導快速創建一個C++ WEB 服務器

      4、acl 服務器模塊的部署

 

       下載:

       acl 庫下載:https://sourceforge.net/projects/acl/

       svn: svn://svn.code.sf.net/p/acl/code/

       github:https://github.com/acl-dev/acl

       QQ 羣:242722074

       國內鏡像:http://git.oschina.net/acl-dev/acl
      
微博:http://weibo.com/zsxxsz/

 

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 3852
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章