cat客戶端上報訊息原理解析

2021-10-04 04:14:12 字數 2838 閱讀 9113

cat客戶端上報訊息時,是開啟了乙個sender執行緒從訊息佇列裡面獲取訊息後給伺服器上報訊息。那麼當伺服器是集群時,cat客戶端是如何選擇伺服器的呢?本文著重分析一下cat客戶端路由的實現演算法。

cat客戶端上報訊息執行緒tcpsocketsender#initialize初始化方法,該方法由defaulttransportmanager#initialize呼叫,是在應用啟動中由框架呼叫的初始化方法。

public

void

initialize()

catch

(exception e)

} m_queue =

newdefaultmessagequeue

(queuesize);@2

integer atomicqueuesize = queuesize;

if(system.

getproperty

(command_line_atomic_queue_capacity)

!= null)

catch

(exception e)

} m_atomictrees =

newdefaultmessagequeue

(atomicqueuesize);@3

m_manager =

newchannelmanager

(m_logger, m_serveraddresses, m_queue, m_configmanager, m_factory);@4

threads.

forgroup

("cat").

start

(this);

@5 threads.

forgroup

("cat").

start

(m_manager);@6

threads.

forgroup

("cat").

start

(new

mergeatomictask()

);@7}

**@1:獲取queue大小。

**@2:建立messagequeue,用來儲存非原子訊息。

**@3:建立messagequeue,用來儲存原子訊息。

**@4:建立乙個channelmanager,管理跟服務端通訊的channel。

**@5:開啟tcpsocketsender任務執行緒。

**@6:開啟channelmanager任務執行緒。

**@7:開啟合併原子訊息任務執行緒。

tcpsocketsender#run方法會從messagequeue佇列獲取上報的訊息,然後通過sendinternal方法上報訊息。

private

void

sendinternal

(messagetree tree)

}

**@1:從channelmanager獲取channelfuture物件。在channelmanager構造方法中會初始化乙個可用的channel。

**@2:編碼上報的訊息。

**@3:傳送訊息。

構造方法

public

channelmanager

(logger logger, list

serveraddresses, messagequeue queue,

clientconfigmanager configmanager, messageidfactory idfactory)})

; bootstrap bootstrap =

newbootstrap()

; bootstrap.

group

(group)

.channel

(niosocketchannel.

class);

bootstrap.

option

(channeloption.so_keepalive,

true);

bootstrap.

handler

(new

channelinitializer

()})

; m_bootstrap = bootstrap;

string serverconfig =

loadserverconfig()

;@1if(stringutils.

isnotempty

(serverconfig)

)else

}else

else

}}

**@1:從server拉取配置的路由列表。具體實現可見com.dianping.cat.system.page.router.handler類。

**@2:如果伺服器端配置了路由列表,則用該路由列表初始化channel。該方法從server返回的路由列表中選擇第乙個可用的channelholder,然後賦值給m_activechannelholder。客戶端上報資料時,會從channelmanager中獲取activechannelholder物件,然後上報資料。

**@3:將獲取到的有效的channelholder賦值給m_activechannelholder,以後可以通過getactivefuture方法獲取channelfuture。

1、cat客戶端生產訊息,放入到message queue。

2、tcpsocketsender從messagequeue獲取訊息,上報給cat伺服器。

客戶端上傳檔案流程

客戶端上傳檔案流程 throws ioexception 1.客戶端 建立鏈結 2.客戶端 傳送檔案上傳請求報文 4001 3.服務端 驗證身份,傳送應答報文 4008 4.客戶端 傳送檔案數通知報文 4006 5.服務端 傳送應答報文 4008 6.客戶端 傳送檔案資訊通知報文 4003 7.服務...

Spring實現客戶端上傳檔案

後台需要處理這些資料,之前沒有接觸過 但類似的fileupload的外掛程式用過,其實原理差不多,因為計算機原始資料都是01 所以只要將這些檔案儲存成二進位制就可以,資料庫 mysql 最大4g 問題1,如果實現 聯調之後共享 問題2,為什麼要轉為2進製,不直接把上傳的檔案放在伺服器上 我也請教了別...

Nodejs作為客戶端上傳檔案

needle 是乙個模擬http client的乙個包,可以將nodejs作為http客戶端傳送http請求。詳細的描述在npm的 上都有介紹。這裡主要介紹以下needle傳送multipart form data請求。needle npm位址 needle 有兩種風格的api,當needle版本大...