我有以下理论问题。
我希望能够在Azure应用程序中创建每个角色的多个实例。至少2,以确保它每周7天每天24小时(或接近24/7)工作。
这对于侦听数据的客户端前端和角色来说很容易。
对于处理数据并将结果保存在blob / table-storage中的工作者角色来说也很容易,假设每个工作者角色处理它自己的数据集以创建单个结果。
但是我对这个应用程序的“中间”有问题。
在最简单的情况下,如果我可以创建Azure存储“不同”队列(没有两个消息是相同的),那么它将很容易。但据我所知,这是无法做到的,特别是因为你一次只能下载32条消息。
所以,我需要某种控制器角色......我想。这个角色将确保工作者角色不会相互干扰。
但是,这意味着控制器角色不能有多个实例!
我该如何解决这个问题?
编辑:
我看到我可能提供的关于我的问题的信息太少了。
我知道Azure队列是如何工作的;我知道,一旦消息出列,它将在一段时间内或其被删除之前无法用于其他角色。
问题是,我不能只使用随机的唯一数据填充队列,例如GUID。
这是对问题的更实际的解释。
因此,我正在寻找一个独特的队列,或者至少提供一种检查特定消息是否尚未放入其中的方法。
如果服务总线是唯一的方法,那么就这样吧,但是让解决方案尽可能简单会很好。 ;)
答案 0 :(得分:2)
But as far as I know, this cannot be done, especially since you can download only 32 messages at a time.
事实并非如此。当您从队列中读取项目时,这些项目在给定的时间内不会出现在队列中(可配置)。处理完成后,您可以将消息出列。队列ID的生成可以是唯一的&最简单的直接使用GUID的方式。您可以使用它来开发一个读取唯一键项的系统。
有人使用队列的最终原因是为了解决从队列输入而没有任何问题的多个工作者角色的复杂性。
答案 1 :(得分:2)
Service Bus队列确实具有唯一消息的概念(可能是您所指的不同的消息)。这里有两种类型的队列比较好:
使用锁定可以解决在弹性基础架构中使用单个进程的问题。你可以使用blob存储作为锁,如smarx的blob帖子所示:
http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases
但是,我会考虑您的整个架构,并尝试减少您正在使用的角色数量。我在最近的博客文章中提出了一些论据:
http://coderead.wordpress.com/2012/03/23/three-tier-architecture-in-the-cloud/
答案 2 :(得分:1)
如果前端角色将请求记录到Azure存储队列中,则工作人员可以利用该队列对请求进行分布式处理。当一个工作器实例从队列中读取消息时,该消息在给定的时间内不再对任何其他工作器实例可见(您可以通过定期重新更新消息上的租约来增加该消息)。这可以防止两个工作人员处理相同的消息。
或者,您可以使用模式自行选择控制器实例。此模式表明控制器的进程存在于所有角色实例中。实例启动时,该进程首先尝试获取对象的独占锁,例如租用Azure存储blob对象。获得租约的第一个成为“控制器”,其余的进入休眠等待并定期检查blob是否可再次租赁。这允许另一个实例在第一个变得不可用时接管控制器(它以说话的方式变成自我修复)。
我认为第一种方法是我的第一选择,因为它不需要很多复杂的编码。但是,如果你愿意投入时间,那么根据你想要完成的事情,第二个也可以是一个不错的解决方案。