Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure队列存储-在调用CloudQueue.GetMessages()后立即将消息标记为可见_Azure_Azure Worker Roles_Azure Storage_Azure Storage Queues - Fatal编程技术网

Azure队列存储-在调用CloudQueue.GetMessages()后立即将消息标记为可见

Azure队列存储-在调用CloudQueue.GetMessages()后立即将消息标记为可见,azure,azure-worker-roles,azure-storage,azure-storage-queues,Azure,Azure Worker Roles,Azure Storage,Azure Storage Queues,问题: 我正在从Azure存储队列读取消息,然后使用辅助角色将它们插入到存储表中 我想读入消息,但只有在至少有100条消息时才处理它们(这是为了优化正在发生的存储表批插入)。如果少于100条消息,则我希望取消消息处理,并使它们在队列中立即可见,以便下次读取队列 问题: 是否可以将刚刚被CloudQueue.GetMessages(…)读取的消息标记为可见,而不必等待超时过期 代码:(在WorkerRole.cs中) 谢谢将过期时间重置为0.0。这很有希望达到目的。您可以检查队列的“Approxi

问题:

我正在从Azure存储队列读取消息,然后使用辅助角色将它们插入到存储表中

我想读入消息,但只有在至少有100条消息时才处理它们(这是为了优化正在发生的存储表批插入)。如果少于100条消息,则我希望取消消息处理,并使它们在队列中立即可见,以便下次读取队列

问题:

是否可以将刚刚被
CloudQueue.GetMessages(…)
读取的消息标记为可见,而不必等待超时过期

代码:(在WorkerRole.cs中)


谢谢

将过期时间重置为0.0。这很有希望达到目的。

您可以检查队列的“ApproximateMessageCount”属性(详细信息),这将大致了解队列中有多少消息在等待

另外:您可以将消息的不可见超时设置为较小的值(可能是5-10秒?)。在这段时间之后,消息将再次可见。您还可以在阅读后将不可见性超时修改为更短的时间

只需记住,从队列读取数据和更新消息(例如更新不可见性超时)都算作一个事务


等待100条消息可能是一种非最佳优化。哦,而且
GetMessages()
(详细信息)被限制为32条消息,所以等待100条消息是没有意义的。另外:交易非常非常便宜(每10万笔交易一便士)。我不一定在这里看到值。

我不能使用ApproximateMessageCount(),因为工作角色的另一个实例可能会在调用GetMessages()之前拾取消息。啊,我不知道有一个32的限制。批插入中包含的项目越多,每个项目的“写入”时间越快。因为我每天要处理数百万/数十亿条记录,所以我需要最大限度地优化。我同意David re value的观点。您试图通过存储批量插入优化什么?如果是成本,请非常小心,您可能过早地优化了成本。成本优化,除非使用compute,否则很少会节省很多。我不是在成本优化,我只是发现在分区上执行单一插入永远不会达到最大插入速率(每个分区高达2000/s)。通过批量插入实体,我可以实现更高的速率。据我所知,批量插入是Storage Client Library v2.0在性能上的最大突破之一。如果您最多读取32个现有队列项,并将它们作为批写入,您将有机会超越2000/秒。但也要考虑您的模式和跨多个分区存储数据,而不是针对单个分区。
public override void Run()
{
    while (true)
    {
        var messages = queue.GetMessages(100);

        if (messages.Count() >= 100)
        {
            // This will process, insert into a table, and delete from the queue
            ProcessMessages(messages);
        }
        else
        {
            //!!! MARK MESSAGES AS VISIBLE ON THE QUEUE
            System.Threading.Thread.Sleep(1000);
        }
    }
}