Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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队列的最佳实践_Azure_Queue_Azure Queues - Fatal编程技术网

(超过)使用Azure队列的最佳实践

(超过)使用Azure队列的最佳实践,azure,queue,azure-queues,Azure,Queue,Azure Queues,我正处于设计基于Azure的应用程序的早期阶段。Azure吸引我的因素之一是可伸缩性,考虑到我可能期望的需求的可变性。因此,我试图保持松散耦合,以便在需要时添加实例 我看到的为Azure构建应用程序的建议包括将web角色逻辑保持在最低限度,在工作者角色中完成处理,使用队列进行通信,以及某种后端存储(如SQL Azure或Azure表)。这对我来说似乎是个好主意,因为我可以毫无问题地扩展应用程序的任一部分或两部分。然而,我很好奇是否有任何最佳实践(或任何人是否有任何经验),以确定何时最好让web角

我正处于设计基于Azure的应用程序的早期阶段。Azure吸引我的因素之一是可伸缩性,考虑到我可能期望的需求的可变性。因此,我试图保持松散耦合,以便在需要时添加实例

我看到的为Azure构建应用程序的建议包括将web角色逻辑保持在最低限度,在工作者角色中完成处理,使用队列进行通信,以及某种后端存储(如SQL Azure或Azure表)。这对我来说似乎是个好主意,因为我可以毫无问题地扩展应用程序的任一部分或两部分。然而,我很好奇是否有任何最佳实践(或任何人是否有任何经验),以确定何时最好让web角色直接与数据存储对话,而不是通过队列发送数据

我正在考虑这样一种情况,即我可以从web角色进行一个简单的插入-虽然我可以将其设置为消息,在队列中发送,并让工作者角色拾取它并进行插入,但这似乎是一种双重处理。但是,我也理解,从长远来看,这可能更好,以防web角色被淹没或插入需要更复杂的逻辑


我意识到,在这种情况下,答案可能是“这完全取决于情况,检查您的性能指标”——但如果有人有任何想法,我将非常感激

我想说,插入之类的东西不需要工作者角色。无论如何,您都会在队列中插入一个,这样您就不会在web角色中保存任何内容。最好的办法是将插入(和所有数据访问)隔离到web角色中的一个或多个单独类中。这将允许您将web角色中的其余代码与正在使用的特定数据存储系统分离。这使得以后更改数据存储变得更加容易。如果您的插入最终需要更多的处理,您可以在需要时添加队列和工作者角色,但我仍然认为您希望直接将插入操作执行到表存储中,然后将计算或其他业务逻辑降级为工作者角色。然后,工作者角色可以处理队列中的消息,或者只是查询表存储中的新(未处理)记录

我认为使用队列与工作者角色进行通信最有效的方式是当需要对数据进行计算或其他处理时。我用得最多的是Azure SDK中的一个示例,它展示了如何制作缩略图。我的web角色将上载的图像插入Azure blob存储,并将相关说明和其他字段插入Azure表存储。它还将在队列上放置一条消息,让工作角色知道有一个需要生成缩略图的新图像。我实际上生成了一些不同大小的图像,用于站点的不同部分。worker角色只生成这些缩略图,不需要向web角色发送任何类型的通知。当缩略图还不可用时,任何使用图像的地方都可以使用原始上传或其他占位符

如果您想完全跳过队列,这个过程可以只使用blob存储上的查询来查找哪些图像仍然需要处理。我还没有决定是使用队列还是只轮询数据来查找需要工作者角色处理的记录。我认为队列效率更高,但它也增加了额外的复杂性和额外的潜在故障点

编辑以回应评论:当我发布此答案时,我说如果缩略图不可用,请在UI中使用全分辨率图像。现在,我正在一个网站上工作,它只使用默认的缩略图图像,在生成的缩略图可用之前显示“正在处理”。选择权在您,具体取决于应用程序UI的要求

您可以做的一件事是使用signar或一些AJAX来通知用户的浏览器何时有新的缩略图可用,而无需等待新的页面加载


在工作线程上进行图像处理时看到占位符缩略图比在生成缩略图时等待页面加载要好得多。

这是我的比喻,用它做你想做的事

想象一下,你正在进入一家夜总会,这家夜总会靠近一个危险的区域,但只要你进去就可以了

管理层在门上雇佣了一些大块头的保镖来清理垃圾。如果你是个白痴,你就不能进去。在这里尽可能多地扩展隐喻

如果你没事的话,他们会让你进门,然后你加入,是的,排队在票房付款,进入真正的俱乐部

取决于足球是开着还是什么的,你可能希望门上有更多的保镖,但这可以独立于票房人员。繁忙的夜晚,你可能会打开另一个窗口,以便更快地把钱拿进来,但你可能不会做的是让保镖来处理现金。他们的手还有其他事情要做

因此:

  • 保镖-网络角色。处理 传入流量,排斥无效 请求并添加有效的请求 致:
  • 队列-队列
  • 票房-工作者角色,执行与webrole不同的角色
所以,没有理由说你的网络角色不能扮演票房角色,但从长远来看,这可能是最好的选择

这就是我的比喻


Toby使用分布式队列(Azure或Amazon或其他)相当微妙,令人惊讶。我发布了一篇博客文章。一句话:我建议仔细地从业务逻辑(队列的内容和处理)中抽象出您的基础结构逻辑(支持队列)。

当您这样做时,您会向用户展示什么?多用户