Azure 流分析) (事件传送保证
Azure 流分析查询语言扩展了 SQL 语法,以通过事件流启用复杂计算。 使用流分析时,有一些与事件传递相关的概念值得讨论:
- 恰好一次处理
- “刚好一次”交付
- 重复记录
除了下面详述的这些概念外,还必须考虑 作业的启动选项 ,以确保不会发生数据丢失。
精确一次处理
精确一次处理保证意味着,给定一组输入,系统始终返回相同的结果。 这对于可重复性非常重要,即使在重启作业的情况下,或在同一输入上并行运行的多个作业中也适用。 Azure 流分析保证只处理一次。
恰好一次交付
精确一次传递保证意味着恰好一次处理的所有输出都恰好一次传递到输出接收器,因此没有重复的输出。 这需要实现输出适配器上的事务功能。
Azure 流分析保证至少一次传送到输出接收器,这可以保证输出所有结果,但可能会出现重复的结果。 但是,可以通过多个输出(例如 Azure Cosmos DB 或 Azure SQL)实现一次精确交付。
重复记录
由于至少一次传送保证,当流分析作业运行时,输出数据中偶尔可能会注意到重复记录。 这些重复记录是预期的,因为 Azure 流分析输出适配器不会以事务方式写入输出事件。 如果出现以下情况之一,可能会导致此“重复记录”方案:
- 在作业运行时升级 Azure 实例
- 流分析作业已升级,或者与作业输出的连接性或可靠性出现问题
- 运行作业的 Azure 实例中断
- 流分析作业使用 上次停止时间 选项启动
输出事件的下游使用者需要使用事件的逻辑标识对事件进行重复处理。 例如,如果要在翻转窗口中按组聚合事件,则事件的逻辑标识是组和翻转窗口的结束时间。 如果运行传递查询,可能需要在事件上携带唯一 ID 才能进行重复数据删除。
支持使用 Azure 流分析进行精确一次交付的输出
Azure Cosmos DB
使用 Azure Cosmos DB,Azure 流分析可保证一次性交付。 由于 Azure 流分析使用 upsert,因此用户无需执行任何操作。 请参阅有关 Azure Cosmos DB 的 Azure 流分析输出的详细信息。
SQL
使用 SQL 输出时,如果满足以下要求,则用户可实现恰好一次的传递:
- 所有输出流式处理事件都有一个自然键,即可通过字段或字段组合唯一标识。
- 输出 SQL 表具有使用输出事件的自然键创建的唯一约束 (或主键) 。
这足以避免重复,因为 SQL 输出通过跳过导致唯一约束冲突的任何事件来遵守表上放置的任何约束。
Azure 表
Azure 存储表中的所有实体都通过 和 PartitionKey
字段的RowKey
串联唯一标识。 Azure 流分析会更新插入实体,因此表实体的值将是具有相应 RowKey
/PartitionKey
组合的最新输出事件。 因此,若要实现精确一次的传递,请确保每个输出事件具有唯 RowKey
/PartitionKey
一的组合。 如果执行此操作,重复事件将覆盖早期版本。 (在这种情况下,系统定义的 Timestamp
字段(即实体的上次修改时间)仍会更改。)