延迟查看 Azure 队列消息

Delay seeing Azure queue message

我 运行 我的云服务在 Visual Studio 处于调试模式,我看到我的实时站点上的按钮单击事件有很大的延迟,并在我的调试会话中击中断点云服务。从单击按钮到出现队列消息大约需要 20-30 秒。这是正常的吗?这是由于 运行 在调试模式下造成的,还是这大致代表了它在生产中的样子?这是我的第一个云服务项目,所以我还在学习转动旋钮。我是唯一一个使用云服务的人,因为它仍在开发中。

编辑以添加代码调用。

这是我从网站上拨打的电话。队列消息只是一个文件名,所以消息负载很小。

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

//Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("queue");

//Create the queue if it doesn't already exist.
queue.CreateIfNotExists();

//Create a message and add it to the queue.
CloudQueueMessage message = new CloudQueueMessage(filename);

queue.AddMessage(message, timeToLive: TimeSpan.FromMinutes(1), initialVisibilityDelay: null);

此调用需要大约 30 秒才能在 WorkerRole 中接听:

        // Retrieve a reference to a container.
        CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
        CloudBlobContainer hmtlcontainer = blobClient.GetContainerReference("conthtml");

        // Create the container if it doesn't already exist.
        container.CreateIfNotExists();
        hmtlcontainer.CreateIfNotExists();

        // Create the queue client
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

        // Retrieve a reference to a queue
        CloudQueue queue = queueClient.GetQueueReference("queue");

        try
        {
            // Look for a new queue message
            CloudQueueMessage peekedMessage = queue.GetMessage(visibilityTimeout: TimeSpan.FromSeconds(3)); 

不,延迟根本不应该那么长。我肯定认为它与远程调试有更多关系。 IDE 和调试进程之间有很多信息。当像这样进行远程调试时,我可以看到它需要一段时间。我倾向于使用模拟器进行调试,除非绝对有必要从 运行ning 云环境进行调试。

话虽这么说,如果我是你,我会在你的日志记录中添加一些遥测数据,以查看你何时收到消息、处理消息需要多长时间等。然后当你 运行 在调试之外您将更好地了解实际处理过程。另请注意,您可以查看 InsertionTime 队列消息的属性,并将其与处理器拾取它的时间进行比较,以查看它在队列中的停留时间。

是正确的,要确定为什么您会看到如此多的延迟,您需要找出代码中延迟的实际来源。如果您 post 特定的呼叫或缓慢的呼叫,我们可能会提供更好的建议。实际上,我们很大程度上只是在猜测。也就是说,假设延迟与 Azure 存储有关,我想添加一些推测:

  1. 它不会解释所有的延迟,但会检查您实际呼叫的是世界上的哪个地方。如果您的存储帐户在亚洲而您在加利福尼亚,那么如果您的代码 运行 位于更靠近数据中心的位置,您将看到更多的延迟。
  2. 特定于队列消息,请在放置消息时检查您的可见性超时是否很低(或为 0)。如果您的消息可见性超时为 30 秒,它实际上不会在 gets 上显示 30 秒。
  3. 确认您实际进行了多少次存储调用。如果您要创建队列、放置消息、轮询...等,对于小消息,它所花费的时间将远远超过所引用的 10 毫秒。如果您使用 Mike 的建议找出哪个速度慢,那将有助于您进一步调试。