库错误:Symfony Messenger 中发生套接字错误

Dav*_*ore 8 php amqp symfony symfony-messenger

在我的 Symfony 项目中,有一个队列消息处理程序,并且在执行过程中随机出现一个错误:

[2022-10-12T07:31:40.060119+00:00] console.CRITICAL: Error thrown while running command "messenger:consume async --limit=10". Message: "Library error: a socket error occurred" {"exception":"[object] (Symfony\\Component\\Messenger\\Exception
TransportException(code: 0): Library error: a socket error occurred at /var/www/app/vendor/symfony/amqp-messenger/Transport/AmqpReceiver.php:62)
[previous exception] [object] (AMQPException(code: 0): Library error: a socket error occurred at /var/www/app/vendor/symfony/amqp-messenger/Transport/Connection.php:439)","command":"messenger:consume async --limit=10","message":"Library error: a socket error occurred"} []
Run Code Online (Sandbox Code Playgroud)

处理程序执行的 HTTP 请求可能会持续几秒钟,如果 API 速度很慢,单个消息的整个过程甚至可能需要一分钟以上。奇怪的是,问题消失了几个小时,但随后又随机出现。发送到队列的消息越多,就越容易看到异常。

config\packages\messenger.yaml

framework:
    messenger:    
        transports:
            # https://symfony.com/doc/current/messenger.html#transport-configuration
            async:
                dsn: "%env(MESSENGER_TRANSPORT_DSN)%"
                options:
                    exchange:
                        name: async_exchange
                    queues:
                        async: ~
                    heartbeat: 45
                    write_timeout: 90
                    read_timeout: 90
                retry_strategy:
                    max_retries: 0
            
        routing:
            # Route your messages to the transports
            'App\Message\MessageUpdateRequest': async
Run Code Online (Sandbox Code Playgroud)

应用\MessageHandler\MessageUpdateRequestHandler.php

<?php

declare(strict_types=1);

namespace App\MessageHandler;

use App\Message\MessageUpdateRequest;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

class MessageUpdateRequestHandler implements MessageHandlerInterface
{

    public function __invoke(MessageUpdateRequest $message)
    {
        // Logic executing API requests...
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

环境

  • Symfony 信使:5.4.17
  • PHP:8.1
  • 兔子MQ:3.11.5

我尝试过的事情

  • 使用此处提供的修复将 Symfony Messenger 升级到 5.4.17 ;
  • 在文件中添加以下选项:heartbeatwrite_timeout和。read_timeoutmessenger.yaml

相关问题/链接

我该如何解决这个问题?

Moh*_*sin 3

关于 Symfony Messenger 中发生的套接字错误,我总是建议遵循逐步方法并检查是否遗漏了任何内容。它几乎每次都会修复此类错误。请遵循以下准则:

  • 验证 RabbitMQ 服务是否处于活动状态且可访问。
  • 验证文件中列出的主机名、端口、用户名和密码messenger.yaml是否准确。
  • 在该messenger.yaml文件中,增加心跳、写入超时和读取超时设置。
  • 验证您的用例以确定最大重试次数是否messenger.yaml合适。
  • 查找可能导致套接字错误的任何网络问题。
  • 确保您的 PHP 版本与 RabbitMQ 和 Symfony Messenger 兼容。
  • 验证服务器的资源(CPU、内存和磁盘)是否未用完。
  • 在 PHP 错误日志中查找任何相关的错误消息。
  • 判断类的逻辑是否有问题MessageUpdateRequestHandler

希望能帮助到你。调试愉快,祝你好运。