✅ 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 存储表中的所有实体都通过连接 RowKey
和 PartitionKey
字段进行唯一标识。 Azure 流分析更新插入实体,因此表实体的值将是具有相应 RowKey
/PartitionKey
组合的最新输出事件。 因此,若要实现完全一次的传递,请确保每个输出事件都具有唯 RowKey
/PartitionKey
一的组合。 如果这样做,重复事件将覆盖早期版本。 (系统定义的 Timestamp
字段是实体的上次修改时间,在本例中仍会更改。