关于 horizon 多副本问题

系统的数据量也比较小,所以 horizon 始终也只起了一份,也担心 horizon 起了多份会造成代码重复执行。

所以就做了如下实验:

1
docker-compose scale laravel-horizon=10

本地的使用的是 laradock ,所以很容易就将 laravel-horizon 扩展了 10 个副本,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp
laradock_laravel-horizon_1 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_10 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_2 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_3 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_4 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_5 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_6 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_7 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_8 /usr/bin/supervisord -n -c ... Up
laradock_laravel-horizon_9 /usr/bin/supervisord -n -c ... Up
laradock_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1 /bin/bash /opt/startup.sh Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
laradock_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp

在工程里面 php artisan make:job TestJob 再定义一个 job:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Redis;

class TestJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Execute the job.
*
* @return void
*/
public function handle()
{

cache()->increment("test");

}
}

执行Job:

1
dispatch(new TestJob);

通过 $ docker-compose up -d redis-webui 可以起一个 web 页面,页面中可以看到对应的 key 是每次都加一,而不是加十,所以这里推测是任务被一个 horizon 进程接受到了,就会加锁,防止其他进程继续去执行任务。

image.png

坚持原创技术分享,您的支持将鼓励我继续创作!