首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Azure连接超时的RabbitMQ

关于Azure连接超时的RabbitMQ
EN

Stack Overflow用户
提问于 2014-11-14 14:48:38
回答 1查看 2K关注 0票数 5

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

代码语言:javascript
复制
Publisher did not confirm message

代码语言:javascript
复制
Publish not confirmed before channel closed

代码语言:javascript
复制
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上,我们看到了这样的错误:

代码语言:javascript
复制
closing AMQP connection <0.390.0> (100.73.204.90:61152 -> 100.73.205.2:5672):
   {handshake_timeout,handshake}

其结果是,经常没有正确地接收消息。

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

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

在这里,我们的powershel脚本创建了2VM:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
  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 '.*' '.*' '.*'

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

代码语言:javascript
复制
  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。

你有什么想法吗?似乎是某种超时问题?会不会是一个网络分区问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 16:30:46

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26932585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档