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