2014-10-12 58 views
1

我有一個使用Azure隊列的基於PHP的應用程序。我的應用程序每隔20分鐘就有一個在我的Web服務器上運行的cron,並且它將多達2000條消息添加到Azure隊列存儲中。它曾經把這些消息放在一個隊列中,但現在我使用了兩個不同的隊列,每個隊列中都有消息。在將每條消息添加到隊列以避免節流之後,還有一個十分之一秒的休眠期。Azure隊列意外行爲

我具有約40級的VM上天青,從這個隊列,處理中讀取每個消息,然後更新數據庫,如果任何這些消息中的觸發特定事件。它在100條消息中發生一次。

這些虛擬機有一個具有900秒(參數或者set_time_limit(900))的最大運行時間一個PHP腳本,它們運行間隔爲15分鐘(900秒)cron作業。

的問題是,每半小時(有時是每小時)的虛擬機將無法讀取從隊列中任何幾分鐘。該消息將是空的。

這是代碼,我使用

$listMessagesResult = $queueRestProxy->listMessages($queue_name); 
$messages = $listMessagesResult->getQueueMessages(); 

結果是簡單地一個空消息。我有以下代碼來跟蹤錯誤

if (empty($messages)) { 
     error_log(print_r($messages, TRUE)); 
    } 

它打印並清空數組。確切地說,這是在我的錯誤日誌中

Array\n(\n)\n 

由於代碼大部分時間工作,我不明白是什麼問題。這是我如何知道,它經常發生http://i.imgur.com/RE9XtVS.png

Y軸是郵件的數量。 X軸是時間。消息計數是每分鐘進行的。

,增加了消息中的腳本的每個交替運行之後的平坦曲線示出了問題。如果代碼存在問題,行爲將不會如此不穩定。我不能指責什麼是錯的或哪裏會出現問題。代碼非常簡單,除了5-10分鐘的非活動之外,它大部分時間都在運行。

我會很感激這方面的幫助。謝謝。

+2

我肯定會推薦的一件事是,您可以在您的隊列服務上啓用存儲分析,並查看存儲級別是否有任何奇怪的事情發生。啓用存儲分析後,您可以在'$ logs' blob容器中看到數據。 – 2014-10-12 14:42:42

回答

0

隨着Gaurav's幫助,我是能夠釘下來。我已將初始可見性超時設置爲10分鐘,這就是導致消息在添加到隊列後幾分鐘內不可見的原因。我混淆了「setVisibilityTimeoutInSeconds」配置與郵件重新出現在隊列中的時間(如果未明確刪除)。