RabbitMQ上的Azure连接超时

时间:2014-11-14 14:48:38

标签: azure rabbitmq

我们在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个公共端点。我们的客户端托管在同一区域的Azure网站中。

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

$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 VM。

你知道吗?似乎是某种超时问题?可以是网络分区问题吗?

1 个答案:

答案 0 :(得分:3)

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

我们会得到虚假的超时,而RabbitMQ在大部分时间内都会失败。我刚刚完成将VPS和网站移动到Azure中的虚拟网络(VNET),这似乎解决了问题(手指交叉)。请注意,您必须将网站上的代理地址更新为内部IP 。确保通过VNET进行连接的最佳方法是关闭RabbitMQ的端点。作为一个额外的好处,通过这种设置,不必担心运输安全,因为RabbitMQ只能在VNET内部访问。