我需要在本地网络上的两个应用程序之间进行通信。其中一个是Web应用程序,必须在另一个应用程序上(运行在不同硬件上)请求命令。这些请求是一些诸如创建用户、移动文件以及创建目录之类的操作。在什么情况下,我会更喜欢使用XML Web服务(或直接TCP或其他协议),而不是使用消息队列呢?
这个Web应用程序是用Ruby on Rails编写的,但我认为这个问题比这个框架更广泛。
最近有相当多的研究考虑如何使用REST HTTP调用来替代消息队列的概念。
如果你将进程和任务作为资源引入,那么中间消息传递层的需求就开始消失了。
例如:
POST /task/name
- Returns a 202 accepted status immediately
- Returns a resource url for the created task: /task/name/X
- Returns a resource url for the started process: /process/Y
GET /process/Y
- Returns status of ongoing process
一个任务可以有多个初始化步骤,进程可以在轮询时返回状态或者在完成时POST到回调URL。
这很简单,当你意识到你现在可以订阅所有运行的进程和任务的rss/atom feed而不需要中间层时,它变得非常强大。任何队列系统都需要一些类型的Web前端,而这个概念已经内置了,不需要另一层自定义代码。
你的资源会一直存在,直到你将它们删除,这意味着你可以在进程和任务完成后长时间查看历史信息。
你内置了服务发现功能,即使是有多个步骤的任务,也不需要任何额外复杂的协议。
GET /task/name
- returns form with required fields
POST (URL provided form's "action" attribute)
您的服务发现是一个HTML表单——一种通用且易于阅读的格式。
整个流程可以通过程序或人工使用普遍接受的工具来完成。它是客户端驱动的,因此符合RESTful原则。为Web创建的每个工具都可以驱动您的业务流程。您仍然可以通过将消息异步地POST到一个单独的日志服务器数组来使用备用消息通道。
在考虑一段时间后,您可以坐下来开始意识到REST可能只需消除消息队列和ESB的需要。
消息队列适用于可能需要很长时间处理的请求。请求被排队并可以在不阻塞客户端的情况下离线处理。如果客户端需要接收完成通知,可以提供一种方式让客户端周期性地检查请求的状态。
消息队列还允许您更好地跨时间进行扩展。它提高了您处理突发大量活动的能力,因为实际处理可以分布在时间上。
请注意,消息队列和Web服务是正交概念,即它们并不互斥。例如,您可以拥有一个基于XML的Web服务,作为消息队列的接口。我认为您要区分的是消息队列与请求/响应,后者是同步处理请求的情况。
消息队列是异步的,如果传递失败会进行多次重试。如果请求者不需要等待响应,请使用消息队列。
"Web服务"这个词让我想到通过HTTP对分布式组件进行同步调用。如果请求者需要收到响应,请使用Web服务。
一般来说,对于需要阻塞代码执行的任务,您会需要使用 Web 服务,而对于不需要等待的可能需要很长时间的任务,则需要使用消息队列。