Magento2 main.ERROR: Broken pipe or closed connection错误信息解决方法

文章介绍了在Magento2.4.1使用RabbitMQ时遇到的Brokenpipe或closedconnection错误,分析了AMQP的Heartbeat和Keepalive参数作用,并提供了通过修改Factory.php文件设置keepalive和heartbeat以解决该问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Magento2 main.ERROR: Broken pipe or closed connection错误信息解决方法

1. 场景描述:

Magento2.4.1 使用rabbitmq 3.8.x,连接时出现管道破裂或关闭连接(/var/log/system.log)

2. 排查问题与了解AMQP原理

AMQP (Advanced Message Queuing Protocol) 是一种网络协议,它用于在应用程序之间传输异步消息。在使用 AMQP 时,有两种参数可以帮助保持连接的活动状态。这两种参数是 heartbeat 和 keepalive。

Heartbeat 是 AMQP 协议的一部分,它允许客户端和服务器之间定期发送消息以保持连接的活动状态。当客户端和服务器之间的连接空闲时,会启用 heartbeat 机制。如果服务器在 heartbeat 时间内没有收到客户端的响应,则会认为客户端已经无响应,关闭连接。

Keepalive 是操作系统级别的参数,它允许操作系统在网络连接空闲时发送保持活动状态的消息。Keepalive 参数可以设置操作系统发送 keepalive 消息的频率和超时时间。当操作系统发送 keepalive 消息时,它会检测网络连接是否正常,并确保连接处于活动状态。如果操作系统在 keepalive 时间内没有收到响应,则会认为连接已经关闭。

总的来说,heartbeat 和 keepalive 参数都是用来保持连接的活动状态的。Heartbeat 是 AMQP 协议的一部分,它在应用程序层面上保持连接的活动状态,而 keepalive 是操作系统级别的参数,它在操作系统层面上保持连接的活动状态。

AMQP heartbeat 参数指定了客户端和服务器之间定期发送的心跳消息的间隔时间,这个间隔时间是以秒为单位的。在AMQP协议中,这个heartbeat参数的默认值是60秒,但是可以根据具体的需求进行配置。如果heartbeat时间过长,则可能会导致连接在长时间的空闲期之后被关闭,如果heartbeat时间过短,则可能会影响到网络带宽的使用。因此,在设置heartbeat参数时,需要根据实际情况进行调整,以保证连接的可靠性和网络性能。

AMQP keepalive 参数被设置为60秒。这意味着在网络空闲期间,操作系统将会发送 keepalive 消息,以保持连接处于活动状态。

需要注意的是,在 Magento 2 中,AMQP 连接的 keepalive 参数是通过设置操作系统级别的 TCP keepalive 参数来实现的。因此,在设置 keepalive 参数时,需要确保操作系统也已经正确地配置了相应的参数。

在 Magento 2 中,可以通过在 app/etc/env.php 文件中添加 AMQP 连接配置参数来设置 keepalive 参数。以下是一个示例配置:


'queue' => [
    'amqp' => [
        'host' => 'localhost',
        'port' => '5672',
        'user' => 'guest',
        'password' => 'guest',
        'virtualhost' => '/',
        'ssl' => 'false',
        'heartbeat' => '30',
        'connection_timeout' => '30',
        'retry_delay' => '5',
        'max_retries' => '3',
        'keepalive' => '60',
    ],
],

当然,使用env.php配置的方式我有尝试过,但貌似无效,暂时还没查到原因,要是有大神知道请指教。那我接着讲我的解决方法吧。

3. 解决方法

在vendor/magento/framework-amqp/Connection/Factory.php中

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Framework\Amqp\Connection;

use Magento\Framework\App\ObjectManager;
use PhpAmqpLib\Connection\AbstractConnection;
use PhpAmqpLib\Connection\AMQPSSLConnection;
use PhpAmqpLib\Connection\AMQPStreamConnection;

/**
 * Create connection based on options.
 */
class Factory
{
    /**
     * Create connection according to given options.
     *
     * @param FactoryOptions $options
     * @return AbstractConnection
     */
    public function create(FactoryOptions $options): AbstractConnection
    {
        $connectionType = $options->isSslEnabled() ? AMQPSSLConnection::class : AMQPStreamConnection::class;
        $parameters = [
            'host' => $options->getHost(),
            'port' => $options->getPort(),
            'user' => $options->getUsername(),
            'password' => $options->getPassword(),
            'vhost' => $options->getVirtualHost() !== null ? $options->getVirtualHost() : '/',
            /*
            *	keepalive开启
            *	heartbeat频率设定10秒
			*/
            'keepalive' => true,
            'heartbeat' => 10,
        ];

        if ($options->isSslEnabled()) {
            $parameters['ssl_options'] = $options->getSslOptions() !== null
                ? $options->getSslOptions()
                : ['verify_peer' => true];
        }

        return ObjectManager::getInstance()->create($connectionType, $parameters);
    }
}

4. 错误消失,填坑完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金哥铁码

打赏一下,功德+1

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值