我们在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。
你知道吗?似乎是某种超时问题?可以是网络分区问题吗?答案 0 :(得分:3)
我在Windows Server上部署了一个运行RabbitMQ代理的VPS配置。在服务器上,我们有两个通过RabbitMQ / Masstransit进行通信的.Net服务,以及一个通过RabbitMQ / Masstransit对服务进行请求/响应的网站。
我们会得到虚假的超时,而RabbitMQ在大部分时间内都会失败。我刚刚完成将VPS和网站移动到Azure中的虚拟网络(VNET),这似乎解决了问题(手指交叉)。请注意,您必须将网站上的代理地址更新为内部IP 。确保通过VNET进行连接的最佳方法是关闭RabbitMQ的端点。作为一个额外的好处,通过这种设置,不必担心运输安全,因为RabbitMQ只能在VNET内部访问。