为什么队列涉及 API 设计

why Queues involves API design

我看到有人在写restful api的时候,把controller层和Database access层分开,让他们通过队列(比如ActiveMQ)相互通信。这是为什么?这种设计是否提高了吞吐量? 或者这样做有什么好处?谢谢

工程师可能采用 REST 服务将内容发布到 JMS queue 的体系结构的一个原因是为了避免 REST 客户端等待长时间的 运行 操作。相反,客户端提交数据进行处理(比如将数据保存到数据库),并得到一个快速响应,表明该信息已被接受以供将来处理。

例如可以使用 POST 上传大文件:

curl -X POST -H "Content-Type: application/json" -d @myFile.json localhost:8080/upload

REST 服务可以将内容放到 JMS queue 上,然后立即 return HTTP 状态代码 202 让客户端知道消息已被接受。它还可以提供信息以通过 Location header 检索已处理的数据。

Location: 2112

如果服务由于某种原因无法接受数据,则需要 return 一个错误代码。

REST API 可以允许稍后通过 GET 方法检索已处理的资源:

curl localhost:8080/processed/item/2112

如果项目未就绪,服务可以 return 状态 202(已接受)。稍后当它准备就绪时,服务可以 return 状态 200(正常)以及数据。

更新:如下所述,如果您所做的唯一事情是使用 REST 调用中收到的信息更新数据库中的数据,那么这不是 recommended/useful。我更广泛地回答了这个问题,并假设在持久化数据之前需要进行其他处理。

我想不出一个正确设计(从头开始)的架构,其中所描述的内容是有意义的。数据库和队列服务于相同的通用目的(存储),但数据库用于长期存储和检索,而队列用于短期缓冲。

当可用处理能力与客户端请求之间存在短期不匹配时,您将事情放入队列中。将对微服务的请求排队是非常有意义的。此外,大多数 Web 服务器都有一个内置的请求队列。

简单地排队数据库操作意味着您的数据库无法满足您的吞吐量需求。这是队列无法解决的永久性问题。请求应直接访问数据库,Web 服务代码应直接调用 DAL 方法。数据库操作的任何排队最好留给数据库引擎本身。