2014-11-14 44 views
4

我們在Azure上移植我們的軟件時遇到一些問題。我們的解決方案由2個網站(前端,後端)和webjob(安裝在我們硬件上的win服務)組成。這些節點使用RabbitMQ集羣(2個Ubuntu VM)進行通信。 的處所,我們沒有任何問題,但在Azure上安裝的時候,我們看到像許多錯誤:Azure上的RabbitMQ連接超時

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 VM:

$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 [email protected]$mymachinename 
    sudo rabbitmqctl start_app 
    sudo rabbitmqctl set_cluster_name my_cluster_name 

我們還沒有打開任何其他端口(如4369和25672),因爲我們假設第ese僅用於節點之間的內部通信。這是正確的? 我們使用雲服務主機名從客戶端連接到rabbitmq。我們也嘗試刪除集羣並連接到單個RabbitMQ虛擬機。

你有什麼想法嗎?似乎是某種超時問題?可能是網絡分區問題?

+0

你的Ubuntu上配置了SSH服務器嗎?你可以連接到其中一個虛擬機,並嘗試通過SSH連接到第二個虛擬機(以查看是否有任何網絡可見性)? – b2zw2a 2014-11-14 17:24:37

+0

@plentysmart是的,我試過了,似乎機器之間的連接是好的。另外,因爲clustet是正確的,我也試過沒有集羣,但使用一個vm for rabbitmq,但問題仍然存在。 – 2014-11-14 19:44:10

+0

也有同樣的問題。你有沒有設法克服它們? – 2014-12-01 02:29:00

回答

3

我正在部署一個配置,其中一個VPS在Windows Server上運行RabbitMQ代理。在服務器上,我們有兩個通過RabbitMQ/Masstransit進行通信的.Net服務以及一個通過RabbitMQ/Masstransit進行服務請求/響應的網站。

我們會得到虛假超時,RabbitMQ在大多數時間都會失敗。我剛剛完成將VPS和網站移動到Azure中的虛擬網絡(VNET),這似乎解決了問題(手指交叉)。請注意,您必須將網站上的經紀商地址更新爲內部IP。確保通過VNET進行連接的最佳方法是關閉RabbitMQ的端點。作爲一個額外的優勢,在這種設置下,不必擔心交通安全問題,因爲RabbitMQ只能在VNET內部訪問。

+0

謝謝,很好的建議。我會嘗試。 – 2014-12-14 20:25:26