tracker伺服器架構分析

2021-06-18 18:12:41 字數 1405 閱讀 8006

初始化執行緒間訊號量和執行緒池

tracker_service_init->work_thread_entrance

其主要處理:按接收通知訊息處理

recv_notify_read->event_set(client_sock_read)->client_sock_read->tracker_deal_task

這裡面有所有客戶端以及storage發起的客戶端請求訊息處理

g_check_file_duplicate說明有檔案備份存在,需要和serverarray內的所有伺服器握手。

common\sockopt.c 通訊使用tcp套接字,epoll/select接收資料報文

通訊佇列快取管理tracker\fast_task_queue.c,隊列為g_free_queue,初始化free_queue_init,刪除free_queue_destroy

申請記憶體:struct fast_task_info資料結構free_queue_pop->task_queue_pop,釋放記憶體:free_queue_push,包括大記憶體主動釋放功能,大於min_buff_size的申請記憶體直接釋放。

free佇列是共享的,各個任務佇列是區分開的。相同方式申請,分別使用。

libevent簡單介紹:

業務處理架構

以乙個fastdfs tranker客戶端查詢訪問流程為例簡單說明:

客戶端:

fastdfs_tracker_query_storage_store->php_fdfs_tracker_query_storage_store_impl->tracker_query_storage_store_with_group/tracker_query_storage_store_without_group->tcpsenddata_nb(tracker_proto_cmd_service_query_store_with_group_one/tracker_proto_cmd_service_query_store_without_group_one)/fdfs_recv_response

使用同步等待的方式,等待服務端的響應訊息

服務端:

tracker_deal_task(tracker_proto_cmd_service_query_store_with_group_one)->tracker_deal_service_query_storage

a、通過bsearch查詢g_groups組內名字匹配的fdfsgroupinfo

b、tracker_check_reserved_space計算保留空間

c、tracker_get_writable_storage,從當前寫的伺服器(應為storage)中的下乙個開始,current_write_server++先

d、將storegroup中所有的active_servers的ip位址寫入響應訊息體中,並返回給客戶端

Jetty 伺服器架構分析 下

說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...

Jetty 伺服器架構分析 下

說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...

Jetty 伺服器架構分析 下

說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...