我有一个使用 Azure 队列的基于 PHP 的应用程序。我的应用程序有一个 cron,每 20 分钟在我的 Web 服务器上运行一次,并向 Azure 队列存储添加多达 2000 条消息。它曾经将这些消息放入一个队列中,但现在我使用两个不同的队列,交替地将消息放入每个队列中。每条消息添加到Queue后,还有一个十分之一秒的休眠期,以避免节流。
我在 Azure 上有大约 40 个虚拟机,它们从该队列中读取数据、处理每条消息,然后在其中任何消息触发特定事件时更新数据库。每 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
由于代码大部分时间都有效,所以我看不出问题出在哪里。我是这样知道这种情况经常发生的 /image/GRvXP.png
Y 轴是消息数。 X 轴是时间。每分钟都会记录一次消息计数。
每次交替运行添加消息的脚本后的平坦曲线显示了问题。如果代码有问题,行为就不会那么不稳定。我无法指出哪里出了问题或问题可能出在哪里。该代码非常简单,除了 5-10 分钟不活动之外的大部分时间都可以工作。
如果有任何帮助,我将不胜感激。谢谢。
最佳答案
与 Gaurav's帮助我能够确定它。我将初始可见性超时设置为 10 分钟,这导致消息在添加到队列后几分钟内不可见。我将“setVisibilityTimeoutInSeconds”配置与消息在未显式删除的情况下重新出现在队列中所需的时间混淆了。
关于php - Azure 队列行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26324305/