Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如果单个任务处理超过60s时,这个任务会被认为是超时 #1

Open
askie opened this issue Dec 4, 2017 · 17 comments
Open

Comments

@askie
Copy link

askie commented Dec 4, 2017

$requeueStrategy = new nsqphp\RequeueStrategy\FixedDelay;
    $dedupe = new nsqphp\Dedupe\OppositeOfBloomFilterMemcached;
    $lookup = new nsqphp\Lookup\Nsqlookupd;
    $nsq = new nsqphp\nsqphp($lookup, $dedupe, $requeueStrategy);
    $nsq->subscribe('mytopic', 'somechannel', 'msgCallback')
        ->run();

    function msgCallback($msg)
    {
        sleep(62);
        echo $msg->getId() . "\n";
    }

如果单个任务处理超过60s时,这个任务会被认为是超时,
nsqd会反馈:

ERROR: client(192.168.3.20:59284) - failed to read command - read tcp 192.168.3.20:4150->192.168.3.20:59284: i/o timeout

调整各种参数,都无法消除这个错误
求破!

@yunnian
Copy link
Owner

yunnian commented Dec 6, 2017

你好,如果超过60秒没有ack的话,nsq 是会认为超时 会将连接断掉,到时候再去ack的时候会报找不到链接,消息处理如果处理时间超过60秒是有问题的 你的使用场景不对

@askie
Copy link
Author

askie commented Dec 7, 2017

多谢答复。是不是意味着,nsq是无法支持长耗时任务的?

@yunnian
Copy link
Owner

yunnian commented Dec 7, 2017

你好 消息中间件 一般用于 快速处理的场景,不知道你每秒的消息量是多少,你的这种场景不能快速的ack的话 可以选择直接插入到数据库当中 轮询mysql, 或者使用内存型数据库 ,如redis

@askie
Copy link
Author

askie commented Dec 7, 2017

感谢感谢,如果nsq无法适应这种长耗时的任务,那我们就进行拆分吧。多谢多谢!

@yunnian
Copy link
Owner

yunnian commented Dec 7, 2017

你更可以换一个使用姿势,nsq接收到消息后 就插入到mysql 然后ack(return),另外再有个 定时任务 轮询mysql

@yunnian
Copy link
Owner

yunnian commented Dec 7, 2017

我想问下 你github的回复通知 是如何及时收到的,为什么我刚回复 你就能收到?

@askie
Copy link
Author

askie commented Dec 7, 2017

我是qq邮箱注册的,直接邮件通知我的。

@yunnian yunnian closed this as completed Dec 8, 2017
@askie
Copy link
Author

askie commented Dec 8, 2017

我们使用go客户端 处理nsq任务时,没有这个问题出现。
即使单个任务超过了10分钟,也不会出错。

我还是感觉php这一块与nsq的底层通讯有问题,没有考虑长耗时任务的情况进去。
目前调整了php的各种参数,始终还是这个错误。

@yunnian yunnian reopened this Dec 8, 2017
@yunnian
Copy link
Owner

yunnian commented Dec 8, 2017

php 的这个老外写的都 五六年前了,如果超过了60秒,期间没有回应心跳链接会被断掉的,你调整参数没用的,因为他阻塞了 心跳的回应,我正在写php的nsq扩展 大概需要半个月事件,写完了通知你

@askie
Copy link
Author

askie commented Dec 8, 2017

是不是,当phpclient接收到job后,
回调函数处理阶段,底层没有给nsq发送心跳包引起的?
必须等待回调函数处理完毕后,才发送心跳包。

@yunnian
Copy link
Owner

yunnian commented Dec 8, 2017

是的

@askie
Copy link
Author

askie commented Dec 8, 2017

哈哈,给我猜测的一样。nsq这一块,感觉官方对php不怎么支持,官方库都是一堆问题没人管。
你这大神厉害了,直接写扩展了!
牛!

@yunnian
Copy link
Owner

yunnian commented Dec 8, 2017

刚帮你看了下,go客户端 也会超时 断链,只不过他重试了, 其实60秒这个时间可以改

@askie
Copy link
Author

askie commented Dec 8, 2017

Nsqd has options that are "max-heartbeat-interval" and "msg-timeout"

See http://nsq.io/components/nsqd.html

Try to increase timeout setting in nsqd server but recommend to make your job most quicky to finish

但是,没必要增加心跳间隔时间。
callback没有回来,是不是应该,
主动 发送心跳通讯呢?

@yunnian
Copy link
Owner

yunnian commented Dec 16, 2017

扩展sub 功能已写好 欢迎试用
https://github.com/yunnian/php-nsq

@yunnian
Copy link
Owner

yunnian commented Dec 20, 2017

hi, 官方网站已经 把扩展版本 给添加上去了哦,欢迎试用 http://nsq.io/clients/client_libraries.html

@askie
Copy link
Author

askie commented Dec 21, 2017

赞赞!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants