日志服务Scheduled SQL保证每次任务的计算结果都以Exactly-Once方式写入到目标存储库(Logstore和MetricStore),确保数据不会重复写入,也不会丢失。日志服务基于Logstore的幂等写入来实现Scheduled SQL结果数据的Exactly-Once。

说明 本文内容适用于Logstore和MetricStore,仅以Logstore为例进行说明。

背景信息

日志服务Logstore中包含多个Shard,每个Shard对应一个Hash Key区间(左闭右开)。您可通过负载均衡模式或者指定Hash Key的模式写数据到Logstore,数据最终落到某个Hash Key中。更多信息,请参见分区(Shard)
  • 负载均衡模式:每个数据包随机写入当前可用的Shard中。
  • 指定Hash Key模式(幂等写入):指定Hash Key的范围,数据将被写入包含该Hash Key范围的Shard中。
Exactly-Once

幂等写入

日志服务通过指定hash keysequence id,实现数据的幂等写入。
  • hash key用于指定数据写入的Hash Key范围。
  • sequence id用于指定待写入数据在该Hash Key中的ID。
    您需保证Sequence ID单调增长,进而保证数据的幂等写入,避免写入任务多次重试时导致数据重复。
    • 当您将数据写入到相同的Hash Key中时,如果待写入数据的Sequence ID小于等于Hash Key中记录的最近一次写入的数据的Sequence ID,则日志服务将拒绝数据写入并返回错误。
    • 当您将数据写入到相同的Hash Key中时,如果待写入数据的Sequence ID大于Hash Key中记录的最近一次写入的数据的Sequence ID,则日志服务将允许数据写入,并更新Hash Key中的Sequence ID。
    幂等写入

基于幂等写入的Scheduled SQL Exactly-Once

Scheduled SQL采用幂等写入方式向目标Logstore写数据。在幂等写入方式的基础上,Scheduled SQL会为每次任务的计算结果生成具有以下特性的Hash Key以及Sequence ID,从而实现Exactly-Once写入。
  • 为两个不同的Scheduled SQL任务实例生成不同的Hash Key。

    当多个Scheduled SQL任务向同一个Logstore写入数据时,Scheduled SQL会为各个任务生成不同的Hash Key,避免Sequence ID冲突。

  • 为同一个Scheduled SQL任务中的不同实例生成递增的Sequence ID。
Exactly-Once
注意 当您通过以下方式向同一个Logstore中的同一个Hash Key写入数据时,可能出现Sequence ID冲突,导致其中一方写入数据失败,引起数据缺失问题。
  • 通过API或SDK写入数据,并指定hash key参数和sequence id参数。
  • 通过Logtail写入数据,并开启ExactlyOnce功能。具体操作,请参见Logtail配置
  • 通过Scheduled SQL任务写入数据。