This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode

在 PUT/POST/DELETE 请求上发送通知

Swift 应该能够在新对象上传、元数据更改或数据删除时发送通知。

问题描述

目前,除了列出容器的内容并比较时间戳外,没有办法检测容器中的更改。如果存储了大量对象,这会变得困难且缓慢,而且效率非常低。某些外部服务可能对对象上传、更新或删除时感兴趣;例如,为了在外部数据库中存储元数据以进行搜索,或者触发特定事件,如对对象数据进行计算。

提议的变更

应该添加一个新的中间件,可以配置在代理服务器管道内运行。

备选方案

另一种选择可能是分析日志文件并解析它们,将数据聚合为每个帐户的通知,并将更新批量发送到外部服务。然而,性能很可能更差,因为涉及大量的字符串解析,并且可能需要中央日志服务才能按顺序发送通知。

实现

发送通知应该在对象修改时发生。这意味着每次成功的对象更改(PUT、POST、DELETE)都应该触发一个动作并发送一个事件通知。应该能够在帐户或容器级别配置是否发送通知;这取决于用户决定它们最终去向何处以及是否可以接受可能的性能影响。应该将实现作为 Swift 代理中的一个额外的中间件开发,并利用 OpenStack 中现有的队列实现,即 Zaqar (https://wiki.openstack.org/wiki/Zaqar)。需要讨论是否应该在通知中包含与对象一起存储的元数据;如果元数据很多,通知会变得非常大。一种可能的权衡是包含元数据的阈值,例如仅包含前 X 字节。或者根本不发送任何元数据,而仅发送帐户/容器/对象名称。

负责人

主要负责人
cschwede

工作项

开发 Swift 代理服务器的中间件,包括功能测试。

更新 Swift 功能测试虚拟机,以包含 Zaqar 服务进行测试。

仓库

服务器

功能测试需要运行 Zaqar 服务在测试虚拟机上,或者一个充当 Zaqar 队列的虚拟实现。

DNS 条目

文档

添加新中间件的文档

安全性

通知应该仅在每个容器上启用或禁用,并且接收服务器应该仅在中间件配置设置中设置。这可以防止用户将事件转发到运营商不知情的外部侧。

启用或禁用应该仅限于帐户所有者。

发送的通知包括帐户/容器/对象名称,因此流量应该通过私有网络或 SSL 加密传输。

测试

应在补丁中包含单元测试和功能测试。

依赖项