消息队列RabbitMQ版作为事件源通过事件总线EventBridge函数计算集成后,通过消息队列RabbitMQ版触发器(以下简称RabbitMQ触发器)能够触发关联函数执行,通过函数可以对发布到消息队列RabbitMQ版中的消息进行自定义处理。本文介绍如何在函数计算控制台创建RabbitMQ触发器、配置函数入口参数和编写代码并测试。

功能简介

您在函数计算的控制台提交触发器创建请求之后,函数计算会根据触发器的配置信息,自动创建与事件总线EventBridge相关的资源。目前提供事件模型事件流模型两种消息推送模型,每个模型创建的资源如下:
创建完成后,您可以在函数计算控制台查看触发器信息,同时也可以在事件总线EventBridge控制台查看自动创建的资源信息。当源消息队列RabbitMQ版实例中有消息入队时,将会触发函数计算执行,不同消息推送模型支持的参数内容也不同。
  • 事件模型:每次会将单个消息作为事件参数传入函数中,事件遵循CloudEvents规范。消息内容和CloudEvents的关系,请参见参数内容
  • 事件流模型:根据您的攒批配置,将一个或多个消息事件以批的形式推送到函数中进行处理,适合端到端的流式数据处理场景。

注意事项

  • 作为触发源的消息队列RabbitMQ版实例必须和函数计算的函数在相同的地域。
  • 创建的自定义总线以及事件规则的数量超过上限后,将无法再创建事件模型的RabbitMQ触发器。
  • 创建的事件流数量超过上限后,将无法再创建事件流模型的RabbitMQ触发器。
在单个阿里云账号单个地域维度下,创建触发器涉及的资源数量的限制如下所示。
限制项 资源上限
自定义事件总线数量 10
每个自定义事件总线下创建的事件规则数量 10
事件流数量 30

前提条件

步骤一:创建触发器

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,单击目标函数名称。
  4. 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器
  5. 在创建触发器面板,填写相关信息。然后单击确定
    高级配置的更多信息,请参见EventBridge触发器高级功能
    配置项类型 配置项 操作 本文示例
    基础配置 触发器类型 选择消息队列 RabbitMQ 版 消息队列 RabbitMQ 版
    名称 填写自定义的触发器名称。 rabbitmq-trigger
    版本或别名 默认值为LATEST,如果您需要创建其他版本或别名的触发器,首先需要在函数详情页的右上角切换到该版本或别名。关于版本和别名的简介,请参见管理版本管理别名 LATEST
    RabbitMQ 实例 选择已创建的消息队列RabbitMQ版的实例。 amqp-cn-i7m2l6m2****
    Vhost 选择已创建的消息队列RabbitMQ版实例的Vhost。 myhost-1
    Queue 选择已创建的消息队列RabbitMQ版实例的Queue。 myqueue-1
    高级配置 调用方式 选择函数调用方式。
    取值说明如下。
    • 同步调用:默认调用方式,事件触发函数执行,等待函数调用完成后,函数计算返回执行结果。更多信息,请参见同步调用
    • 异步调用:适用于调度延时较长的函数,事件触发函数执行后,函数计算立即返回响应结果并且确保函数至少被成功执行一次,但不会返回具体执行结果。更多信息,请参见功能概览
    同步调用
    消息推送模型 消息数据推送到函数计算时的底层应用模型。
    取值说明如下。
    • 事件模型:每次会将单个消息作为事件参数传入函数中,事件遵循CloudEvents规范。消息内容和CloudEvents的关系,请参见参数内容
    • 事件流模型:会根据您的攒批配置将一个或多个消息事件以批的形式推送到函数中进行处理,适合端到端的流式数据处理场景。
    事件模型
    批量推送

    仅当您选择事件流模型时,可以配置此参数。

    可帮您批量聚合多个事件,当批量推送条数批量推送间隔两者条件达到其一时即会触发批量推送。

    例如,您设置的推送条数为100条,间隔时间为15秒,在10秒内消息条数已达到100条,那么该次推送则不会等15秒后再推送。

    开启
    批量推送条数 一次调用函数发送的最大批量消息条数,当积压的消息数量到达设定值时才会发送请求,取值范围为[1,500]。 1
    批量推送间隔 调用函数的间隔时间,系统每到间隔时间点会将消息聚合后发给函数计算,取值范围为[0,15],单位为秒。0秒表示无等待时间,直接投递。 1
    重试策略

    仅当您选择事件流模型时,可以配置此参数。

    消息推送失败时的重试策略。

    取值说明如下。
    • 退避重试:重试3次,每次重试的间隔时间是10秒到20秒之间的随机值。
    • 指数衰减重试:重试176次,每次重试的间隔时间指数递增至512秒,总计重试时间为1天;每次重试的具体间隔为:1、2、4、8、...512秒。
    退避重试
    容错策略

    仅当您选择事件流模型时,可以配置此参数。

    当错误发生时的处理方式。

    取值说明如下。
    • 允许容错:允许异常容错,当异常发生时不会阻塞执行,超过重试策略后会根据配置将消息投递至死信队列或直接丢弃。
    • 禁止容错:不允许容错,当异常发生并超过重试策略配置时会阻塞执行。
    允许容错
    死信队列

    仅当您选择事件流模型时,可以配置此参数。

    未处理或超过重试次数的消息可以发送到指定队列。该配置不启用时,超过重试策略后消息将被丢弃。

    开启
    队列类型 死信队列的类型。
    取值如下:
    • 消息服务 MNS
    • 消息队列 RocketMQ 版
    消息服务 MNS
    队列名称 死信队列的名称。 test-queue

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

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

消息队列RabbitMQ版事件源会以event的形式作为输入参数传递给函数,您可以手动将event传给函数模拟触发事件,测试函数代码是否正确。

  1. 在函数详情页面,单击函数代码页签,然后单击xialatubiao图标,从下拉列表中,选择配置测试参数
  2. 配置测试参数面板,选择创建新测试事件编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定
    事件模型的event格式如下所示。
      {
        "id":"bj694332-4cj1-389e-9d8c-b137h30b****",
        "source":"RabbitMQ-Function-rabbitmq-trigger",
        "specversion":"1.0",
        "type":"amqp:Queue:SendMessage",
        "datacontenttype":"application/json;charset=utf-8",
        "subject":"acs:amqp:cn-hangzhou:164901546557****:/instances/amqp-cn-tl32e756****/vhosts/eb-connect/queues/housekeeping",
        "time":"2021-08-12T06:56:40.709Z",
        "aliyunaccountid":"164901546557****",
        "aliyunpublishtime":"2021-10-15T08:58:55.140Z",
        "aliyunoriginalaccountid":"164901546557****",
        "aliyuneventbusname":"RabbitMQ-Function-rabbitmq-trigger",
        "aliyunregionid":"cn-chengdu",
        "aliyunpublishaddr":"42.120.XX.XX",
        "data":{
            "envelope":{
                "deliveryTag":98,
                "exchange":"",
                "redeliver":false,
                "routingKey":"housekeeping"
            },
            "body":{
                "Hello":"RabbitMQ"
            },
            "props":{
                "contentEncoding":"UTF-8",
                "messageId":"f7622d51-e198-41de-a072-77c1ead7****"
            }
        }
    }
    事件流模型的event格式如下所示。
    [
          {
        "id":"bj694332-4cj1-389e-9d8c-b137h30b****",
        "source":"RabbitMQ-Function-rabbitmq-trigger",
        "specversion":"1.0",
        "type":"amqp:Queue:SendMessage",
        "datacontenttype":"application/json;charset=utf-8",
        "subject":"acs:amqp:cn-hangzhou:164901546557****:/instances/amqp-cn-tl32e756****/vhosts/eb-connect/queues/housekeeping",
        "time":"2021-08-12T06:56:40.709Z",
        "aliyunaccountid":"164901546557****",
        "aliyunpublishtime":"2021-10-15T08:58:55.140Z",
        "aliyunoriginalaccountid":"164901546557****",
        "aliyuneventbusname":"RabbitMQ-Function-rabbitmq-trigger",
        "aliyunregionid":"cn-chengdu",
        "aliyunpublishaddr":"42.120.XX.XX",
        "data":{
            "envelope":{
                "deliveryTag":98,
                "exchange":"",
                "redeliver":false,
                "routingKey":"housekeeping"
            },
            "body":{
                "Hello":"RabbitMQ"
            },
            "props":{
                "contentEncoding":"UTF-8",
                "messageId":"f7622d51-e198-41de-a072-77c1ead7****"
            }
        }
        },
        {
        "id":"bj694332-4cj1-389e-9d8c-b137h30b****",
        "source":"RabbitMQ-Function-rabbitmq-trigger",
        "specversion":"1.0",
        "type":"amqp:Queue:SendMessage",
        "datacontenttype":"application/json;charset=utf-8",
        "subject":"acs:amqp:cn-hangzhou:164901546557****:/instances/amqp-cn-tl32e756****/vhosts/eb-connect/queues/housekeeping",
        "time":"2021-08-12T06:56:40.709Z",
        "aliyunaccountid":"164901546557****",
        "aliyunpublishtime":"2021-10-15T08:58:55.140Z",
        "aliyunoriginalaccountid":"164901546557****",
        "aliyuneventbusname":"RabbitMQ-Function-rabbitmq-trigger",
        "aliyunregionid":"cn-chengdu",
        "aliyunpublishaddr":"42.120.XX.XX",
        "data":{
            "envelope":{
                "deliveryTag":98,
                "exchange":"",
                "redeliver":false,
                "routingKey":"housekeeping"
            },
            "body":{
                "Hello":"RabbitMQ"
            },
            "props":{
                "contentEncoding":"UTF-8",
                "messageId":"f7622d51-e198-41de-a072-77c1ead7****"
            }
        }
        }
    ]
    data字段包含的参数解释如下表所示。关于CloudEvents规范中定义的参数解释,请参见事件概述
    参数 类型 示例值 描述
    body Map 消息内容。
    Hello String EventBridge 用户数据。
    props Map 消息属性。
    contentEncoding String utf-8 消息内容编码。
    messageId String f7622d51-e198-41de-a072-77c1ead7**** 消息ID。每条消息的ID取值唯一。
    envelope Map 消息的envelope信息。
    deliveryTag Int 98 消息的Tag。
    exchange String 消息的Exchange。
    redeliver Boolean false 是否支持重发消息。取值说明如下:
    • true:支持
    • false:不支持
    routingKey String housekeeping 消息的路由规则。

步骤三:编写函数代码并测试

完成触发器创建后,您可以开始编写并测试函数代码,以验证代码的正确性。在实际操作过程中,当消息队列RabbitMQ版事件通过事件总线EventBridge投递到函数计算时,触发器会自动触发函数的执行。

  1. 在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码
    本文以Node.js函数代码为例。
    'use strict';
    /*
    To enable the initializer feature
    please implement the initializer function as below:
    exports.initializer = (context, callback) => {
      console.log('initializing');
      callback(null, '');
    };
    */
    exports.handler = (event, context, callback) => {
      console.log("event: %s", event);
      //解析event参数,对event进行处理。
      callback(null, 'return result');
    }
  2. 单击函数代码页签的测试函数
    执行完成后,您可以在函数代码页签的上方查看执行结果。

更多信息

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