引入通知主题资源¶
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]。
提议的变更¶
为了实现主题资源,一个想法是将主题定义为具有一些特殊功能的特殊队列,这些功能与普通队列不同。
可以设置允许向此主题发送主题消息的用户或项目
可以设置允许订阅此主题的用户或项目。
消息将存储在主题中,但这些消息无法被声明,因为它们仅用于发送给订阅者。发送成功后,Zaqar 将从主题中删除此消息,否则将重试发送过程。
除了这些功能外,用户还可以为主题和订阅设置重试策略。
在将主题引入 Zaqar 后,我们将保留普通队列的订阅一段时间,但我们也希望改变用户的行为,如果他们想在 Zaqar 中订阅某些内容,则使用主题。因此,未来我们可能会删除普通队列的订阅。
API 影响¶
主题创建
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。重试策略与队列的重试策略相同。
主题更新
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)
主题查询列表
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)
主题查询详情
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)
主题删除
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 支持。