轻量消息队列(原 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列表。 
如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理。