laravel队列使用经验总结

1,353 阅读2分钟

使用场景

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

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

2. 应用间通信
  • 同步数据到第三方系统

  • 发送邮件/短信等

使用目的

1. 把非核心的异步操作分离,提高应用 『QPS』
2. 错误重试机制,保证任务的准确性

使用规范

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

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

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

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

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

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

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

最佳实践

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

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

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

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


                                 欢迎关注微信公众号,定期分享干货!