华为云SMN消息通知实操:从主题订阅到短信邮件HTTP推送与云服务事件联动
一、为什么需要一个消息通知服务
在云上跑业务,系统里总会有大量"事件"需要被人或其他系统感知:对象存储里有新文件上传、云监控指标触发告警、弹性伸缩组扩容了实例、CI/CD 流水线构建失败、订单服务产生了一条待审核数据……如果每个业务模块都自己实现一套发短信、发邮件、调 Webhook 的逻辑,不仅重复造轮子,还要各自维护收件人列表、处理发送失败重试和通道限流,耦合度高且难以统一管理。
消息通知服务(Simple Message Notification,SMN)就是为解决这个问题而生的。它采用典型的发布—订阅(Pub/Sub)模型:消息发布者只需要把消息发到一个"主题(Topic)",所有订阅了该主题的终端都会自动收到推送,发布者完全不需要关心订阅者是谁、用什么协议接收。本文从核心概念出发,一步步带你完成主题创建、多协议订阅、消息发布、模板化推送,以及与 OBS、FunctionGraph、云监控等服务的事件联动。
二、核心概念先理清
- 主题 Topic:消息发布的逻辑通道,也是访问控制和计费的基本单位。每个主题有唯一的资源标识(URN),形如
urn:smn:cn-north-4:7c52f30337324e799e64622237e0515f:order-alert。 - 订阅 Subscription:某个终端对某个主题的订阅关系,需要指定协议(protocol)和终端地址(endpoint)。邮件、HTTP 等协议需要终端主动确认后才生效。
- 发布 Publish:向主题发送一条消息,SMN 会把消息扇出(fan-out)给该主题下所有已确认的订阅。
- 消息模板 Message Template:带占位变量的可复用内容,配合不同协议的模板,可一次生成多端适配的内容。
- 消息结构:支持纯文本消息,也支持按协议分别定制的结构化消息(同一事件给邮件发 HTML、给短信发精简文本、给 HTTP 发 JSON)。
支持的订阅协议主要包括:邮件(email)、短信(sms)、HTTP/HTTPS(Webhook)、函数工作流(FunctionGraph)、消息队列(DMS)、应用推送(application)以及 Lambda 等。
二、实操一:创建主题
登录华为云控制台,进入"消息通知服务 SMN",在左侧选择主题管理,点击"创建主题"。
- 主题名称:填写
order-alert,用于订单告警;显示名可填"订单告警通知",该名称会出现在邮件标题前缀中。 - 企业项目:保持默认即可。
- 访问策略可暂时使用默认(仅主题所有者可发布/订阅),后续如需让其他账号或云服务发布,再在"访问策略"里精细化配置。
创建完成后,在主题列表中可以看到主题的主题标识(URN)和唯一的 Topic ID,后续通过 API/CLI 发布消息时要用到 URN。
也可以用 KooCLI 或 OpenAPI 创建,例如:
hcloud smn CreateTopic --name "order-alert" --display_name "订单告警通知"
三、实操二:添加多协议订阅并确认
进入主题详情,在"订阅"页签点击"添加订阅",选择协议并填写终端地址。下面分别演示三种典型协议。
1. 邮件订阅(email)
协议选"邮件",终端填写接收邮箱,例如 ops@example.com。提交后订阅状态先是"未确认",SMN 会向该邮箱发送一封确认订阅邮件,点击邮件中的确认链接(或在有效期内调用确认接口),状态才会变为"已确认"。这一步是为了防止有人未经邮箱所有者同意就把它加进推送列表。
2. 短信订阅(sms)
协议选"短信",终端填写带国家码的手机号,如 +86189xxxx1420。短信签名和模板需要符合短信平台的审核规范,正式发送前要确保已申请通过的签名。
3. HTTP/HTTPS 订阅(Webhook)
协议选 HTTP 或 HTTPS,终端填写你自己服务的回调 URL,例如 https://api.example.com/hooks/smn。和邮件一样,首次订阅 SMN 会向该 URL POST 一个带 token 的订阅确认请求,你的服务需要在响应中回传确认信息(或在控制台/接口侧完成确认),之后该地址才会收到正式消息。
确认机制带来一个工程上的注意点:Webhook 服务必须先于订阅上线并能正确处理订阅确认事件,否则订阅会一直停留在未确认状态。建议在回调里通过消息头中的消息类型字段区分"订阅确认""通知""取消订阅确认"三类请求分别处理。
四、实操三:向主题发布消息
订阅确认后,就可以发布消息了。在主题详情页点击"发布消息"。
1. 纯文本消息
消息标题填写"新订单待审核",消息类型选"文本消息",消息内容填写:
您有一条新的订单待审核,订单号:NO20261110001,金额:1299.00 元,请及时处理。
点击确定后,所有已确认订阅会同时收到:邮箱收到带主题显示名前缀的邮件,HTTP 终端收到一条 POST 通知。
2. 按协议定制的结构化消息
同一个事件往往需要在不同终端呈现不同内容:短信要短、邮件可以排版、Webhook 要结构化数据。这时消息类型选择"JSON",在结构化消息中按协议分别给出内容,例如:
{
"default": "您有新订单待审核",
"sms": "新订单NO20261110001待审核",
"email": "<h3>新订单提醒</h3><p>订单号 NO20261110001,金额 1299.00 元</p>",
"http": "{\"order_id\":\"NO20261110001\",\"amount\":1299.00,\"status\":\"pending\"}"
}
没有单独配置的协议会回退使用 default 内容,因此 default 字段必填。
3. 用 API 发布
业务系统集成时通常直接调用发布接口,下面是一个用 KooCLI 的示例:
hcloud smn Publish --topic_urn "urn:smn:cn-north-4:7c52f30337324e799e64622237e0515f:order-alert" \
--subject "新订单待审核" \
--message "订单 NO20261110001 待审核,请及时处理"
在应用代码里建议结合 IAM 委托或最小权限子账号调用,不要把长期 AK/SK 硬编码进程序,可结合 DEW/KMS 管理密钥。
五、实操四:消息模板与变量批量推送
当通知内容格式固定、只是其中几个字段变化时,用消息模板更便于维护。在"消息模板"中创建模板,选择协议并编写带占位符的内容,例如邮件模板:
您好,订单 ${order_id} 已${action},金额 ${amount} 元,备注:${remark}。
发布时选择"模板消息"并传入变量 JSON:
{"order_id":"NO20261110001","action":"发货","amount":"1299.00","remark":"顺丰包邮"}
SMN 会自动完成变量替换。为不同协议分别建模板后,即可在一次模板发布中让短信、邮件、Webhook 各自拿到符合自身长度和格式要求的内容,避免短信因内容过长被截断、邮件因纯文本而无法排版的问题。
六、实操五:与云服务事件联动(最常用的场景)
SMN 真正的威力在于作为云上事件的"统一出口",很多服务都可以直接把事件投递到主题,无需写一行胶水代码。
1. OBS 对象存储事件通知
在 OBS 桶的"基础配置 → 事件通知"中,配置触发规则(如 ObjectCreated 上传成功、ObjectRemoved 删除),指定前缀/后缀过滤(例如只监听 images/ 目录下的 .jpg),目标选择 SMN 主题并指定一个支持的订阅协议。这样图片一上传,下游的图片处理服务就能通过 FunctionGraph 或 Webhook 自动收到通知并开始处理,实现事件驱动的解耦。
2. FunctionGraph 函数触发器
给主题添加一个 FunctionGraph 协议的订阅(或在函数侧创建 SMN 触发器),每次发布消息,函数就会被自动调用,事件内容作为函数入参传入。典型组合是:OBS 事件 → SMN → FunctionGraph 自动生成缩略图/转码/写库,全程无需常驻服务器,按调用次数计费。
3. 云监控告警通知
在云监控 CES 中创建告警规则,告警通知选择一个或多个 SMN 主题。当 ECS 的 CPU 使用率、RDS 的连接数、ELB 的后端异常等指标越过阈值,告警就会通过主题推送到邮件、短信或值班 Webhook,还可以区分"告警触发"和"告警恢复"两个阶段分别通知。
4. 弹性伸缩 AS 与其他服务
弹性伸缩组可配置在实例扩容、缩容、健康检查异常时向 SMN 主题发通知,让运维侧及时掌握容量变化。此外,数据接入、备份恢复、安全防护等不少服务也都支持把告警或任务结果投递到 SMN,统一收口。
七、可靠性、配额与最佳实践
- 重试与幂等:SMN 对投递失败的通知会按策略重试。Webhook 接收方务必做好幂等处理,建议根据消息 ID 去重,避免重试导致重复下单、重复提醒等副作用。
- 安全:Webhook 优先使用 HTTPS;可在回调中校验 SMN 签名或订阅确认 token,防止伪造请求;主题访问策略遵循最小权限原则,只放开必要的发布者。
- 消息大小与长度:单条消息有大小上限,超大内容不要直接塞进消息体,可把文件放 OBS、消息里只传对象地址,由接收方按需拉取。
- 配额:主题数、每个主题的订阅数、发布速率都有默认配额,突发大批量推送前提前评估,必要时申请提升配额。
- 短信合规:短信签名和模板需审核通过,营销类与通知类内容分开,避免触发拦截影响到达率。
八、常见问题排查
- 订阅一直收不到消息:先确认订阅状态是否为"已确认",未确认的终端不会收到任何正式通知;再检查邮件是否被归入垃圾箱、Webhook 服务是否可公网访问且返回成功状态码。
- Webhook 收到重复请求:这是失败重试机制的正常表现,按消息 ID 做幂等即可。
- 短信没送达:核对手机号国家码、签名模板是否审核通过、内容是否含敏感词,以及短信额度是否充足。
- 结构化消息内容不对:确认 JSON 合法且包含 default 字段,协议名与实际订阅协议一致,否则会回退到 default。
小结
SMN 用发布—订阅模型把"事件产生"和"事件消费"彻底解耦:创建主题、确认订阅、发布消息三步即可跑通一条通知链路;配合消息模板能实现多端适配;与 OBS、FunctionGraph、云监控、AS 等服务联动后,它又成为整个云上事件驱动架构的统一通知总线。掌握好确认机制、幂等处理和最小权限这几个关键点,就能让告警通知、异步处理和系统集成都变得干净而可靠。
- 点赞
- 收藏
- 关注作者
评论(0)