消息队列,消费者可以同时处理多条消息吗?

z985342160

RabbmitMQ队列里都是耗时任务:请求第三方的API(http)。

当开启一个消费worker时,能否在产生IO时继续处理下一条消息。

场景:同步第三方平台的产品数据,比如发起同步某个账号的产品,一个账号下面的产品可以最少也有几千条,多达十几万的也有。

注:考虑第三方API是没有批量查询接口的。

将产品ID放在队列里,开启worker消费,消费者可以在遇到IO等待时继续处理下一条消费吗,需要对每条消息ACK(主要是当请求失败可以重试)。

如果不能实现,我就打算放到REDIS list里,用wokerman的定时器读取redis来发送异步http请求,如果失败就重新加到list里。

另外在这样IO耗时的场景下,开启进程数量怎么计算会合适些?

662 1 0
1个回答

six

用workerman/http-client 可以异步请求,是非阻塞IO。用curl是阻塞IO,无法切换到处理下一个消息。

关于进程数的话,如果是用url阻塞方式,估算下消费一个消息需要耗时多长时间。估算下产生消息的频率。进程数因该设置多少就出来了。比如一个消息耗时10秒,整个系统大概每秒产生10条消息。那么进程数就是100就可以刚好能够处理。

如果是workerman/http-client方式处理,感觉配置成cpu的1-2倍就差不多了吧。

  • 暂无评论
🔝