队列使用经验总结

使用场景

1. 异步处理

像每个的操作日志记录,访问日志记录这种非实时的写数据,必须使用异步写入

耗时任务处理,需要计算/大量数据入库等

2. 应用间通信

同步数据到第三方系统

发送邮件/短信等

使用目的

1. 把非核心的异步操作分离,提高应用 『QPS』

2. 错误重试机制,保证任务的准确性

使用规范

最终消费前,需检查数据处于可消费状态,避免重复消费;

队列需要读写数据库时,需传递id;

禁止数据库边chunk边修改状态进入队列;

队列任务处理时间较长时,需要设置timeout,防止进程被kill掉,且比quene.php中的retry_after小,否则可能会引起队列重复执行;

队列任务处理需要消耗较大内存时,需要设置memory,防止队列内存溢出而挂掉;

队列任务处理的一个batch消息数过多时,在主队列中开一些子队列,并行处理,提高速度;

如果有第三方回调,需要进行分离,防止第三方请求并发过高,导致服务器挂掉,从而导致队列服务不可用;

最佳实践

最终消费之前,必须从数据库查询数据处于可消费状态;

如果需要读写数据库,应该使用 id 传递资源主体,加快序列化,以及读取到数据库最正确的数据;

队列中如果需要接收第三方回调(或者其它瞬间导致服务不可用的),建议进行分离,防止第三方请求服务器并发过高,io 承受不住导致服务器挂掉,最终导致队列服务不可用状态,影响主流程;这时可以通过另一台服务器接收第三方的回调消息,负责接住它们;

除了 notify 场景,禁止依赖自动重试,防止重发;

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171219G03GKL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券