现在有一个程序,接收大量的数据 ,并且用一个进程进行较耗时的处理。我想问,处理过程中,买没接收的数据存在哪呢,会不会因为数据量太大,导致数据丢失了?
发送的数据在socket缓冲区,如果缓冲区满了,会有两种类情况, 1、客户端是阻塞写,则写操作会发生阻塞,也就是客户端会等待socket缓冲区有空闲时继续写入,如果socket缓冲区长时间没有空闲,可能会返回超时错误,超时时间由写入时的参数决定。超时后如何处理由客户端业务逻辑决定,选择等一会儿在写,或者放弃,放弃的话数据可能就没了 2、客户端是非阻塞写,则返回一个错误码,客户端通过错误码能知道是socket缓冲区满,这时后客户端可以选择等一会儿在写,或者放弃,放弃的话数据可能就没了
所以情况不一定
我使用的是Channel,组件,是不是这属于第二种情况?如果这样我想加大缓冲区防止数据丢失,下面这样做合适吗, TcpConnection::$defaultMaxSendBufferSize = 210241024; $channel_server = new Channel\Server('0.0.0.0', Main::$CONFIG["CHANNEL_PORT"]); if (!defined('GLOBAL_START')) { Worker::runAll(); }
我补充一下我的问题, 我的应用,有进程A负责接收数据,然后通过Channel,发送给进程B 进程B处理速度慢,数据就会在ChannelServer的缓冲区里吧? 为了防止丢失,我该增加ChannelServer链接的缓存区,这样处理可以吗?
增加缓冲区也不能保证100%没问题,因为缓冲区还是有满的可能
发送的数据在socket缓冲区,如果缓冲区满了,会有两种类情况,
1、客户端是阻塞写,则写操作会发生阻塞,也就是客户端会等待socket缓冲区有空闲时继续写入,如果socket缓冲区长时间没有空闲,可能会返回超时错误,超时时间由写入时的参数决定。超时后如何处理由客户端业务逻辑决定,选择等一会儿在写,或者放弃,放弃的话数据可能就没了
2、客户端是非阻塞写,则返回一个错误码,客户端通过错误码能知道是socket缓冲区满,这时后客户端可以选择等一会儿在写,或者放弃,放弃的话数据可能就没了
所以情况不一定
我使用的是Channel,组件,是不是这属于第二种情况?如果这样我想加大缓冲区防止数据丢失,下面这样做合适吗,
TcpConnection::$defaultMaxSendBufferSize = 210241024;
$channel_server = new Channel\Server('0.0.0.0', Main::$CONFIG["CHANNEL_PORT"]);
if (!defined('GLOBAL_START')) {
Worker::runAll();
}
我补充一下我的问题,
我的应用,有进程A负责接收数据,然后通过Channel,发送给进程B
进程B处理速度慢,数据就会在ChannelServer的缓冲区里吧?
为了防止丢失,我该增加ChannelServer链接的缓存区,这样处理可以吗?
增加缓冲区也不能保证100%没问题,因为缓冲区还是有满的可能