gpt4 book ai didi

azure - Azure 上的 RabbitMQ 连接超时

转载 作者:行者123 更新时间:2023-12-01 02:13:46 24 4
gpt4 key购买 nike

我们在 Azure 上移植软件时遇到一些问题。我们的解决方案由 2 个网站(前端、后端)和一个 webjob(安装在我们的硬件上时的 win 服务)组成。这些节点使用 RabbitMQ 集群(2 个 Ubuntu VM)进行通信。在本地,我们没有任何问题,但当安装在 Azure 上时,我们看到许多错误,例如:

Publisher did not confirm message

Publish not confirmed before channel closed

SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 104.40.186.27:5672

在 RabbitMQ 上我们看到这些类型的错误:

closing AMQP connection <0.390.0> (100.73.204.90:61152 -> 100.73.205.2:5672):
{handshake_timeout,handshake}

结果是经常无法正确接收消息。

我们在 RabbitMQ 之上使用 MassTransit 来进行实际的消息交换。这是我们设置环境的过程:

我们首先在同一云服务上创建 2 个 Ubuntu 14.04 虚拟机(A3:4 核,7 GB)。我们为端口 5672 和 15672 创建了 2 个带有负载均衡器的公共(public)终结点。我们的客户端托管在同一区域的 Azure 网站内。

这里是我们用于创建 2 个虚拟机的 powershel 脚本:

$imageName = "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20140927-en-us-30GB"

$vmc = New-AzureVMConfig -Name $machineName -InstanceSize "Small" -Image $imageName -AvailabilitySetName $serviceName

$null = $vmc | Add-AzureProvisioningConfig -Linux -LinuxUser $user -Password $password
$null = $vmc | New-AzureVM -ServiceName $serviceName -WaitForBoot

$vm = Get-AzureVM -Name $machineName -ServiceName $serviceName

$null = Add-RabbitMQEndpoint -vm $vm -port 5672 -name "RabbitMQ-Main"
$null = Add-RabbitMQEndpoint -vm $vm -port 15672 -name "RabbitMQ-Mgmt"

$null = $vm | Update-AzureVM

Function Add-RabbitMQEndpoint($vm,$port,$name)
{
$lbName = $name + "_LB"
$null = Add-AzureEndpoint -VM $vm -LocalPort $port -PublicPort $port -Name $name -Protocol tcp -LBSetName $lbName -ProbePort $port -ProbeProtocol tcp -ProbeIntervalInSeconds 15
}

然后我们运行以下脚本在两台机器上安装 RabbitMQ:

  sudo add-apt-repository 'deb http://www.rabbitmq.com/debian/ testing main'"
sudo apt-get update
sudo apt-get -q -y --force-yes install rabbitmq-server=3.4.1-1

sudo invoke-rc.d rabbitmq-server stop
echo 'MYCOOKIEVALUE' | sudo tee /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo invoke-rc.d rabbitmq-server start

sudo rabbitmq-plugins enable rabbitmq_management
sudo invoke-rc.d rabbitmq-server stop
sudo invoke-rc.d rabbitmq-server start

sudo rabbitmqctl add_user user1 pwd1
sudo rabbitmqctl set_user_tags user1 administrator
sudo rabbitmqctl set_permissions -p / user1 '.*' '.*' '.*'

然后我们使用以下方法创建集群:

  sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster rabbit@$mymachinename
sudo rabbitmqctl start_app
sudo rabbitmqctl set_cluster_name my_cluster_name

我们没有打开任何其他端口(例如 4369 和 25672),因为我们认为这些端口仅用于节点之间的内部通信。这是正确的?我们使用云服务主机名从客户端连接到rabbitmq。我们还尝试删除集群并仅连接到单个 RabbitMQ 虚拟机。

你有什么想法吗?似乎是某种超时问题?可能是网络分区问题?

最佳答案

我正在部署一个配置,其中一个 VPS 在 Windows Server 上运行 RabbitMQ 代理。在服务器上,我们有两个通过 RabbitMQ/Masstransit 进行通信的 .Net 服务,以及一个通过 RabbitMQ/Masstransit 对服务进行请求/响应的网站。

我们会遇到虚假超时,并且 RabbitMQ 在大多数情况下都会失败。我刚刚完成将 VPS 和网站移动到 Azure 中的虚拟网络 (VNET),这似乎解决了问题(祈祷)。请注意,您必须将网站上的经纪商地址更新为内部 IP。确保通过 VNET 进行连接的最佳方法是关闭 RabbitMQ 的端点。有了这个设置,还有一个额外的好处,那就是不用担心传输安全,因为 RabbitMQ 只能在 VNET 内部访问。

关于azure - Azure 上的 RabbitMQ 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com