Apache storm Storm:当批处理tick元组时,为什么要等待确认元组?

Apache storm Storm:当批处理tick元组时,为什么要等待确认元组?,apache-storm,Apache Storm,在我的拓扑中,我需要为通过它的每个元组执行一个insert语句。为了更好地使用我的数据库,我正在使用tick tuple模式对插入进行批处理 我在网上看到的帖子指示实现以下模式: -批量收集元组 -当勾号出现时(或者当批次增长超过一定大小时)刷新批次 -确认批处理中的所有元组 但是,为什么要等到刷新批处理后才能确认元组?如果刷新批处理时出现异常(如数据库超时/错误),批处理中的所有元组是否最终都会超时并被重放 如果我在批处理之前确认元组,而是根据元组内容批处理某些对象,那么元组将不会被重放。如果

在我的拓扑中,我需要为通过它的每个元组执行一个insert语句。为了更好地使用我的数据库,我正在使用tick tuple模式对插入进行批处理

我在网上看到的帖子指示实现以下模式:

-批量收集元组

-当勾号出现时(或者当批次增长超过一定大小时)刷新批次

-确认批处理中的所有元组

但是,为什么要等到刷新批处理后才能确认元组?如果刷新批处理时出现异常(如数据库超时/错误),批处理中的所有元组是否最终都会超时并被重放

如果我在批处理之前确认元组,而是根据元组内容批处理某些对象,那么元组将不会被重放。如果刷新我的批处理失败,该批处理将不会在异常时清除,并且下次出现勾号时将尝试再次插入其中的所有消息

如果我在批处理之前确认元组,而是根据元组内容批处理某些对象,那么元组将不会被重放

是的,你确实是对的;这就是为什么只有在批处理成功后才能确认它们。您是否希望所有邮件都能正确处理

但是,为什么要等到刷新批处理后才能确认元组?如果刷新批处理时出现异常(如数据库超时/错误),批处理中的所有元组是否最终都会超时并被重放

是的,元组将在超时时重放。但是,如果批处理失败,则应使其失败(或重试批处理)


现在让我再给你一条建议,你不希望元组被重放;这将导致数据源的性能大幅下降,例如,Kafka非常快,因为它执行顺序读取,元组重放使Kafka查找要重放的元组。因此,你应该:

  • 如果批处理失败,请检查元组是否可以实际插入到数据库中。例如,数据库中可能有一个
    非null约束
    ,而元组字段为null。在这种情况下,您应该确认该元组,因为您将永远无法在数据库中插入该元组
  • 在插入元组失败之前,应该重试
  • 您希望元组失败,而不是让它们超时。等待元组超时并不是一个好的做法,而是让它们失败。您可以在Storm UI上看到元组在哪个螺栓上失败,但无法看到元组在哪个螺栓上超时
  • 记录元组失败,因为如果无法插入元组(请记住,例如NOTNULL约束),您希望了解此类情况并更改代码以处理这种情况(例如,建议1,但还有其他建议)

  • 我不能完全理解你的描述。但是,您应该注意以下事项:

  • 批量收集元组
  • 刷新元组(勾号或大小)

    • 成功插入事务时,确认批处理的所有元组
    • 插入失败时,不确认(稍后再次尝试插入,直到插入成功)
  • 作为重试模式,您可以使用下一个填充的批次或下一个滴答元组。对于这种情况,您只需允许更大的批大小,或者尝试在每个批之后插入两个批

    如果在成功插入数据库之前确认元组,那么如果螺栓崩溃,可能会丢失元组。在确认元组后,Storm允许喷口删除重新计算尚未插入的元组所需的源元组。因此,您无法重新计算它们

    另一种方法是,也可以使批处理中的所有元组失败(如果无法插入),并触发喷口重放源元组。这样做的好处是,您不会在DB insert bolt中构建更大/多个批次。然而,缺点当然是Storm必须处理这些元组两次