Windows Azure 上的作业队列设计

本文关键字:作业队列 Azure Windows | 更新日期: 2023-09-27 18:37:15

有人成功地使用了什么设计来实现Windows Azure上的作业处理?

要求:

  1. 能够将作业推送到队列中。
  2. N 个工作线程可以使用队列中的作业并处理它们。
  3. 作业的
  4. 调用者应该能够收到作业正在完成的警报(推送,而不是轮询)。

迄今为止的研究:

  1. 使用 Azure 服务总线队列创建"作业"队列 (http://blogs.msdn.com/b/appfabric/archive/2011/05/17/an-introduction-to-service-bus-queues.aspx)
  2. Web 前端将作业推送到队列,worker无限期地阻止 Receive()(见 http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.aspx),直到作业准备就绪(以避免"空"长轮询,由于 API 调用事务成本而需要花钱)

关于收到工作完成通知:

    没有
  1. 明显的功能可以在作业完成时发出警报。我以为可以利用服务总线主题/订阅 (https://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-topics/) 并让调用方"订阅"作业完成通知"主题,但是:
    • 您显然不能多次订阅同一主题,除非您创建多个"订阅"条目(不可扩展)
    • 除非我们为每个作业 ID 创建了一个"订阅",并且在该订阅上的 Receive() API 调用(使用 I/O 完成端口)上具有调用方块,否则我们无法获得有关作业何时被处理的实时通知。

以前有没有人有过实现这种作业系统(实时、低延迟、为调用者提供完成通知)的经验?

谢谢

Windows Azure 上的作业队列设计

实际上,队列不是靠推送的。关于队列的整个想法是接收者不需要实时接收消息,并且希望定期检查消息。如果需要实时通信,可以在接收端创建一个HTTP/TCP监听器,让发送端发出HTTP/TCP请求。

因此,一种方法是使用内部终结点在 Web 角色上创建 Web 服务。使用队列将服务的地址与消息一起发送到辅助角色。作业完成后,辅助角色将调用服务以通知 Web 角色作业已完成。

这种方法很好,但它没有提供太多价值。它无法在UI上显示某些内容(除非您实现Web套接字),因为服务器无法通知浏览器。因此,如果您想在浏览器客户端中显示通知,我想建议您使用拉取解决方案(除非您实现 Web 套接字)。如果使用的是胖客户端,则可以在客户端计算机上托管 Web 服务,并让辅助角色通过调用服务来通知客户端。

此致敬意

徐明.