同一台服务器配置多个laravel项目,队列都是默认配置,出现互串的问题
同一台服务器配置了多个laravel项目(laravel8),使用horizon管理,出现了队列任务互串的问题,我该如何配置每个项目的队列,让队列任务不再互串呢?
感谢大家!
关于 LearnKu
关注学习 坐等大佬
redis配置不同的数据库呗
hor那个需要配置独立库和独立前缀,避免cache 缓存错误
你在 VUE_APP 用不同名字,隊列 會自動加前綴 ,不會串的吧。
修改
config/queue.php文件,设置不同的 connection 就可以了。不同的项目把 env 中的 app_name 设置不同的值
一般来说你把env中的APP_NAME改一下的话就不会这样啊,生成的redis的前缀就不一样了
如果是用redis的话,config下面的queue.connections.redis.connection换个链接试试,我猜的
配置不同的redis信息,或者根据项目加一个前缀标示。
每个项目里的 .env 里的 REDIS_QUEUE 设置不同的名字 比如你设置的 REDIS_QUEUE=xiangmu 运行队列监听的命令时 后面加上 redis --queue=xiangmu 比如: php artisan queue:work redis --queue=xiangmu 多个项目 每个项目启动不同的队列监听就行了
不是有 onQueue指定么,horizon 里面也有对应的配置,配置一下就好了,我们公司就在这么玩儿,但是吧挺别扭就是了
一个 prefix 应该可以搞定,,,具体搜下配置文件中的 prefix,,,
配置多个队列的prefix呀!
不同的服务器访问不同redis db 不就行了, A/B/C服务器分别对应db1,db2,db3。这样哪里不适合了呢?
链式连接 & 队列 如果你想指定应该用于已连接任务的默认连接和队列,可以使用 allOnConnection 和 allOnQueue 方法。这些方法指定了应该使用的队列连接和队列名称,除非队列任务被显式地分配了一个不同的连接 / 队列: redis 连接 /podcasts 队列
aravel 中队列任务使用 redis 驱动情况下保存的时候的缓存 key 是不带前缀的,比如 A 项目 dispatch 了一个 a job,保存在了 queues:default,然后我们去 B 项目 dispatch 另一个 job,我们发现它们保存在了相同的 redis key 中
这样会导致的问题是:在一个项目中跑 php artisan queue:work 会拿到另外一个项目的 job,这样就会导致一些不必要的异常,因为在反序列化的过程中会找不到对应的类。
原因:config/queue.php 中配置的默认 queue 都是 default:
为 job 指定不同的 queue,如 dispatch job 的时候可以 dispatch((new xxJob())->onQueue('xxQueue')),这样一来,job 就保存在了 queues:xxQueue 中,但是还是得注意,如果还有其他项目,不要取相同名字。同时,这样一来,我们的 queue:work 或者 queu:listen 命令也要加上 --queue 参数了,如 php artisan queue:work --queue=testQueue,否则还是会去 queues:default 里面找