最佳答案
我们正在实现一个 REST API,它将启动多个长时间运行的后端任务。我一直在阅读 RESTful Web Services Cookbook,建议返回 HTTP 202/Accepted,其中 Content-Location 头部指向正在处理的任务。(例如 http://www.example.org/orders/tasks/1234) ,并让客户端轮询这个 URI 以获得长时间运行任务的更新。
其思想是让 REST API 立即将消息发布到队列中,后台工作者角色从队列中接收消息并旋转多个后端任务(也使用队列)。我在这种方法中看到的问题是如何为任务分配一个唯一的 ID,然后让客户机通过向 Content-Location URI 发出 GET 来请求任务的状态。
如果 REST API 立即发送到一个队列,那么它可以生成一个 GUID,并将其作为添加到队列中的消息的属性附加到队列中,但是获取请求的状态变得非常困难。
另一种选择是让 REST API 立即向数据库添加一个条目(比方说一个订单,带有一个新的订单 id) ,带有一个初始状态,然后在队列中放入一条消息,启动后台任务,后台任务随后更新该数据库记录。API 将在 Content-Location 头的 URI 中返回这个新的订单 ID,供客户机在检查任务状态时使用。
以某种方式首先添加数据库条目,然后将消息添加到队列似乎是向后的,但是只将请求添加到队列会使跟踪进度变得困难。
建议的方法是什么?
非常感谢你的洞察力。