我在云队列(Azure)中有数千兆字节的数据(存储在消息中,每条消息大约为500KB),数据不断涌现。
我需要对每条消息进行一些处理。我决定创建2个后台工作程序,一个用于将数据存入内存,另一个用于处理该数据:
GetMessage(CloudQueue cloudQueue, LocalQueue localQueue)
{
lock (localQueue)
{
localQueue.Enqueue(cloudQueue.Dequeue());
}
}
ProcessMessage(LocalQueue localQueue)
{
lock (localQueue)
{
Process(localQueue.Dequeue());
}
}
问题是数据永远不会停止,所以我将花费大量时间来同步本地队列。这类问题是否存在已知模式?
答案 0 :(得分:3)
您在处理
时不需要按住锁定Item i;
lock (localQueue)
{
i = localQueue.Dequeue();
}
Process(i);
因此,应该没有什么争论。如有必要,通过批量插入来降低生产者获取入队锁的频率:而不是队列保持单个项目使其保持批次。您可以通过一个因子(平均批量大小)有效地减少锁定数量。您可以拥有一个简单的批处理模型,例如,每10个或按时间或某个时间和阈值的组合。