【发布时间】: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