libevent 多線程實現高並發


libevent多線程高並發資料

鏈接:https://pan.baidu.com/s/16UcOJplrcQ3EfLurycmSmA
提取碼:7roj

1.起因

最近在做Redis中間件,目標實現集群管理、分布式數據處理、高性能。由於在某些情況下,單個節點的Redis性能可能無法滿足需求,並且單個機器的內存大小是受限制的。如果采用中間件的方式管理多個Redis實例,不僅可以避免單點機器內存不夠用的情況,也能使性能得到大幅提升。經過Redis中間件數據分片后,各個Redis實例可以同時處理讀寫請求,所以比單線程的Redis實例要快很多。在這里,中間件起到數據轉發及管理的功能,特別是數據轉發這一塊,對中間件的處理能力要求比較高,在高並發情況下也能保證數據正常處理,不能影響業務使用。

 

2.實現

要實現高性能的服務端網絡程序,基本上是異步處理網絡IO+多線程。關於異步處理網絡IO,網絡上現成的庫有很多,如果你喜歡動手,自己封裝也行。不過我還是建議大家使用已經造好的、成熟穩定的輪子。在這里我比較推薦使用libevent,這個庫相對來說比較成熟,使用起來也簡單。

 

3.架構圖

 

在這個架構模型中,我們開啟了N個線程,每個線程中包含一個event_base對象,他們都是在自己的線程中工作。何時派發工作給這些工作線程,則由一個專門的AcceptThread線程來完成。這個線程負責接受客戶端的連接,接受成功后會將該連接分配給工作線程。在這里我們采用均衡分配的方式,讓每個線程處理的連接數是趨於相等的。

 

4.代碼流程

首先要讓libevent支持多線程,需要加上一段代碼,這段代碼只需要執行一次

 

#ifdef WIN32
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif

第一步:創建一個WorkThread線程池,每個線程對象中包含一個event_base對象,由於沒有事件的話event_dispatch函數會退出,我們可以在里面注冊一個永久的定時器事件,這樣每個工作進程就不會退出。這個時候的狀態是:等待外部給這個工作線程添加事件。

 

第二步:主線程監聽端口,接受客戶端連接。每到來一個連接就形成一個ConnectContext的結構,然后分配到一個工作線程去完成讀寫操作。這個過程不需要我們去加鎖,libevent內部已經完成了這個操作。我們只需要在AcceptThread中派發任務給工作線程就可以了。

 

第三步:沒了,按照這個架構,大部分代碼就是寫處理數據的代碼了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM