Azure队列存储-在调用CloudQueue.GetMessages()后立即将消息标记为可见
问题: 我正在从Azure存储队列读取消息,然后使用辅助角色将它们插入到存储表中 我想读入消息,但只有在至少有100条消息时才处理它们(这是为了优化正在发生的存储表批插入)。如果少于100条消息,则我希望取消消息处理,并使它们在队列中立即可见,以便下次读取队列 问题: 是否可以将刚刚被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
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);
}
}
}