初試 workerman-json-rpc,有幾點疑問,希望大大能幫幫忙,謝謝
1.
服務端
$worker = new Worker('JsonNL://0.0.0.0:2015');
客戶端
$address_array = array(
'tcp://127.0.0.1:2015',
'tcp://127.0.0.2:2015'
);
這兩個地方的協(xié)議為何不同 一個是 JsonNL ,一個是tcp,IP也不同,而且為什么客戶端要寫兩個呢
2.
//異步調(diào)用User::getInfoByUid方法
$user_client->asend_getInfoByUid($uid);
如果想異步調(diào)用,必須在方法名前面加 "asend_"嗎? 同理,異步接收也是類似嗎?
3.
不是非常理解異步,我的理解是 服務端接收請求,處理請求,此時在處理請求的過程中,服務端不會一直阻塞在這里(不會一直等待處理結(jié)果),而是會繼續(xù)接收其他請求,當處理中的請求處理完成后,會自動向客戶端返回處理結(jié)果,不知道這樣理解對不對,從官網(wǎng)的示例代碼中,同步與異步的代碼只有些許差別,看得不是很明白
$user_client->asend_getInfoByUid($uid);
//其他業(yè)務邏輯代碼
$ret_async2 = $user_client->arecv_getInfoByUid($uid);
這兩行代碼能否再幫忙講解下,執(zhí)行了第一行代碼,會產(chǎn)生怎樣的效果呢(是不是表明處理請求的過程,但并沒有返回處理結(jié)果,如果這個請求很快就處理完了,那處理完的結(jié)果放在哪里的呢),執(zhí)行完第二句代碼(這句代碼的意思是,這個時候我需要返回客戶端數(shù)據(jù)了,然后再去拿剛才的處理結(jié)果,但這樣的話,不是很明白,是去哪里拿剛才處理的結(jié)果呢)
5.內(nèi)部究竟是如何做到異步的呢
有點啰嗦,因為最近公司在做RPC,看到這個,不是很明白,想請教下大大,謝謝了哈
1、workerman是支持多種協(xié)議的,所以workerman上監(jiān)聽要寫上JsonNL。json_rpc客戶端是專門針對JsonNL協(xié)議做的,沒必要寫JsonNL。設計之初考慮支持tcp或者udp,所以默認寫的tcp。
服務端一般不會只是一臺服務器,所以客戶端一側(cè)要指定服務端ip列表,也就是為什么有多個ip的原因。
這樣客戶端直接負載均衡,避免了中間再加其它負載均衡服務,速度更快更穩(wěn)定。
2、如果想異步調(diào)用,必須在方法名前面加 "asend_"嗎? 同理,異步接收也是類似嗎?
是的
3、$user_client->asend_getInfoByUid($uid); 是發(fā)送請求,如果服務端很快處理完返回了,返回的數(shù)據(jù)會在操作系統(tǒng)socket緩沖區(qū)存著,這個是操作系統(tǒng)自動的,程序不用干預。
$ret_async2 = $user_client->arecv_getInfoByUid($uid); 是從緩沖區(qū)讀取返回的數(shù)據(jù),如果恰好數(shù)據(jù)早已返回,則直接能讀取到,如果還沒返回,就會阻塞等待直到返回或者超時(時間5秒)。