将MQ Light流程的通知完成到Web浏览器的最佳做法是什么?

时间:2015-11-05 02:23:08

标签: messaging ibm-cloud mq

我正在阅读MQlight工作者卸载模式的教程。这适用于我正在开发的解决方案。

https://developer.ibm.com/messaging/mq-light/docs/worker-offload-tutorial/

在本教程中,Exmple2知道某些进程已经完成。 Example2向MQlight发送消息。然后这些工作进程处理数据库查询,并更新SNS。但是,这些处理结果不会通知Web客户端。

我想知道Bluemix MQLight服务的可能解决方案是什么(此服务对Web客户端不可见)。我正在考虑使用socket.io(或简单的websocket)来处理流程完成消息。但是此解决方案在工作进程之间共享Web客户端信息时存在问题。如果您能够将一些流程完整消息通知的最佳实践分享给Web客户端,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

在该博客文章中,假设响应通过一些带外机制返回给用户 - 例如,向客户发送电子邮件,告诉他们他们的工作已完成。

MQ Light的请求/回复目前仅限于为每个请求/回复流使用唯一的订阅主题模式。这可以通过在请求消息中添加唯一标识符作为属性,创建对包含标识符的主题模式的(可能是持久的)订阅,并让工作进程将其回复发送到相同的主题字符串。 MQ Light当前不会通过相关ID等属性提供消息选择。

回到关于对网页进行请求/回复的问题,这不是一个特定于MQ Light的问题。通常,您不希望等待来自处理请求的应用程序的同步响应的servlet线程。在应用了维护之后,所有应用程序都可以处理许多其他请求,甚至暂时关闭。因此,为什么我们倾向于谈论同步请求,然后是带外答复。

可以实施一个系统,将响应发送回浏览器而不是电子邮件/短信。然而,您可能想要做的是从浏览器提交请求,在请求发送后立即返回,然后发出后续AJAX后台请求以定期检查持久订阅的响应。例如:

  1. 当用户提交HTTP Web请求时,首先创建一个持久的MQ Light订阅(以确保在请求之后立即发回的响应不会丢失)主题字符串包含此请求的唯一标识符
  2. 然后发布包含请求的MQ Light消息,其message属性包含相同的标识符。然后将HTTP响应返回给浏览器。
  3. 让AJAX HTTP调用定期向另一个servlet发出请求,这个servlet又恢复持久订阅,等待响应消息的短暂时间,并在AJAX HTTP响应中返回消息的内容(如果有的话)
  4. 虽然上述理论上可行,但它并不能很好地扩展,你可能最好用AJAX HTTP调用替换步骤3,以便在作业完成时MQ Light工作进程更新。这样可以更好地扩展。