1. 程式人生 > >使用libevent和多執行緒構建高效能伺服器(客戶端)

使用libevent和多執行緒構建高效能伺服器(客戶端)

有問題可以聯絡我[email protected]

    因為開發資料庫叢集,節點需要通訊,必須構建基於socket的C++網路通訊系統。多年前使用UPD寫過P2P流媒體,但是現在需要TPC,首先使用了Nanomsg作為網路庫,但是開發過程中發現其不靠譜(模式太單一,並且出了問題根本找不到解決辦法)。於是又掉頭回來使用原生的socket程式設計。發現目前比較流行的(C++)網路程式設計使用libevent或者libev,通過調研感覺libevent成熟一些,於是選擇了libevent。

    下面說一下在我們資料庫叢集中對網路通訊的使用模式:

1. 每個節點既是客戶端又是伺服器

2. 每個節點互相簡歷長連線(短連線的話,每次通訊都要建立連線代價太高)

3. 節點之間傳送訊息使用rpc方式,因此選用了google的protobuf

4. 多執行緒服務模式,即每個訊息都由不同的執行緒處理,這樣複雜的訊息也不會阻塞後面的訊息。

    綜上,我使用的是libevent+protobuf+pthread。libevent可以構建基於回撥函式的socket網路庫,protobuf提供rpc,pthread和libevent一起工作提供多執行緒方式。也可以使用std::thread,但是libevent預設支援的是pthread,你也可以在libevent中實現支援std::thread的函式,但是保險期間我還是用了pthread。下面舉個具體的例子來說一下工作流程:

例如叢集有10個節點,每一個節點都會和其他9個節點進行長連線,即每個節點都由9個socket,對應libevent有9個bufferevent,這9個bufferevent放入到一個eventbase裡由主執行緒進行dispatch。每個bufferevent都有一個readcaback函式,主要這個bufferevent有訊息到達,readcallback 就會被觸發讀取相應的訊息,在read callback中把該訊息丟到執行緒池中去處理:

    執行緒池會分配一個執行緒解析訊息內容,然後呼叫protobuf的rpc方法,rpc方法處理完會產生一個response訊息,該執行緒再把該response訊息傳送回去。

    客戶端接收到response會觸發read callback,因為客戶端實際上也是服務端,所以處理流程也是一樣的,read callback會把response訊息丟給執行緒池,執行緒池在呼叫一個執行緒處理該response。

相關推薦

使用libevent執行構建高效能伺服器客戶

有問題可以聯絡我[email protected]     因為開發資料庫叢集,節點需要通訊,必須構建基於socket的C++網路通訊系統。多年前使用UPD寫過P2P流媒體,但是現在需要TPC,首先使用了Nanomsg作為網路庫,但是開發過程中發現其不靠譜(模式太

大文分片上傳 執行上傳檔案接收

package com.controller; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; i

memcached原始碼閱讀----使用libevent執行模型

    本篇文章主要是我今天閱讀memcached原始碼關於程序啟動,在網路這塊做了哪些事情。 一、libevent的使用     首先我們知道,memcached是使用了iblievet作為網路框架的,而iblievet又是單執行緒模型的基於linux下epoll事件的

Windows遍歷全盤所搜檔案,並通過執行顯示搜尋進度C++/C

程式設計軟體,系統 軟體:VS2017 工程屬性:MFC對話方塊(其他工程屬性稍作修改也適用) 系統:windows10家庭版 主要思想 1、利用CFileFind實現查詢檔案 2、利用遞迴實現全盤搜尋 3、多執行緒實現父對話方塊搜尋檔案時,子對話方塊顯示搜尋進度 軟體執行效

【新聞】本人新書《Java執行程式設計實戰指南核心篇》已出版上市

豆瓣主頁 購買連結 試讀下載 (待補充) 原始碼下載 內容簡介 隨著現代處理器的生產工藝從提升處理器主頻頻率轉向多核化,即在一塊晶片上整合多個處理器核心(Core),多核處理器(Multicore Proc

Java執行程式設計實戰指南核心篇讀書筆記

博主準備惡補一番Java高併發程式設計相關知識,接下來將閱讀該書,並且進行比較詳細的總結,好記性不如爛筆頭,加油。Java多執行緒程式設計實戰指南(核心篇)讀書筆記(四),主要記錄該書第七章和第八章的基

執行佇列演算法優化佇列(一

多執行緒佇列(Concurrent Queue)的使用場合非常多,高效能伺服器中的訊息佇列,並行演算法中的Work Stealing等都離不開它。對於一個佇列來說有兩個最主要的動作:新增(enqueue)和刪除(dequeue)節點。在一個(或多個)執行緒在對一個佇列進

使用GCD執行技術下載圖片非同步下載

var imageView = UIImageView() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup af

libevent原始碼分析--鎖執行

寫在前面: ​ 這個原始碼是分析libevent-2.0.20-stable, 並非最新版本的libevent,作者並沒有全看原始碼,在這裡會推薦以下參考的一些網站,也歡迎大家在不足的地方提出來進行討論。 鎖 ​ libevent的內部實現不需要多執行緒,

網路程式設計實驗四——利用程序執行實現伺服器的併發處理

一、實驗目的 1.在TCP檔案傳輸程式碼的基礎上,利用多程序實現伺服器端的併發處理。  2.利用多執行緒實現伺服器端的併發處理。 二、實驗原理 併發的面向連線伺服器演算法: 主1、建立套接字並將其繫結到所提供服務的熟知地址上。讓該套接字保持為無連線的。 主2、將

網路程式設計——4.利用程序執行實現伺服器的併發處理

一、實驗要求     在TCP檔案傳輸程式碼的基礎上,利用單執行緒程序併發模型和多執行緒併發模型實現伺服器端的併發處理。 二、實驗分析     多執行緒與多程序相比,使用多執行緒相比多程序有以下兩個優點:更高的效率和共享儲存器,效率的提高源於上下文切換次數的減少。

Linux網路程式設計【三】:TCP伺服器程序執行http訪問版本

為了讓伺服器同時接受多個客戶端訪問,所以需要多程序或者多執行緒 多程序版本: #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<sys/types.h

【Linux】高併發伺服器模型程序模型執行模型

多程序併發伺服器 使用多程序併發伺服器時要考慮以下幾點:             1.      父程序最大檔案描述個數(父程序中需要close關閉accept返回的新檔案描述符)             2.      系統內建立程序個數(與記憶體大小相關)      

linux下用執行實現socket伺服器客戶的非同步通訊

前面介紹了用select函式來實現socket的非同步收發資料,但是select函式也有一些缺陷,要使socket能持續地通訊,select必須不停地檢測,這樣程序就會一直阻塞在這裡,限制了功能的擴充套件,這裡我們用多執行緒的方式,另建立兩個執行緒用來發送/接收

UDP執行伺服器

UDP: UDP是資料報文傳輸協議,這個傳輸協議比較野蠻,傳送端不需要理會接收端是否存在,直接就傳送資料,不會像TCP協議一樣建立連線。如果接收端不存在的話,傳送的資料就會丟失,UDP協議不會去理會資料的安全性,而且在網路繁忙、堵塞的時候會丟失一些資料,俗稱“丟包”。

Linux 網路程式設計 全解--------程序併發伺服器執行併發伺服器

寫在前面:這個系列也是停滯了20多天了,從今天開始再次步入正軌,以後每個週末都會陸陸續續的更新,這個系列預計完結的時間還會在大約一個月左右,今天靜下心來多整理幾篇。QQ:993650814 正文: 一、多程序併發伺服器     設計思路:當有新的客戶端連線到

程序、執行執行基本概念

程序、執行緒和多執行緒基本概念 一、概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。

程序執行的優缺點

在Linux下程式設計多用多程序程式設計少用多執行緒程式設計。          IBM有個傢伙做了個測試,發現切換執行緒context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的

關於程序,執行程序執行的網路程式設計

程序執行緒網路 多工程式設計 : 可以有效的利用計算機資源,同時執行多個任務 程序 : 程序就是程式在計算機中一次執行的過程 程序和程式的區別: 程式是一個靜態檔案的描述,不佔計算機的系統資源 程序是一個動態的過程,佔有cpu記憶體等資源,有一定的生命週期 * 同一個程式的不同執行過程即為不同的程序

Python之——Python中的程序執行

轉載請註明出處:https://blog.csdn.net/l1028386804/article/details/83042246 一、多程序 Python實現對程序的方式主要有兩種,一種方法是使用os模組中的fork方法,另一種方法是使用multiprocessing模組。區別在於: