【问题标题】:Retry logic when a partial update failed部分更新失败时的重试逻辑
【发布时间】:2022-11-16 05:34:11
【问题描述】:

我认为这是一个普遍的问题,与使用技术无关。所以,请考虑问题本身。

我将数据存储在 Couchbase 中,格式如下

productId 是文档 ID。

{
    "size",
    "colour",
    "category",
    "updatedDate"
}

我正在听 Kafka 主题以获取部分更新事件。

部分更新事件可以是任意组合:

{
    "size",
    "colour"
}

或者

{
    "size"
}

或者

{
    "category"
    "colour"
}

等等

那么,让我们看看下面这个有问题的案例:

让文档存在于 Couchbase 中,如下所示。

{
    "size" : "M",
    "colour" : "Black",
    "category" : "Sweat",
    "updatedDate" : "2022-11-11T12:12:12"
}

让更新事件发生在 2022-11-11T13:13:13,如下所示

{
    "category" : "Jean",
    "colour" : "Brown",
    "eventTimeStamp" : "2022-11-11T13:13:13"
}

让我们无法将该消息写入 Couchbase,因为此时 couchbase 不可用。 所以我们不能更新我们的文档。因此,我们将此事件消息移至重试主题。

事件消息在重试主题中,等待消费。

那时新的更新如下 2022-11-11T14:14:14:

{
    "colour" : "Yellow"
    "eventTimeStamp" : "2022-11-11T14:14:14"
}

该事件已成功写入 couchbase,最后的文档状态如下:

{
    "size" : "M",
    "colour" : "Yellow",
    "category" : "Sweat",
    "updatedDate" : "2022-11-11T14:14:14"
}

之后让我们使用重试主题并使用下面的消息(上面没有写入 Couchbase)

{
    "category" : "Jean"
    "colour" : "Brown"
    "eventTimeStamp" : "2022-11-11T13:13:13"
}

当我们消费这个事件时,

如您所见,eventTimeStamp 在 updatedDate 之前。所以我们应该忽略这个消息。但是,如果我们忽略此消息,类别将保留为 Sweat,但它是旧数据。既然应该是让。如果我们写这个数据,颜色会变旧。因为它应该是黄色而不是棕色。

两种方式(忽略或向 Couchbase 写入消息)都会导致旧数据。 忽略会导致旧类别。 写它会导致颜色变旧。

在这种情况下我们应该怎么做?

(你可以说为每个字段存储一个更新的日期字段并为每个字段比较该字段。我不认为这是最佳实践。所以如果有更好的解决方案我想遵循它。)

【问题讨论】:

  • 您有多少个单个文档的更新?
  • 可以是n次。没有限制。但是如果你问这个问题案例,有两个更新事件,第一个失败,第二个成功。然后重试了第一个,这是一个有问题的操作,我想提一下,问一下。

标签: apache-kafka event-handling couchbase retry-logic event-driven-design


【解决方案1】:

我看不出在发布到“稍后重试”主题后如何保持正确的顺序。

一种解决方案是使用Kafka ConnectCouchbase Sink connector

Couchbase Sink 连接器有一个 N1qlSinkHandler,它将字段合并到现有的 JSON 文档中(如果不存在则创建文档)。通过设置 couchbase.sink.handler 配置属性来选择此接收器处理程序。

然后将 couchbase.retry.timeout 属性设置为高于预期中断时间的值。当 Couchbase 不可用时,连接器会自动重试,并且您的写入会按正确的顺序进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多