workerman接收大量数据的问题

blue1018

现在有一个程序,接收大量的数据 ,并且用一个进程进行较耗时的处理。我想问,处理过程中,买没接收的数据存在哪呢,会不会因为数据量太大,导致数据丢失了?

3937 3 0
3个回答

walkor

发送的数据在socket缓冲区,如果缓冲区满了,会有两种类情况,
1、客户端是阻塞写,则写操作会发生阻塞,也就是客户端会等待socket缓冲区有空闲时继续写入,如果socket缓冲区长时间没有空闲,可能会返回超时错误,超时时间由写入时的参数决定。超时后如何处理由客户端业务逻辑决定,选择等一会儿在写,或者放弃,放弃的话数据可能就没了
2、客户端是非阻塞写,则返回一个错误码,客户端通过错误码能知道是socket缓冲区满,这时后客户端可以选择等一会儿在写,或者放弃,放弃的话数据可能就没了

所以情况不一定

  • blue1018 2018-09-07

    我使用的是Channel,组件,是不是这属于第二种情况?如果这样我想加大缓冲区防止数据丢失,下面这样做合适吗,
    TcpConnection::$defaultMaxSendBufferSize = 210241024;
    $channel_server = new Channel\Server('0.0.0.0', Main::$CONFIG["CHANNEL_PORT"]);
    if (!defined('GLOBAL_START')) {
    Worker::runAll();
    }

blue1018

我补充一下我的问题,
我的应用,有进程A负责接收数据,然后通过Channel,发送给进程B
进程B处理速度慢,数据就会在ChannelServer的缓冲区里吧?
为了防止丢失,我该增加ChannelServer链接的缓存区,这样处理可以吗?

  • 暂无评论
walkor

增加缓冲区也不能保证100%没问题,因为缓冲区还是有满的可能

  • 暂无评论
年代过于久远,无法发表回答
🔝