我正在阅读MQlight的工人卸载模式教程。这适合我正在开发的解决方案。
https://developer.ibm.com/messaging/mq-light/docs/worker-offload-tutorial/
在本教程中,Exmple2知道一些过程已经完成。示例2向MQlight发送消息。然后这些工作进程处理DB查询,并更新SNS。但是,这些处理结果不会通知给web客户端。
我想知道在Bluemix MQLight服务(该服务对Web客户端不可见)的情况下,有什么可能的解决方案。我想利用socket.io(或简单的websocket)来处理完整消息。但这种解决方案在工作进程之间共享web客户端信息方面存在问题。如果您能分享一些处理完整消息通知到web客户端的最佳实践,我将不胜感激。
谢谢!
在那篇博客文章中,假设响应通过一些带外机制返回给用户,例如给客户的电子邮件,告诉他们他们的工作已经完成。
MQ Light的请求/回复目前仅限于为每个请求/回复流使用唯一的订阅主题模式。这可以通过在请求消息中添加一个唯一的标识符作为属性,创建对包含该标识符的主题模式的(可能是持久的)订阅,并让工作进程向同一主题字符串发送回复来实现。MQ Light目前不提供通过相关性ID等属性进行的消息选择。
回到您关于对网页进行请求/回复的问题,这实际上不是一个特定于MQ Light的问题。通常,您不希望让servlet线程等待处理请求的应用程序的同步响应。毕竟,应用程序可能正在处理许多其他请求,甚至在应用维护时暂时关闭。因此,我们倾向于先讨论同步请求,然后再讨论带外回复。
您可以实现一个将响应发送回浏览器而不是电子邮件/SMS的系统。然而,您可能想做的是从浏览器提交请求,在请求发送后立即返回,然后进行后续AJAX后台请求,定期检查持久订阅的响应。例如:
- 当用户提交HTTP web请求时,首先创建一个持久的MQ Light订阅(以确保响应在请求后立即发送回来时不会丢失),其中包含该请求唯一的标识符的主题字符串
- 然后发布包含请求的MQ Light消息,消息属性包含相同的标识符。然后向浏览器返回HTTP响应
- 让AJAX HTTP调用周期性地向另一个servlet发出请求,该servlet又恢复持久订阅,等待一小段时间的响应消息,并在AJAX HTTP响应中返回消息的内容(如果有)
虽然以上理论上可行,但它的扩展性并不是特别好,您最好将步骤3替换为对数据库的AJAX HTTP调用,MQLight工作进程会在作业完成时更新该数据库。这一比例要好得多。