Condividi tramite

在 Azure 逻辑应用中使用顺序编队发送相关的服务总线消息

适用于:Azure 逻辑应用(消耗型 + 标准型)

某些方案要求工作流按照 Azure 服务总线 队列中的特定顺序处理与会话相关的消息。 这些消息具有一个属性,用于定义彼此之间的关系,例如 会话 ID。 若要按会话处理这些消息,请在工作流中设置 顺序车队 模式

例如,假设你有一个服务总线队列,用于接收来自多个会话的消息。 有 10 条消息来自名为 Session 1 的会话,5 条消息来自名为 Session 2 的会话。 可以创建一个工作流,在会话之间交替处理来自队列的消息。 触发器首次触发时,工作流运行将处理会话 1 中的所有消息。 再次触发触发器时,工作流运行将处理会话 2 中的所有消息。

图示显示了常规的序列护航模式。

本指南演示如何创建一个工作流,该工作流设置顺序护航模式以执行以下高级步骤:

  1. 当服务总线触发器队列中收到消息时(窥视-锁定)触发时,运行工作流。

    有关 速览锁定 模式的详细信息,请参阅 接收模式速览锁

  2. 根据触发器从服务总线队列中读取的消息初始化会话。

  3. 在当前工作流运行期间,读取并处理来自队列中同一会话的所有消息。

对于标准逻辑应用,可以通过名为 Azure 服务总线:处理同一工作流实例会话启用队列的相关消息 - 顺序车队模式 的模板创建工作流。

对于消耗工作流,设计器中没有可用的工作流模板,因此必须手动生成工作流。 还可以使用 GitHub 中提供的服务总线会话查看标准工作流的模板或 JSON 文件,了解以前提供的名为 “关联有序传递 ”的模板 :service-bus-sessions.json

先决条件

检查对服务总线命名空间的访问权限

逻辑应用资源和工作流需要有权访问服务总线命名空间。 如果不确定工作流是否具有权限,请立即检查它们。

  1. Azure 门户中,找到并选择服务总线命名空间。

  2. 在边栏菜单中的 “设置”下,选择“ 共享访问策略”。 检查 你是否具有 该命名空间的管理权限。

    屏幕截图显示了服务总线命名空间的“共享访问策略”页。

  3. 按照以下步骤获取服务总线命名空间的连接字符串:

    1. “共享访问策略 ”页上的 “策略”下,选择 “RootManageSharedAccessKey”。

    2. SAS 策略:RootManageSharedAccessKey 窗格的主连接字符串旁边,选择复制按钮。

      屏幕截图显示了可在其中复制服务总线命名空间连接字符串的共享访问策略。

      提示

      若要确保连接字符串与您的服务总线命名空间相关联,而不是与消息实体(如队列)相关联,请检查连接字符串中是否包含 EntityPath 参数。 如果找到了该参数,则表示该连接字符串用于特定的实体,而不是用于工作流的正确字符串。

    3. 保存连接字符串供以后在从工作流连接到命名空间时使用。

创建顺序车队工作流

根据您的逻辑应用资源是“标准”还是“消耗”类型,请遵循相应的步骤。

这些步骤从名为 Azure Service Bus: 从启用会话的队列中处理同一工作流实例的相关消息 - 顺序车队模式 的模板创建工作流。 该模板包括用于实现此工作流模式的触发器和操作。 另外,请创建一个到服务总线命名空间的连接,并指定要使用的服务总线队列的名称。

  1. Azure 门户中,打开你的标准逻辑应用资源。

  2. 在边栏菜单上的 “工作流”下,选择“ 工作流”。

  3. “工作流”工具栏上,选择“从模板创建”。>

  4. 模板 中,选择名为 Azure 服务总线:用于处理同一工作流实例中会话启用队列的相关消息的模板 - 顺序车队模式,然后选择 使用此模板

    以下示例部分显示了工作流模板库:

    屏幕截图显示了一个页面,可在其中选择服务总线会话模板。

  5. “从模板窗格中创建新工作流 ”上,执行以下步骤:

    1. 基础选项卡上,按以下步骤操作:

      1. 输入工作流的名称。

        名称必须以字母开头,只能包含字母、数字、短划线和下划线。

      2. 根据方案选择 有状态无状态

      3. 选择“下一步”。

    2. 在“ 连接 ”选项卡上,执行以下步骤:

      1. 对于服务总线,在 “连接” 列中,选择“ 连接”。

        屏幕截图显示用于开始连接到 Azure 服务总线命名空间的窗格。

      2. 提供以下信息:

        参数 说明
        连接名称 < 连接名称> 与服务总线命名空间的连接的名称。
        身份验证类型 连接字符串 要使用的认证类型。
        连接字符串 < 命名空间连接字符串> 您之前从服务总线命名空间保存的连接字符串。

        屏幕截图显示了标准工作流中的“服务总线连接”窗格。

      3. 完成后,选择“下一步>”。

    3. 在“ 参数 ”选项卡上,执行以下步骤:

      1. 提供以下信息:

        参数 说明
        队列名称 服务总线会话启用队列的名称,其中包含要处理的消息。
        最大批量大小 获取消息的批次最大数量。
      2. 完成后,选择“下一步”

    4. 查看提供的信息,然后选择“ 创建”。

    设计器显示了一个工作流,预填充了名为"当消息在队列中可用时 (peek-lock)"的触发器和各种操作,例如:

    屏幕截图显示了包含所有操作的工作流。

    此工作流包括预定义的跨环境参数,用于抽象值,这些值在工作流运行的各种环境中发生更改,例如开发、测试和生产。 工作流中的许多作使用这些参数,而不是硬编码的值。

    下表描述了这些跨环境参数:

    名称 类型 说明
    delayInMinutes_<workflow-name> 整数 0 续订消息锁定令牌之前等待的分钟数。
    messageBatchSize_<workflow-name> 整数 50 当前批的消息数。
    queueName_<workflow-name> 字符串 <Service-Bus-queue-name> 服务总线队列的名称。

    有关详细信息,请参阅 为工作流输入创建跨环境参数

  6. 若要了解工作流中的预定义作,请继续学习下一部分。

工作流操作

以下部分介绍工作流中的预定义作。

当消息在队列中可用时(速览锁定)

此 Azure 服务总线内置触发器等待一个或多个消息到达指定的服务总线队列。 如果队列中存在消息,触发器将触发并运行工作流实例。 术语peek-lock指的是触发器发送请求以从队列中检索消息。 如果有消息存在,则触发器会检索并锁定该消息,防止在锁定期限到期之前对该消息进行其他处理。 触发器还会输出 ServiceBusMessage 对象

下表描述了预填充的触发器参数:

参数 说明
队列名称 queueName_<workflow-name> 指定服务总线队列的跨环境预定义参数。 若要设置此值,请执行以下步骤:

1. 在 “队列名称 ”框中选择,然后选择闪电图标以打开动态内容列表。
2.从列表中选择 queueName_<workflow-name>
队列类型 主页 此默认类型指的是您的主要服务总线队列。
最大消息批大小 messageBatchSize_<workflow-name> 预定义的跨环境参数,该参数指定批处理中的最大消息数。 若要设置此值,请执行以下步骤:

1. 在 “最大消息批大小 ”框中选择,然后选择闪电图标以打开动态内容列表。
2.从列表中选择 messageBatchSize_<workflow-name>

有关详细信息,请参阅队列中何时提供消息(速览锁定)。

初始化进程完成标志

此名为 Initialize Process Complete Flag初始化变量创建具有以下初始值的变量:

参数 说明
名称 processCompleted 变量的名称。
类型 布尔值 变量的数据类型。
价值 变量的默认值。

在工作流执行期间,当以下条件满足时,变量 processCompleted 的值会更改为 true

  • 会话中没有更多消息用于处理。
  • 会话锁不再需要续订,因此当前工作流实例可以完成运行。
Scope 操作

外部父作用域操作包含一个内嵌的名为业务逻辑作用域作用域操作。 此嵌套作用域包含名为 Business Logic 的占位符作。 在这里,您可以为您的场景的业务逻辑添加操作,以处理当前消息。

  1. 为清晰起见,请将外部父范围操作重命名为Process message

    屏幕截图显示已重命名为“进程”消息的父范围。

  2. 展开内部嵌套操作,名称为业务逻辑范围

    如果在此范围内出现问题,请使用父 范围 操作之外的后续操作来处理该问题。

  3. 业务逻辑占位符替换为您场景中的业务逻辑实际操作。

业务逻辑范围操作下,进程完成操作设置为始终运行,而不考虑在业务逻辑范围操作内的所有操作完成后分配给业务逻辑范围操作的状态。 要使 “进程完成” 操作始终运行,工作流将 “运行后” 设置为以下值:

  • 成功
  • 超时
  • 已跳过
  • 失败

屏幕截图显示了“进程完成”动作的运行后的设置。

“进程完成”作将processCompleted变量值从 false 更改为 true,指示消息处理已完成。

屏幕截图显示了“进程完成”作中的更新值。

截止

业务逻辑范围 级别,并行分支运行 一个 Until 循环,该循环确定同一会话中是否存在任何其他消息。 操作在循环内运行,直到满足循环条件或超时时间到。 在此示例中,循环将继续运行,直到消息处理按以下条件表示完成:

processCompleted = true

屏幕截图显示了具有 Until 循环的并行分支。

更新队列中消息的锁定

Until 循环中,名为“更新队列中消息的锁定”的服务总线操作控制着工作流处理消息的时间,直到消息再次可供处理。 此行为可防止由于长时间运行的任务而过早释放,并确保在将锁定持续时间设置为初始值之前,一次只有一个客户端处理消息。 有关详细信息,请参阅 “续订锁”。

下表描述了动作的预填充参数:

参数 说明
队列名称 queueName_<workflow-name> 指定服务总线队列的跨环境预定义参数。 若要设置此值,请执行以下步骤:

1. 在 “队列名称 ”框中选择,然后选择闪电图标以打开动态内容列表。
2.从列表中选择 queueName_<workflow-name>
锁定令牌 锁定令牌 消息放弃时使用的锁定令牌。 若要设置此值,请执行以下步骤:

1. 在 “锁定令牌 ”框中选择,然后选择闪电图标以打开动态内容列表。
2. 在列表中,找到 当队列中有可用消息时,然后选择 Lock Token
等待进程完成

Until循环中,名为“等待进程完成”延迟动作增加了额外延迟,以确保消息处理完成。 请确保此延迟值小于队列的锁定超时持续时间。 最短锁持续时间为 30 秒。

下表描述了动作的预填充参数:

参数 说明
计数 delayInMinutes_<workflow-name> 预定义的跨环境参数,指定要在续订消息锁定令牌之前等待的分钟数。 若要设置此值,请执行以下步骤:

1. 在 “队列名称 ”框中选择,然后选择闪电图标以打开动态内容列表。
2.从列表中选择 delayInMinutes_<workflow-name>
单位 Minute 延迟的时间单位。
消息后处理操作

Process message在此作用域下,存在两个并行分支来处理消息处理成功和未成功的情况。

  • 分支 1

    此分支包含一个名为Compose补偿逻辑操作,作为要运行的用于处理错误和异常的操作的占位符。

    1. 将此占位符替换为您想要的操作。

      例如,您可以设置一个包含错误处理操作的作用域操作。

    2. 确保仅在Process message作用域以以下状态之一完成后,Process message作用域下的错误处理操作才会直接运行。

      • 超时
      • 已跳过
      • 失败

      例如:

      屏幕截图显示错误处理范围并在设置后运行。

    在错误处理操作下,名为“放行队列中的消息” 的服务总线操作会解锁消息,并将消息重新排队以进行另一次尝试。

    下表列出了该操作的预置值:

    参数 说明
    队列名称 queueName_<workflow-name> 指定服务总线队列的跨环境预定义参数。 若要设置此值,请执行以下步骤:

    1. 在 “队列名称 ”框中选择,然后选择闪电图标以打开动态内容列表。
    2.从列表中选择 queueName_<workflow-name>
    锁定令牌 锁定令牌 消息放弃时使用的锁定令牌。 若要设置此值,请执行以下步骤:

    1. 在 “锁定令牌 ”框中选择,然后选择闪电图标以打开动态内容列表。
    2. 在列表中,找到 当队列中有可用消息时,然后选择 Lock Token

    例如:

    屏幕截图显示了标准工作流中的“放弃”消息操作。

  • 分支 2

    此分支包含一个名为 “完成队列中的消息” 的服务总线操作,该操作将消息标记为已完成,并从队列中删除该消息。 此行为可防止重新传送并将消息移动到“已处理”状态。 仅当 Process message 作用域成功完成时,此操作才会运行。

    下表列出了该操作的预置值:

    参数 说明
    队列名称 queueName_<workflow-name> 指定服务总线队列的跨环境预定义参数。 若要设置此值,请执行以下步骤:

    1. 在 “队列名称 ”框中选择,然后选择闪电图标以打开动态内容列表。
    2.从列表中选择 queueName_<workflow-name>
    锁定令牌 锁定令牌 消息放弃时使用的锁定令牌。 若要设置此值,请执行以下步骤:

    1. 在 “锁定令牌 ”框中选择,然后选择闪电图标以打开动态内容列表。
    2. 在列表中,找到 当队列中有可用消息时,然后选择 Lock Token

    例如:

    屏幕截图显示了标准工作流的“完成”消息操作。

运行工作流

  1. 保存工作流。 在设计器工具栏上选择“保存”。

  2. 若要测试工作流,请将消息发送到服务总线队列。

  3. 确认工作流的行为与预期相同。