使用Supervisor运行队列,创建多个进程,会不会有并发问题

如果是高并发的队列,比如抢购是不是就得开启一个进程?如果是发送邮件的队列可以启动多个进程吧?

让PHP再次伟大
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

队列没怎么接触,不过自己写的执行脚本,发送邮件的,取模就可以了。

2年前 评论
勇敢的心 (楼主) 2年前

发邮件的队列,可以考虑用这个做 github.com/star7th/htq

2年前 评论
勇敢的心 (楼主) 2年前
陈先生

自己控制好锁就可以了, 下面是伪逻辑

Class OrderRefundJob extends Job {

  protected $order;
  public function handle(){

//todo 这里也可以换成 Cache::lock 去实现 
if(Cache::has('order_refund_' . $this->order->id))
$this->delete();
return ;  
}
//订单退款
}

2年前 评论
勇敢的心 (楼主) 2年前
陈先生 (作者) 2年前

redis队列实现了读写的互斥 redis是单线程的 多线程才有并发问题 多进程读取导致并行发多个读取请求包,这些请求包到达redis中,redis串行响应你的请求。多线程才需要避免并发导致数据混乱–加锁互斥 而且发送大量邮件,n个进程消费队列 是很常见的应用场景 不会发生多发的并发问题

2年前 评论

如果你写抢购的话,用redis队列是可以开多个进程的。但是如果没有通过队列的话,别多开进程了。

2年前 评论

你是多进程,并不是多线程,哪来的并发问题,你连接资源,只要控制好对连接的资源进行锁定即可,你用的每个程序如redis,mysql 都会自己保证内部的并发问题,如果你操作外部同一数据源,你肯定需要自己对资源进行独占处理,即使非多进程的,在写代码的过程中也是如此,这是最基本的准则吧
至于PHP本身就不说了,它就是多进程单线程的模型

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!