Elasticsearch 乐观锁定

5

我有一个应用程序,可以在不同的线程上接收事件。每个事件都会被处理、格式化成不同的属性,并保存到ElasticSearch。当任何事件中第一次出现特定属性值时(每个事件都会读取所有之前的事件并验证该值尚未出现),我想在我的数据库中添加新条目。

由于应用程序具有多线程性质,因此我需要一种验证方式,以确保我只是在首次遇到属性时才添加条目,且仅添加一次。我能想到的最佳解决方案是一种乐观锁定(确保我提交之前没有其他线程为此属性添加了条目)。

是否有ElasticSearch支持此功能?


1
这与使用Elasticsearch的应用程序中构想的架构相反。话虽如此,我不确定它们是否提供锁定功能。我会怀疑不会,但你需要阅读文档。 - theMayer
1个回答

10

是的,Elasticsearch提供了处理冲突的支持,您可以阅读官方Elasticsearch https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html文档,其中详细解释了这一点。

如果我们没有正确处理冲突,则可能会导致丢失更新问题,下面将解释如何处理

在数据库世界中,通常使用两种方法来确保在进行并发更新时不会丢失更改:

悲观并发控制:被关系型数据库广泛使用,此方法假定冲突更改很可能发生,因此阻止对资源的访问以防止冲突。一个典型的例子是在读取数据之前锁定行,确保只有放置锁的线程能够更改该行中的数据。

使用乐观并发控制方式,Elasticsearch认为冲突不太可能发生,因此不会阻止尝试进行的操作。但是,如果在读写之间修改了基础数据,则更新将失败。然后由应用程序决定如何解决冲突。例如,它可以使用新鲜数据重新尝试更新,或者向用户报告情况。
好消息是,Elasticsearch支持乐观锁定,因此不会锁定所有文档并提供更好的性能。您可以阅读他们的官方文档https://www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control.html以了解如何实现。
如果您有任何疑问,请让我知道。

在乐观并发控制中:
  1. 假设两个线程要更新文档版本-1
  2. 假设两者正好同时尝试进行更新
  3. 无法想象结果会是什么样子。我可以尝试一下并查看,但听起来这是可能的。
  4. 当然,如果在第一次尝试失败后我们可以加入重试逻辑,但这也会应用于真实情况。
- Hari Rao
谢谢,我看了那篇帖子,给你点了个赞。具体来说,乐观锁定似乎应用于以下两种情况:1.维护ACID合规性不是主要要求的系统。2.系统中读请求比写请求要高得多... - Hari Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接