web-services - 消息队列与 Web 服务?

标签 web-services message-queue

在什么条件下,人们会喜欢应用程序通过消息队列而不是通过 Web 服务进行通信(我只是指 XML 或 JSON 或 YAML 或此处通过 HTTP 进行的任何内容,而不是任何特定类型)?

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

网络应用程序是 Ruby on Rails,但我认为问题比这更广泛。

最佳答案

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

  1. 如果服务器出现故障,客户端必须负责处理错误。
  2. 当服务器再次工作时,客户端负责重新发送它。
  3. 如果服务器对调用做出响应并且客户端失败,则操作将丢失。
  4. 您不会出现争用,即:如果一秒钟内有数百万个客户端调用一台服务器上的网络服务,您的服务器很可能会崩溃。
  5. 您可以期待服务器立即响应,但您也可以处理异步调用。

当您使用 RabbitMQ、Beanstalkd、ActiveMQ、IBM MQ Series、Tuxedo 等消息队列时,您期望获得不同且容错性更强的结果:

  1. 如果服务器出现故障,队列会保留该消息(可选,即使机器关闭)。
  2. 当服务器再次工作时,它会收到待处理的消息。
  3. 如果服务器对调用做出响应并且客户端失败,并且客户端未确认响应,则消息将保留。
  4. 您有争用,您可以决定服务器处理多少个请求(改为称为“worker”)。
  5. 您不需要立即同步响应,但可以实现/模拟同步调用。

消息队列有更多的功能,但这是一些经验法则,可以决定您是要自己处理错误情况还是将它们留给消息队列。

关于web-services - 消息队列与 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383912/

相关文章:

c# - 在 Powershell 中创建一个 ScheduleDefinition 对象

WCF:如何在没有 WSDL:import 的情况下生成单个 WSDL 文档?

java - 如何在等待 Web 服务响应时显示 "loading..."消息

c++ - 如果 PUB 首先启动并连接到 XPUB/XSUB 代理,消息将被丢弃,直到 SUB 未连接

java - 用于队列和工作线程设计的实时执行器池

c# - 需要 ASP.NET Web 服务的安全方案

azure - Azure 服务总线上的负队列大小

redis - 消费者返回生产者的消息完成结果

java - 具有优先级的消息处理

java - 如何自定义响应错误 400 错误请求