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

Joh*_*ohn 5 queue azure azure-queues

我正处于设计基于Azure的应用程序的早期阶段.考虑到我可能期望的需求变化,吸引我进入Azure的一个原因是可扩展性.因此,我试图保持松散耦合,以便我可以在需要时添加实例.

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

我正在考虑从web角色进行简单插入的情况 - 我可以将其设置为消息,将其发送到队列中,并让工作者角色拾取并执行插入,它似乎很多双重处理.但是我也很欣赏,从长远来看,这可能是更好的情况,万一web角色不堪重负或者插件需要更复杂的逻辑.

我意识到这可能是一个案例,答案是"它完全取决于情况,检查你的绩效指标" - 但如果有人有任何想法,我会非常感激!

Tob*_*ans 5

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

想象一下,你正在进入一个夜总会,这个夜总会与一个狡猾的地区接壤,但是一旦你进入,它就没问题了.

管理层在门上雇佣了一些大型的笨重的保镖来整理即兴演奏.如果你是一个白痴,你就不会进入.在这里尽可能多地扩展这个比喻.

如果你没事,那么他们会让你进门,你加入,是的,The Queue在票房支付进入实际的俱乐部.

根据足球的不同,你可能需要更多的保镖,但这可以独立于票房工作人员.繁忙的夜晚,你可能会打开另一个窗口来更快地获得资金,但你可能不会做的事情让保镖处理现金.他们还有其他与他们有关的事情.

所以:

  • 保镖 - 网络角色.处理传入流量,排除无效请求并将有效请求添加到:
  • 队列 - 队列!
  • 票房 - 工人角色,对webrole执行不同的角色

所以,没有理由说你的网络角色不能担任票房角色,但从长远来看,最好不要这样做.

这是我的比喻

托比


Cod*_*nis 3

我想说像插入这样的东西不需要工作者角色。无论如何,您都会向队列中插入数据,因此您不会在网络角色中保存任何内容。最好的办法是将您的插入(以及所有数据访问)隔离到 Web 角色中的一个或多个单独的类中。这将使您能够将 Web 角色中的其余代码与您正在使用的特定数据存储系统分离。这使得以后更改数据存储变得更加容易。如果您的插入最终需要更多处理,您可以在需要时添加队列和辅助角色,但我仍然会说您希望直接插入到表存储中,然后将计算或其他业务逻辑转移到工人角色。然后,该辅助角色可以处理来自队列的消息,或者只是查询表存储以获取新的(未处理的)记录。

我认为使用队列与辅助角色进行通信最有效的方式是当需要对数据进行计算或其他处理时。我最常使用的实际上是 Azure SDK 中的示例之一,它展示了如何制作缩略图。我的Web角色将上传的图像插入Azure Blob存储中,并将相关描述和其他字段插入Azure表存储中。它还会在队列中放置一条消息,让辅助角色知道有一个需要生成缩略图的新图像。实际上,我为每个图像生成了几种不同尺寸,以用于网站的不同部分。辅助角色仅生成这些缩略图,不需要将任何类型的通知发送回 Web 角色。当缩略图尚不可用时,任何使用图像的地方都有逻辑使用原始上传或其他占位符。

如果您想完全跳过队列,则同一过程可以仅使用 Blob 存储上的查询来查找哪些图像仍需要处理。我还没有确定是否喜欢使用队列或只是轮询数据以查找需要辅助角色处理的记录。我认为队列效率更高,但它也增加了额外的复杂性和额外的潜在故障点。

编辑回应评论:当我发布这个答案时,我说如果缩略图不可用,则仅在用户界面中使用全分辨率图像。现在,我正在开发一个仅使用默认缩略图的网站,该缩略图显示“正在处理”,直到生成的缩略图可用。选择权在您手中,并且实际上取决于应用程序 UI 的要求。

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

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