轻量消息队列(原 MNS)主题触发器

轻量消息队列(原 MNS)的主题(Topic)可以作为事件源通过事件总线EventBridge函数计算进行集成。通过轻量消息队列(原 MNS)主题触发器,当有新消息发送到您的轻量消息队列(原 MNS)主题时,它会自动触发与之关联的函数执行,从而您可以轻松地对传入的消息进行自定义处理。

背景介绍

轻量消息队列(原 MNS)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。帮助应用开发者在其应用的分布式组件上自由地传递数据、通知消息,构建松耦合系统。在轻量消息队列(原 MNS)中,主题是发布消息的目的地。发布者可以通过PublishMessage接口向主题发布消息,主题的订阅者接收该消息。接口信息,请参见PublishMessage

配置一个轻量消息队列(原 MNS)主题触发器,相当于将函数注册为这个轻量消息队列(原 MNS)主题的订阅者,当发布者向轻量消息队列(原 MNS)主题发布消息的时候,就会把消息内容通知给函数,即触发函数执行,同时消息内容作为函数入口的event参数。具体信息,请参见基础信息

轻量消息队列(原 MNS)与函数计算集成有以下优势:

  • 可以实现对消息进行一些高阶处理再发送邮件或者短信。

  • HTTP Endpoint不需要有自建的服务。

  • 支持丰富的自定义处理。例如,把消息发送给slack,或者对于特定的消息进行持久化存储。

image

前提条件

注意事项

  • 轻量消息队列(原 MNS)创建的主题和函数计算的函数部署在相同的地域。

  • 避免出现循环调用的情况。

    编写函数时,注意不要出现以下逻辑:Topic A触发函数B,函数B又发布新的消息到Topic A,从而造成函数无限循环调用。

步骤一:创建MNS主题触发器

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数

  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的函数管理
  3. 函数管理页面,单击目标函数名称。

  4. 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器

  5. 创建触发器面板,填写相关信息。然后单击确定

    参数

    操作

    本文示例

    触发器类型

    选择轻量消息队列(原 MNS) topic 触发

    轻量消息队列(原 MNS) topic触发

    名称

    填写自定义的触发器名称。

    trigger-mns

    版本或别名

    默认值为LATEST,如果您需要创建其他版本或别名的触发器,需先在函数详情页的右上角切换到该版本或别名。关于版本和别名的简介,请参见管理版本管理别名

    LATEST

    MNS地域

    选择Topic所在的地域。轻量消息队列(原 MNS)主题和函数计算的函数要部署在相同的地域。

    西南1(成都)

    主题

    在列表中选择已创建的Topic。

    Mytopic

    过滤标签

    填写消息过滤标签。

    只有收到包含了此处设置的过滤标签字符串的消息时,才会触发函数执行。

    tag

    Event格式

    选择Event格式。取值:

    • STREAM

    • JSON

    JSON

    重试策略

    选择重试策略。取值:

    • 退避重试

    • 指数衰减

    如何选择重试策略,请参见NotifyStrategy

    退避重试

    角色名称

    选择AliyunMNSNotificationRole

    说明

    如果您第一次创建该类型的触发器,则需要在单击确定后,在弹出的对话框中选择立即授权

    AliyunMNSNotificationRole

    创建完成后,在触发器名称列表中显示已创建的触发器。如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理

步骤二:配置函数的入口参数

  1. 在函数详情页面,单击函数代码页签,然后单击测试函数右侧xialatubiao图标,从下拉列表中,选择配置测试参数

  2. 配置测试参数面板,选择创建新测试事件编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定

    发布在轻量消息队列(原 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)主题触发器后,您可以开始编写函数代码并测试,以验证代码的正确性。

  1. 在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码

    本文以Python函数代码为例。以下示例代码可以作为轻量消息队列(原 MNS)主题触发器的函数模板。

    import json
    import logging
    
    def handler(event, context):
      logger = logging.getLogger()
      logger.info("mns_topic trigger event = {}".format(event))
      # 例如,将事件记录到表格存储。
      return "OK"                     
  2. 单击函数代码页签的测试函数

    执行完成后,您可以在函数代码页签的上方查看执行结果。

更多信息

除了函数计算控制台,您还可通过以下方式配置触发器:

  • 通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs

  • 通过SDK配置触发器。更多操作,请参见SDK列表

如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理