我有一个使用Azure队列的基于PHP的应用程序。我的应用程序有一个cron,每20分钟在我的Web服务器上运行一次,它向Azure Queue存储添加了多达2000条消息。它曾经将这些消息放在一个队列中,但现在我使用两个不同的队列,或者在每个队列中放置消息。在将每条消息添加到Queue以避免限制之后,还有一个十分之一秒的休眠时间。
我在Azure上有大约40个从该队列中读取的VM,处理每条消息,然后在这些消息中的任何一个触发某个事件时更新数据库。它发生在100条消息中。
这些虚拟机只有一个PHP脚本,最长运行时间为900秒(set_time_limit(900)),它们每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分钟的非活动之外,大部分时间都可以使用。
我将不胜感激任何帮助。谢谢。
答案 0 :(得分:0)
在Gaurav's帮助下,我能够确定下来。我将初始可见性超时设置为10分钟,这是导致消息在添加到队列后几分钟内不可见的原因。我很困惑" setVisibilityTimeoutInSeconds"配置,如果未明确删除消息,则消息重新出现在队列中。