在单个邮件中向Azure Queue添加多个元素

时间:2014-05-15 11:36:14

标签: c# azure cloud

我与AzureStorageAccountCloudQueueClient进行互动的方式类似于this msdn example

中描述的方式
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("some connection string");
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

并将一个元素添加到队列中(删除了一些样板):

var queue = queueClient.GetQueueReference("queuename");
var message = new CloudQueueMessage("myString");
queue.AddMessageAsync(message);

这意味着我可以添加" myString"到我的队列。大。如果我反复调用那些代码行,我可以添加" mystring"很多的时间。同样好,但效率低。

如何在一条消息中向队列中添加多个项目?

我对此进行了一些研究,发现Entity Group Transactions,这可能是合适的选择。但是,这看起来与我一直在做的完全不同,并没有给我任何代码示例。 有没有办法使用它并继续使用Microsoft.WindowsAzure.StorageClient libary来构建我的消息?

2 个答案:

答案 0 :(得分:3)

您可以发送多个消息的一种方法是构建一个包装类,其中包含单个字符串值(或对象)的列表,例如将其序列化为JSon对象,并将其作为消息的有效负载发送。这里的问题是,根据对象的大小,最终可能会超出消息的大小限制。所以这不是推荐的实现。

在某些时候,我正在处理一个需要每秒发送大量消息的系统;它是大规模分发的。我们最终在多个存储帐户中创建了一个消息队列碎片,而不是批量处理多个消息。可扩展性要求促使我们实现了这一目标。

请记住,Chunky vs Chatty适用于发送更多信息以避免往返,以便优化性能。消息队列不是关于性能的;它更多的是关于信息的可扩展性和分布。换句话说,最终的一致性和分布式扩展是在这种环境中有利的模式。我并不是说你应该忽略chunky vs chatty,但你应该把它应用到有意义的地方。

例如,如果您需要每秒发送100万条消息,则可以选择较粗略的呼叫;分片是另一个。我通常喜欢分片,因为可扩展性边界较少。但在某些情况下,如果问题很简单,分块就足够了。

答案 1 :(得分:0)

我认为没有必要在一条消息中向队列添加多个项目,因为最佳做法是尽可能减少消息和相应的消息处理程序。

这里谈论效率低下是非常困难的。但是当消息数量增长以至于它会真正影响性能时,您可以使用BatchFlushInterval属性来批量处理消息。否则请关注Best Practices for Performance Improvements Using Service Bus Brokered Messaging

<强>更新

通过自己批量处理消息,例如列表,您至少需要解决以下可能导致无法解决的问题的问题:

  • 跟踪邮件的大小,以便不超过最大邮件大小限制
  • 找到放弃,完成特定消息并将其移至死信队列的方法
  • 自己实施批处理策略
  • 跟踪大量的消息处理时间,如果花费的时间太长,则实施锁定

PS 如果您可以概述问题的目的,那么可能会找到更好的解决方案。