队列无法正常连接到Redis

深蓝

问题描述

我有服务器A,服务器B,使用webman最新版,使用webman/redis-queue队列,服务器B会发送队列queue_request到服务器A,处理完成后,发送队列queue_response等待服务器B接收。

操作系统及workerman/webman等框架组件具体版本

    "php": ">=7.2",
    "workerman/webman-framework": "^1.5.0",
    "monolog/monolog": "^2.0",
    "tinywan/exception-handler": "^1.1",
    "webman/think-orm": "^1.0",
    "psr/container": "^2.0",
    "illuminate/redis": "^10.5",
    "symfony/cache": "^6.2",
    "webman/console": "^1.2",
    "topthink/think-log": "^2.0",
    "workerman/crontab": "^1.0",
    "zjkal/time-helper": "^1.1",
    "tinywan/validate": "^0.0.6",
    "ext-openssl": "*",
    "yzh52521/webman-lock": "^1.0",
    "ext-pdo": "*",
    "yzh52521/webman-throttle": "^1.0",
    "google/apiclient": "^2.13",
    "symfony/translation": "^6.2",
    "webman/redis-queue": "^1.2",
    "vlucas/phpdotenv": "^5.5",
    "webman/log": "^1.1",

报错信息

服务器能正常运行一段时间,有时候几小时,有时候一两天,然后就会发生错误,stdout.log打印错误如下。这个错误目前只会影响出现异常的队列,其他进程里面连接到服务器B使用support\Redis是不受影响的。

Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)

下图是我的status信息,27388正常的时候,connections是有4个连接的。
status

发现报错的队列,然后跟综进程 strace -ttp 27388
strace

对比下面这个是正常连接队列的情况 strace -ttp 27389

27388队列正常是要执行BRPOP取出数据,但是却出现了循环报错“NOAUTH Authentication required”,导致了连接失败,从而报了“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”这个错误,理论上应该是这样的。

这个队列,我开了两个进程,另外一个进程是可以正常连接,为何其中一个进程过一段时间就出错,并且报需要认证,难道因为配置文件丢失,如果丢失的话,那另外一个进程同样也会异常。

希望有大神能解我茅塞。

413 2 0
2个回答

walkor

可能是消费太耗时了,影响了redis异步连接。
消费消息时需要投递新消息到队列里的时候用用同步投递的方法 Resdis::send()

  • 深蓝 2023-11-14

    老大,我确定用的是同步,不是异步队列。

    我查了下“NOAUTH Authentication required”相关的资料如下图:

    在没有使用密码连接情况下,直接连接使用命令,就会报“NOAUTH Authentication required”。

    当他报“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”这个错误的时候,他不应该重新连接吗?但是从下面这个图里面,他根本没有尝试去连接,而是直接快速的尝试使用BRPOP这个命令。

  • 深蓝 2023-11-14

    下面是队列配置文件,config/plugin/webman/redis-queue/redis.php,如果说报”NOAUTH Authentication required“,会不会跟我的配置文件里面使用了env()有关系。

    <?php
    return [
        'default' => [
            'host' => 'redis://'. env('REDIS_DEFAULT_HOST', '127.0.0.1') .':' . env('REDIS_DEFAULT_PORT', 6379),
            'options' => [
                'auth' => null,       // 密码,字符串类型,可选参数
                'db' => 1,            // 数据库
                'prefix' => 'queue:',       // key 前缀
                'max_attempts'  => 5, // 消费失败后,重试次数
                'retry_seconds' => 5, // 重试间隔,单位秒
            ]
        ],
        'master' => [
            'host' => 'redis://'. env('REDIS_MASTER_HOST') .':' . env('REDIS_MASTER_PORT'),
            'options' => [
                'auth' => env('REDIS_MASTER_PASSWORD'),       // 密码,字符串类型,可选参数
                'db' => 1,            // 数据库
                'prefix' => 'queue:',       // key 前缀
                'max_attempts'  => 5, // 消费失败后,重试次数
                'retry_seconds' => 5, // 重试间隔,单位秒
            ]
        ]
    ];
  • walkor 2023-11-14

    一直报 NOAUTH Authentication required ,那就是密码不对

  • 深蓝 2023-11-14

    错误每隔5秒报错“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”,说明有在重试,但是实际上并没有进行重试的操作,而只是一直在尝试BRPOP出数据。

  • walkor 2023-11-15

    报错的连接和BRPOP的应该不是同一个连接,并且你的strace时间也没有达到5秒。我这没有你的现场环境,你自在源码里定位下吧。

rbb

你解决了吗,我也遇到了

  • 深蓝 2024-02-20

    现在偶尔会出现,具体原因还没搞明白。

  • rbb 2024-02-20

    我也是偶现的,是测试服,启动半天就可以会

🔝