現(xiàn)在有一個(gè)程序,接收大量的數(shù)據(jù) ,并且用一個(gè)進(jìn)程進(jìn)行較耗時(shí)的處理。我想問(wèn),處理過(guò)程中,買沒(méi)接收的數(shù)據(jù)存在哪呢,會(huì)不會(huì)因?yàn)閿?shù)據(jù)量太大,導(dǎo)致數(shù)據(jù)丟失了?
發(fā)送的數(shù)據(jù)在socket緩沖區(qū),如果緩沖區(qū)滿了,會(huì)有兩種類情況,
1、客戶端是阻塞寫,則寫操作會(huì)發(fā)生阻塞,也就是客戶端會(huì)等待socket緩沖區(qū)有空閑時(shí)繼續(xù)寫入,如果socket緩沖區(qū)長(zhǎng)時(shí)間沒(méi)有空閑,可能會(huì)返回超時(shí)錯(cuò)誤,超時(shí)時(shí)間由寫入時(shí)的參數(shù)決定。超時(shí)后如何處理由客戶端業(yè)務(wù)邏輯決定,選擇等一會(huì)兒在寫,或者放棄,放棄的話數(shù)據(jù)可能就沒(méi)了
2、客戶端是非阻塞寫,則返回一個(gè)錯(cuò)誤碼,客戶端通過(guò)錯(cuò)誤碼能知道是socket緩沖區(qū)滿,這時(shí)后客戶端可以選擇等一會(huì)兒在寫,或者放棄,放棄的話數(shù)據(jù)可能就沒(méi)了
所以情況不一定
我使用的是Channel,組件,是不是這屬于第二種情況?如果這樣我想加大緩沖區(qū)防止數(shù)據(jù)丟失,下面這樣做合適嗎,
TcpConnection::$defaultMaxSendBufferSize = 210241024;
$channel_server = new Channel\Server('0.0.0.0', Main::$CONFIG["CHANNEL_PORT"]);
if (!defined('GLOBAL_START')) {
Worker::runAll();
}
我補(bǔ)充一下我的問(wèn)題,
我的應(yīng)用,有進(jìn)程A負(fù)責(zé)接收數(shù)據(jù),然后通過(guò)Channel,發(fā)送給進(jìn)程B
進(jìn)程B處理速度慢,數(shù)據(jù)就會(huì)在ChannelServer的緩沖區(qū)里吧?
為了防止丟失,我該增加ChannelServer鏈接的緩存區(qū),這樣處理可以嗎?