Neutron/LBaaS/Architecture/ConcurrentRequests
< Neutron | LBaaS | 架构(重定向自 Quantum/LBaaS/架构/并发请求)
并发 REST API 请求
有两种类型的锁
- 对象级别锁作用于一个实例(VIP、池、成员),并限制并发修改。通过将对象移动到 PENDING_* 状态之一来实现锁定。
- 设备级别锁用于锁定整个配置,禁止并发修改。由于这是一个限制性策略,请求实际上被放入队列,然后由驱动程序逐一处理。队列可以完全用 Python 代码实现,也可以是外部 MQ。
下图显示了 2 个并发更新请求,'alt' 块显示了请求的处理替代方案。
- 用户向 Quantum 发送 REST API 请求,它被路由到相应的扩展和插件。
- 插件执行请求验证(模式一致性、值和引用检查等)。如果验证成功,则返回 HTTP 202,否则返回 40x 代码之一(取决于原因)。
- DB 对象被更新,对象移动到 PENDING_UPDATE 状态。请求被转换为任务并推入队列。与对象对应的设备被锁定。
- Worker 扫描队列并选择任何已解锁设备的任务。任务被传输到 Agent
- Agent 在 Driver 的帮助下更改 LB 设备的配置。
- 如果其他用户请求到达插件,则以通常方式处理,除了拒绝更新 PENDING_UPDATE 状态的对象之外。如果请求成功,插件将其推入队列。如果请求是针对锁定的设备,则它将保持在队列中,直到设备解锁。
- 一旦 Agent 完成工作,它就会将状态回复给插件。DB 被更新,对象移动到 ACTIVE 或 ERROR 状态。设备被解锁。
图表来源: http://goo.gl/obo1T