4

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

要求:

  1. 能够将作业推送到队列中。
  2. N 个 worker 可以从队列中消费 Job 并处理它们。
  3. 作业的调用者应该能够被提醒(推送,而不是轮询)作业正在完成。

迄今为止的研究:

  1. 使用Azure 服务总线队列( http://blogs.msdn.com/b/appfabric/archive/2011/05/17/an-introduction-to-service-bus-queues.aspx )创建一个“作业”队列
  2. Web 前端将作业推送到队列中,工作人员在 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/)并让调用者“订阅”但是,“作业完成通知”主题:
    • 您显然不能多次订阅同一个主题,除非您创建多个“订阅”条目(不可扩展)
    • 除非我们确实为每个 Job Id 创建了一个“订阅”,并且在该订阅上的 Receive() API 调用(使用 I/O 完成端口)上有调用者阻塞,否则我们无法获得关于 Job 何时具有的实时通知被处理。

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

谢谢

4

1 回答 1

2

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

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

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

此致,

明旭。

于 2012-06-18T12:12:46.410 回答