Web services 消息队列与Web服务?

Web services 消息队列与Web服务?,web-services,message-queue,Web Services,Message Queue,在什么情况下,人们会喜欢通过消息队列而不是通过web服务(我这里指的是XML、JSON、YAML或HTTP上的任何东西,而不是任何特定类型)进行通信 我必须在本地网络上的两个应用程序之间进行通话。其中一个是web应用程序,必须在另一个应用程序(在不同硬件上运行)上请求命令。这些请求包括创建用户、移动文件和创建目录。在什么情况下,我更喜欢XML Web服务(或纯TCP或其他什么)而不是使用消息队列 web应用程序是Ruby on Rails,但我认为问题远不止于此。消息队列是异步的,如果传递失败,

在什么情况下,人们会喜欢通过消息队列而不是通过web服务(我这里指的是XML、JSON、YAML或HTTP上的任何东西,而不是任何特定类型)进行通信

我必须在本地网络上的两个应用程序之间进行通话。其中一个是web应用程序,必须在另一个应用程序(在不同硬件上运行)上请求命令。这些请求包括创建用户、移动文件和创建目录。在什么情况下,我更喜欢XML Web服务(或纯TCP或其他什么)而不是使用消息队列


web应用程序是Ruby on Rails,但我认为问题远不止于此。

消息队列是异步的,如果传递失败,可以重试多次。如果请求者不需要等待响应,则使用消息队列


短语“web服务”让我想到了通过HTTP对分布式组件的同步调用。如果请求者需要回复,请使用web服务。

我认为,通常情况下,您需要一个用于阻塞任务的web服务(此任务需要在执行更多代码之前完成),以及一个用于非阻塞任务的消息队列(可能需要很长时间,但我们不需要等待).

消息队列非常适合处理可能需要很长时间的请求。请求排队,可以脱机处理而不阻塞客户端。如果需要通知客户端完成,您可以为客户端提供一种定期检查请求状态的方法

消息队列还允许您更好地跨时间扩展。它提高了您处理突发性繁重活动的能力,因为实际处理过程可以跨时间分布


请注意,消息队列和web服务是正交概念,即它们不是相互排斥的。例如,您可以使用一个基于XML的web服务作为消息队列的接口。我认为您要寻找的区别是消息队列与请求/响应,后者是同步处理请求时的区别。

使用web服务时,您有一个客户端和一个服务器:

  • 如果服务器出现故障,客户端必须负责处理错误
  • 当服务器重新工作时,客户端负责重新发送
  • 如果服务器响应调用,而客户端失败,则操作将丢失
  • 您不存在争用,也就是说:如果数百万客户机在一秒钟内调用一台服务器上的web服务,您的服务器很可能会停机
  • 您可以期望服务器立即响应,但也可以处理异步调用
  • 当您使用RabbitMQ、Beanstalkd、ActiveMQ、IBM MQ Series、Tuxe等消息队列时,您是否希望得到不同的、更容错的结果:

  • 如果服务器出现故障,队列将保留消息(可选,即使计算机关闭)
  • 当服务器再次工作时,它会收到挂起的消息
  • 如果服务器对调用做出响应,而客户端失败,如果客户端未确认响应,则消息将被保留
  • 如果存在争用,则可以决定服务器处理多少请求(改为称之为worker)
  • 您不希望立即得到同步响应,但可以实现/模拟同步调用

  • 消息队列具有更多的功能,但这是一些经验法则,可以决定是自己处理错误条件,还是将错误条件留给消息队列处理。

    最近有大量研究考虑REST HTTP调用如何取代消息队列概念

    如果引入流程和任务作为资源的概念,则对中间消息传递层的需求开始消失

    例:

    任务可以有多个初始化步骤,进程可以在轮询时返回状态,也可以在完成后发布到回调URL

    这非常简单,当您意识到现在可以订阅所有正在运行的进程和任务的rss/atom提要而无需任何中间层时,它就变得非常强大。不管怎样,任何排队系统都需要某种web前端,这个概念内置了它,而不需要另一层自定义代码

    您的资源在删除之前一直存在,这意味着您可以在流程和任务完成后很久查看历史信息

    您已经内置了服务发现,即使是对于具有多个步骤的任务,也没有任何额外复杂的协议

    GET /task/name
        - returns form with required fields
    
    POST (URL provided form's "action" attribute)
    
    您的服务发现是一种HTML表单—一种通用的、人类可读的格式

    整个流程可以通过编程方式使用,也可以由人使用普遍接受的工具使用。它是客户端驱动的,因此是RESTful的。为web创建的每个工具都可以驱动您的业务流程。通过异步发布到单独的日志服务器阵列,您仍然可以使用备用消息通道

    你考虑了一会儿之后,你坐了下来,开始意识到休息可能只会消除对消息队列和ESB的需求。


    谢谢,是的,“保证交货”,我得考虑一下这是否重要。我的意思是,从某种意义上说,同步与异步是一种品味。虽然有明显的黑白案例,但也有一个巨大的灰色中间。是的,我只是在想:这不是他们是阻塞还是非阻塞。这是他们是否需要更长和/或不可预测的时间来处理。。。考虑到它们是正交的,web服务也可以用于长请求(当然是分开的发送和接收)。但是,如果您有一个消息队列,这可能是一个好主意。我的新问题是,如果希望进程是同步的,但在超时时是异步的,该怎么办?那么,也许web服务会更合适。@tempire容错等等呢?REST很好,但开发人员最终构建了中间件/herself@Yar多数曲
    GET /task/name
        - returns form with required fields
    
    POST (URL provided form's "action" attribute)