Azure 上的 RabbitMQ 连接超时

Dav*_*rdi 5 azure rabbitmq

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

Publisher did not confirm message
Run Code Online (Sandbox Code Playgroud)

或者

Publish not confirmed before channel closed
Run Code Online (Sandbox Code Playgroud)

或者

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
Run Code Online (Sandbox Code Playgroud)

在 RabbitMQ 上,我们看到以下类型的错误:

closing AMQP connection <0.390.0> (100.73.204.90:61152 -> 100.73.205.2:5672):
   {handshake_timeout,handshake}
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是我们创建 2 VM 的 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
}
Run Code Online (Sandbox Code Playgroud)

然后我们运行以下脚本在两台机器上安装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 '.*' '.*' '.*'
Run Code Online (Sandbox Code Playgroud)

然后我们使用以下命令创建集群:

  sudo rabbitmqctl stop_app
  sudo rabbitmqctl join_cluster rabbit@$mymachinename
  sudo rabbitmqctl start_app
  sudo rabbitmqctl set_cluster_name my_cluster_name
Run Code Online (Sandbox Code Playgroud)

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

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

Phi*_*oft 3

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

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