2014-10-12 57 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”配置与邮件重新出现在队列中的时间(如果未明确删除)。