使用阿里云的Redis时,Laravel把Job发布到Queue失效的问题

又是一个坑人的大坑。

之前遇到的问题是在设置密码的时候,不是用户名和密码,需要把用户名和密码用冒号串起来写进去进行认证。

我们用的是阿里去的ecs和redis,用的是laravel框架,里面有用到Job,以队列的方式在执行:

ProductUpdateJob::dispatch($product);

结果任务死活发布不到Redis的List里,对应的Job也没有运行。

后面一步步的跟到Laravel的框架里: vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php

public function command($method, array $parameters = [])
{
    var_dump($method, $parameters);
    $start = microtime(true);

    $result = $this->client->{$method}(...$parameters);

    $time = round((microtime(true) - $start) * 1000, 2);

    if (isset($this->events)) {
        $this->event(new CommandExecuted($method, $parameters, $time, $this));
    }

    return $result;
}

输出:

string(4) "eval"
array(3) {
  [0]=>
  string(153) "-- Push the job onto the queue...
redis.call('rpush', KEYS[1], ARGV[1])
-- Push a notification onto the "notify" queue...
redis.call('rpush', KEYS[2], 1)"
  [1]=>
  array(3) {
    [0]=>
    string(14) "queues:default"
    [1]=>
    string(21) "queues:default:notify"
    [2]=>
    string(579) "{"uuid":"5b31adf4-4646-4435-a13e-9940450261da","displayName":"App\\Jobs\\TestJob","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"maxExceptions":null,"backoff":null,"timeout":null,"retryUntil":null,"data":{"commandName":"App\\Jobs\\TestJob","command":"O:16:\"App\\Jobs\\TestJob\":10:{s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"},"id":"H97AvylnadgDi2Vp8eA0ieXiNxrgY8Ok","attempts":0}"
  }
  [2]=>
  int(2)
}

发现里面用的是eval命令执行的rpush。

最后在redis里用命令执行eval,结果发现没有这个权限运行:

eval "redis.call('rpush', KEYS[1], ARGV[1])\nredis.call('rpush', KEYS[2], 1)" "queues:default" "queues:default:notify" 
返回:
"ERR command eval not support for your account"

最后联系阿里的客服,建议我们升级Redis的版本后,问题就好了。