华为云SMN消息通知实操:从主题订阅到短信邮件HTTP推送与云服务事件联动

举报
yd_244253482 发表于 2026/11/10 07:13:45 2026/11/10
【摘要】 一、为什么需要一个消息通知服务在云上跑业务,系统里总会有大量"事件"需要被人或其他系统感知:对象存储里有新文件上传、云监控指标触发告警、弹性伸缩组扩容了实例、CI/CD 流水线构建失败、订单服务产生了一条待审核数据……如果每个业务模块都自己实现一套发短信、发邮件、调 Webhook 的逻辑,不仅重复造轮子,还要各自维护收件人列表、处理发送失败重试和通道限流,耦合度高且难以统一管理。消息通知服...

一、为什么需要一个消息通知服务

在云上跑业务,系统里总会有大量"事件"需要被人或其他系统感知:对象存储里有新文件上传、云监控指标触发告警、弹性伸缩组扩容了实例、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",在左侧选择主题管理,点击"创建主题"。

  1. 主题名称:填写 order-alert,用于订单告警;显示名可填"订单告警通知",该名称会出现在邮件标题前缀中。
  2. 企业项目:保持默认即可。
  3. 访问策略可暂时使用默认(仅主题所有者可发布/订阅),后续如需让其他账号或云服务发布,再在"访问策略"里精细化配置。

创建完成后,在主题列表中可以看到主题的主题标识(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 等服务联动后,它又成为整个云上事件驱动架构的统一通知总线。掌握好确认机制、幂等处理和最小权限这几个关键点,就能让告警通知、异步处理和系统集成都变得干净而可靠。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。