订阅中的延迟队列

https://blueprints.launchpad.net/zaqar/+spec/lazy-queues-in-subscriptions

在与订阅的操作中使队列延迟,以便用户可以订阅尚未存在的队列。

问题描述

在 Zaqar 的 API v1.1 和消息传递中的 API v2 中,队列被设计为延迟资源。这意味着,例如,用户可以将消息发布到不存在的队列,并且队列将自动创建。但现在,队列在与订阅的操作中表现得不像延迟资源。在创建订阅之前,用户必须确保队列存在,否则 Zaqar 将发送带有 HTTP 代码 400 的错误响应。

提议的变更

在与订阅的操作中使队列延迟,以便用户可以订阅尚未存在的队列。使 Zaqar 在队列不存在的情况下,不在队列创建操作时发送错误响应。

优点

  1. API 的行为将更加一致,因为更改后队列在所有情况下都将是延迟的。

  2. 用户将更容易地使用订阅。无需预先检查队列是否存在,或处理来自 Zaqar 的 400 错误响应,或始终预先创建队列。

  3. 将不再需要解决当前存在的问题,即队列已被删除,但对其订阅仍然存在。解决该问题可能需要存储驱动程序代码在删除队列时也删除所有订阅。这对于用户来说可能非常不受欢迎,因为订阅不能保证在 TTL 到期之前存在,并且还需要在队列删除和队列创建操作后进行更新。正确解决此问题将以多种方式使 Zaqar 和客户端代码中的行为变得复杂。这可能是一个向后不兼容的更改。

该更改是向后兼容的。客户端代码在更改后应能正常工作。

缺点

备选方案

两种替代方案

  1. 保持当前行为。

  2. 有人认为应该像在 API v1 中那样,使队列在所有情况下都变为非延迟资源。但这将是对我们的 API v1.1 和 API v2 的向后不兼容更改,因此也许可以在遥远的将来进行更改。

两者都需要解决关于仍然活动订阅到已删除队列的问题。

实现

负责人

主要负责人

ubershy

里程碑

完成目标里程碑

Newton-1

工作项

  1. 从存储驱动程序中删除对订阅操作中队列存在的检查。

  2. 从传输驱动程序中删除捕获在订阅操作中 QueueDoesNotExist 异常的代码。

  3. 相应地更改功能和单元测试。

依赖项

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode