引入通知主题资源

https://blueprints.launchpad.net/zaqar/+spec/introduce-topic-resource-for-notification

我们希望在 Zaqar 中引入一个新的资源,称为主题(Topic)。主题是 AWS Simple Notification Service (SNS) 中的一个概念,它将与订阅相关联。用户可以将消息发送到主题,然后订阅者将根据不同的协议(如 http、email、sms 等)接收消息。

问题描述

目前 Zaqar 基本上集成了两种类型的服务:消息队列服务和通知服务。我们基于队列创建订阅,并为订阅和队列引入重试策略。从服务角度来看,这不太清晰,特别是对于那些已经习惯于 AWS 中的 SNS 和 SQS 的用户。

因此,在 Rocky 版本中,我们希望在 Zaqar 中引入主题资源,并清晰地划分消息队列服务和通知服务。

AWS SNS 服务拥有名为主题的资源,这对于 Zaqar 来说是一个很好的参考[1]。

提议的变更

为了实现主题资源,一个想法是将主题定义为具有一些特殊功能的特殊队列,这些功能与普通队列不同。

  1. 可以设置允许向此主题发送主题消息的用户或项目

  2. 可以设置允许订阅此主题的用户或项目。

  3. 消息将存储在主题中,但这些消息无法被声明,因为它们仅用于发送给订阅者。发送成功后,Zaqar 将从主题中删除此消息,否则将重试发送过程。

除了这些功能外,用户还可以为主题和订阅设置重试策略。

在将主题引入 Zaqar 后,我们将保留普通队列的订阅一段时间,但我们也希望改变用户的行为,如果他们想在 Zaqar 中订阅某些内容,则使用主题。因此,未来我们可能会删除普通队列的订阅。

API 影响

  1. 主题创建

    PUT: /v2/topics/{topic_name}
    BODY:
    {
       "_allowed_sending_users": <List of user id, optional>,
       "_allowed_sending_projects": <List of project id, optional>,
       "_allowed_subscribe_users": <List of user id, optional>,
       "_allowed_subscribe_projects": <List of project id, optional>,
       "_allowed_subscribe_protocols": <List of string, optional>,
       "_retry_policy": <Dict, optional>
    }
    RESPONSE CODES: 201, 204
    ERROR RESPONSE CODES:
    * BadRequest (400)
    * Unauthorized (401)
    * ServiceUnavailable (503)
    

注意

“_allowed_sending_users”:定义允许向主题发送消息的用户。“_allowed_sending_projects”:定义允许向主题发送消息的项目。当然,你也可以在这里设置拥有此主题的项目。“_allowed_subscribe_users”:定义允许订阅主题的用户。“_allowed_subscribe_projects”:定义允许订阅主题的项目。默认行为是允许创建此主题的项目下的所有用户发送消息,并且所有项目都可以订阅此主题。默认订阅协议为 email、webhook 和 trust。重试策略与队列的重试策略相同。

  1. 主题更新

    PATCH: /v2/topics/{topic_name}
    BODY:
    [
       {
          "op": "replace",
          "path": "/metadata/allowed_sending_projects",
          "value": [pro_id1, pro_id2, ... ,pro_idN]
       }
    ]
    RESPONSE CODE: 200
    ERROR RESPONSE CODES:
    * BadRequest (400)
    * Unauthorized (401)
    * Not Found (404)
    * Conflict (409)
    * ServiceUnavailable (503)
    
  2. 主题查询列表

    GET: /v2/topics
    RESPONSE BODY:
    {
       "topics": [
                    {
                       "topic_name": xxx,
                       "href": xxx
                    }
                 ],
       "links": [
                   {
                       "href": '/v2/topic?marker=wellington',
                       "rel": "next"
                   }
                ]
    }
    RESPONSE CODE: 200
    ERROR RESPONSE CODES:
    * BadRequest (400)
    * Unauthorized (401)
    * ServiceUnavailable (503)
    
  3. 主题查询详情

    GET: /v2/topics/{topic_name}
    RESPONSE BODY:
    {
       "_allowed_sending_users": [user_id1, ... ,user_idN],
       "_allowed_sending_projects": [pro_id1, ... ,pro_idN],
       "_allowed_subscribe_users": [user_id1, ... ,user_idN],
       "_allowed_subscribe_projects": [pro_id1, ... ,pro_idN],
       "_allowed_subscribe_protocols": [email, webhook, trust],
       "_retry_policy": {}
    }
    RESPONSE CODE: 200
    ERROR RESPONSE CODES:
    * BadRequest (400)
    * Unauthorized (401)
    * ServiceUnavailable (503)
    
  4. 主题删除

    DELETE: /v2/topics/{topic_name}
    RESPONSE CODE: 204
    ERROR RESPONSE CODES:
    * BadRequest (400)
    * Unauthorized (401)
    * ServiceUnavailable (503)
    

缺点

N/A

备选方案

N/A

实现

负责人

主要负责人

wanghao (sxmatch1986@gmail.com)

里程碑

R-3

工作项

  • 实现主题 API。

  • 实现 CRUD 过程。

  • 此功能的 UTs。

  • DOC 支持。

依赖项

[1]: http://docs.aws.amazon.com/sns/latest/dg/welcome.html