在什么条件下,人们会喜欢应用程序通过消息队列而不是通过 Web 服务进行通信(我只是指 XML 或 JSON 或 YAML 或此处通过 HTTP 进行的任何内容,而不是任何特定类型)?
我必须在本地网络上的两个应用程序之间进行通信。一个是网络应用程序,必须在另一个应用程序(在不同的硬件上运行)上请求命令。这些请求包括创建用户、移动文件和创建目录等。在什么情况下我会更喜欢 XML Web 服务(或直接 TCP 等)而不是使用消息队列?
网络应用程序是 Ruby on Rails,但我认为问题比这更广泛。
最佳答案
当您使用网络服务时,您有一个客户端和一个服务器:
- 如果服务器出现故障,客户端必须负责处理错误。
- 当服务器再次工作时,客户端负责重新发送它。
- 如果服务器对调用做出响应并且客户端失败,则操作将丢失。
- 您不会出现争用,即:如果一秒钟内有数百万个客户端调用一台服务器上的网络服务,您的服务器很可能会崩溃。
- 您可以期待服务器立即响应,但您也可以处理异步调用。
当您使用 RabbitMQ、Beanstalkd、ActiveMQ、IBM MQ Series、Tuxedo 等消息队列时,您期望获得不同且容错性更强的结果:
- 如果服务器出现故障,队列会保留该消息(可选,即使机器关闭)。
- 当服务器再次工作时,它会收到待处理的消息。
- 如果服务器对调用做出响应并且客户端失败,并且客户端未确认响应,则消息将保留。
- 您有争用,您可以决定服务器处理多少个请求(改为称为“worker”)。
- 您不需要立即同步响应,但可以实现/模拟同步调用。
消息队列有更多的功能,但这是一些经验法则,可以决定您是要自己处理错误情况还是将它们留给消息队列。
关于web-services - 消息队列与 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383912/