nsq 如何增加心跳时间 和 消息过期时间

nsqd心跳的默认时间是 每30秒 ,如果连续两次没有任何回应,那么就会认为客户端有问题,并主动断掉连接,消息超时是默认1分钟,这与两次心跳时间加起来60秒的时间是一样的,如果客户端的callback执行时间超过一分钟,那么客户端的连接就会被断掉,当然如果你callback执行时间需要那么长也是有问题的,但是有特殊要求时,如何增加心跳时间 和 消息超时的时间呢?

关于心跳 和 消息过期的调整 ,nsqd 启动是有命令行参数 :

nsqd --lookupd-tcp-address=127.0.0.1:4160 --max-heartbeat-interval=1m30s --msg-timeout=10m30s

但是你会发现 设置了之后 并不生效,这些只是设置最大的心跳时间和超时时间,还需要客户端主动发送identify 指令,指令当中再次声明我客户端这次的心跳时间与超时时间,php-nsq 3.0 支持了identify 指令,详情见下方:

pub:

// pub
$nsqdAddr = array(
    "127.0.0.1:4150",
    "127.0.0.1:4154",
);

$identify = array(
    "client_id" => "begon",
    "deflate" => false,
    "deflate_level" => 6,
    "feature_negotiation" => true,
    "heartbeat_interval" => 50000,
);
$nsq = new Nsq($identify);// the same to sub
$isTrue = $nsq->connectNsqd($nsqdAddr);

for($i = 0; $i < 10; $i++){
    $msg = "nihao".$i;
    $nsq->publish("test", $msg);
}

$nsq->closeNsqdConnection();

sub:

//sub

$nsq_lookupd = new NsqLookupd("127.0.0.1:4161"); //the nsqlookupd http addr
$identify = array(

    "client_id" => "begon",
    "deflate" => false,
    "deflate_level" => 6,
    "feature_negotiation" => true,
    "heartbeat_interval" => 60000, //  这个参数不能超过 刚才nsqd启动时设置的最大参数,否则会报错,连接失败
    "hostname"=>"bogon",
    "long_id"=>"bogon",
    "msg_timeout" => 800000, // 这个参数也是一样,不能超过最开始 nsqd启动时设置的 message最大超时时间
    "output_buffer_size" => 16384,
    "output_buffer_timeout" => 250,
    "sample_rate" => 0,
    "short_id" =>  "bogon",
    "snappy" => false,
    "tls_v1" => false,
    "user_agent" =>  "php-nsq/3.0"
);

$nsq = new Nsq($identify);

$config = array(
    "topic" => "test",
    "channel" => "struggle",
    "rdy" => 10,
    "connect_num" => 1,
    "retry_delay_time" => 5000,  // after 5000 msec, message will be retried
    "auto_finish" => true,
);

$nsq->subscribe($nsq_lookupd, $config, function($msg,$bev){

    try{
        echo $msg->payload . " " . "attempts:".$msg->attempts."\n";
        //do something
    }catch(Exception $e){

        if($msg->attempts < 3){
            //the message will be retried after you configure retry_delay_time
            throw new Exception("");
        }else{
            echo $e->getMessage();
            return;
        }
    }
    //$msg->touch($bev,$msg->message_id); //if you callback run long time ,you can use this function

});

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注