跳转到: 导航, 搜索

Neutron/LBaaS/Architecture/ConcurrentRequests

并发 REST API 请求

有两种类型的锁

  • 对象级别锁作用于一个实例(VIP、池、成员),并限制并发修改。通过将对象移动到 PENDING_* 状态之一来实现锁定。
  • 设备级别锁用于锁定整个配置,禁止并发修改。由于这是一个限制性策略,请求实际上被放入队列,然后由驱动程序逐一处理。队列可以完全用 Python 代码实现,也可以是外部 MQ。

下图显示了 2 个并发更新请求,'alt' 块显示了请求的处理替代方案。

模板:Http://goo.gl/BRUP8

  1. 用户向 Quantum 发送 REST API 请求,它被路由到相应的扩展和插件。
  2. 插件执行请求验证(模式一致性、值和引用检查等)。如果验证成功,则返回 HTTP 202,否则返回 40x 代码之一(取决于原因)。
  3. DB 对象被更新,对象移动到 PENDING_UPDATE 状态。请求被转换为任务并推入队列。与对象对应的设备被锁定。
  4. Worker 扫描队列并选择任何已解锁设备的任务。任务被传输到 Agent
  5. Agent 在 Driver 的帮助下更改 LB 设备的配置。
  6. 如果其他用户请求到达插件,则以通常方式处理,除了拒绝更新 PENDING_UPDATE 状态的对象之外。如果请求成功,插件将其推入队列。如果请求是针对锁定的设备,则它将保持在队列中,直到设备解锁。
  7. 一旦 Agent 完成工作,它就会将状态回复给插件。DB 被更新,对象移动到 ACTIVE 或 ERROR 状态。设备被解锁。

图表来源: http://goo.gl/obo1T