轻量消息队列(原 MNS)的主题(Topic)可以作为事件源通过事件总线EventBridge与函数计算进行集成。通过轻量消息队列(原 MNS)主题触发器,当有新消息发送到您的轻量消息队列(原 MNS)主题时,它会自动触发与之关联的函数执行,从而您可以轻松地对传入的消息进行自定义处理。
背景介绍
轻量消息队列(原 MNS)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。帮助应用开发者在其应用的分布式组件上自由地传递数据、通知消息,构建松耦合系统。在轻量消息队列(原 MNS)中,主题是发布消息的目的地。发布者可以通过PublishMessage接口向主题发布消息,主题的订阅者接收该消息。接口信息,请参见PublishMessage。
配置一个轻量消息队列(原 MNS)主题触发器,相当于将函数注册为这个轻量消息队列(原 MNS)主题的订阅者,当发布者向轻量消息队列(原 MNS)主题发布消息的时候,就会把消息内容通知给函数,即触发函数执行,同时消息内容作为函数入口的event参数。具体信息,请参见基础信息。
轻量消息队列(原 MNS)与函数计算集成有以下优势:
可以实现对消息进行一些高阶处理再发送邮件或者短信。
HTTP Endpoint不需要有自建的服务。
支持丰富的自定义处理。例如,把消息发送给slack,或者对于特定的消息进行持久化存储。
前提条件
注意事项
轻量消息队列(原 MNS)创建的主题和函数计算的函数部署在相同的地域。
避免出现循环调用的情况。
编写函数时,注意不要出现以下逻辑:Topic A触发函数B,函数B又发布新的消息到Topic A,从而造成函数无限循环调用。
步骤一:创建MNS主题触发器
登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的函数管理。
在函数管理页面,单击目标函数名称。
在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器。
在创建触发器面板,填写相关信息。然后单击确定。
参数
操作
本文示例
触发器类型
选择轻量消息队列(原 MNS) topic 触发 。
轻量消息队列(原 MNS) topic触发
名称
填写自定义的触发器名称。
trigger-mns
版本或别名
默认值为LATEST,如果您需要创建其他版本或别名的触发器,需先在函数详情页的右上角切换到该版本或别名。关于版本和别名的简介,请参见管理版本和管理别名。
LATEST
MNS地域
选择Topic所在的地域。轻量消息队列(原 MNS)主题和函数计算的函数要部署在相同的地域。
西南1(成都)
主题
在列表中选择已创建的Topic。
Mytopic
过滤标签
填写消息过滤标签。
只有收到包含了此处设置的过滤标签字符串的消息时,才会触发函数执行。
tag
Event格式
选择Event格式。取值:
STREAM
JSON
JSON
重试策略
选择重试策略。取值:
退避重试
指数衰减
如何选择重试策略,请参见NotifyStrategy。
退避重试
角色名称
选择AliyunMNSNotificationRole。
说明如果您第一次创建该类型的触发器,则需要在单击确定后,在弹出的对话框中选择立即授权。
AliyunMNSNotificationRole
创建完成后,在触发器名称列表中显示已创建的触发器。如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理。
步骤二:配置函数的入口参数
在函数详情页面,单击函数代码页签,然后单击测试函数右侧图标,从下拉列表中,选择配置测试参数。
在配置测试参数面板,选择创建新测试事件或编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定。
发布在轻量消息队列(原 MNS)主题上的消息根据notifyContentFormat进行处理,即入口函数的event。更多信息,请参见NotifyContentFormat。
创建触发器时,若event格式设置为STREAM。
当消息中不含消息属性(MessageAttributes)时,event格式如下。
说明当消息中不含消息属性(MessageAttributes)时,event的内容格式为JSON字符串。
# 消息正文。 'hello topic'
当消息中含有消息属性(MessageAttributes)时,event格式如下。
说明event的内容中包含MessageAttributes相关的键值对。更多信息,请参见PublishMessage。
{ "body": "hello topic", "attrs": { "Extend": "{\\"key\\":\\"value\\"}" } }
创建触发器时,若event格式设置为JSON。
当消息中不含消息属性(MessageAttributes)时,event格式如下。
{ "TopicOwner": "118620210433****", "Message": "hello topic", "Subscriber": "118620210433****", "PublishTime": 1550216480040, "SubscriptionName": "test-fc-subscribe", "MessageMD5": "BA4BA9B48AC81F0F9C66F6C909C3****", "TopicName": "Mytopic", "MessageId": "2F5B3C082B923D4EAC694B76D928****" }
当消息中含有消息属性(MessageAttributes)时,event格式如下。
说明event的内容中包含MessageAttributes相关的键值对。更多信息,请参见PublishMessage。
{ "key": "value", "TopicOwner": "118620210433****", "Message": "hello topic", "Subscriber": "118620210433****", "PublishTime": 1550216302888, "SubscriptionName": "test-fc-subscribe", "MessageMD5": "BA4BA9B48AC81F0F9C66F6C909C3****", "TopicName": "Mytopic", "MessageId": "2F5B3C281B283D4EAC694B742528****" }
event参数中不同属性字段的解释如下表所示。
参数
类型
示例值
描述
key
String
value
消息属性相关的键值对。
TopicOwner
String
118620210433****
订阅Topic的AccountId。
Message
String
hello topic
消息内容。
Subscriber
String
118620210433****
用户的AccountId。
PublishTime
Int
1550216302888
消息发布时间。
SubscriptionName
String
test-fc-subscribe
订阅的名称。
MessageMD5
String
BA4BA9B48AC81F0F9C66F6C909C3****
消息正文的MD5值。
TopicName
String
Mytopic
Topic名称。
MessageId
String
2F5B3C281B283D4EAC694B742528****
消息的编号。
步骤三:编写函数代码并测试
完成创建轻量消息队列(原 MNS)主题触发器后,您可以开始编写函数代码并测试,以验证代码的正确性。
在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码。
本文以Python函数代码为例。以下示例代码可以作为轻量消息队列(原 MNS)主题触发器的函数模板。
import json import logging def handler(event, context): logger = logging.getLogger() logger.info("mns_topic trigger event = {}".format(event)) # 例如,将事件记录到表格存储。 return "OK"
单击函数代码页签的测试函数。
执行完成后,您可以在函数代码页签的上方查看执行结果。
更多信息
除了函数计算控制台,您还可通过以下方式配置触发器:
通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs。
通过SDK配置触发器。更多操作,请参见SDK列表。
如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理。