我有一个应用程序,可以在不同的线程上接收事件。每个事件都会被处理、格式化成不同的属性,并保存到ElasticSearch。当任何事件中第一次出现特定属性值时(每个事件都会读取所有之前的事件并验证该值尚未出现),我想在我的数据库中添加新条目。
由于应用程序具有多线程性质,因此我需要一种验证方式,以确保我只是在首次遇到属性时才添加条目,且仅添加一次。我能想到的最佳解决方案是一种乐观锁定(确保我提交之前没有其他线程为此属性添加了条目)。
是否有ElasticSearch支持此功能?
我有一个应用程序,可以在不同的线程上接收事件。每个事件都会被处理、格式化成不同的属性,并保存到ElasticSearch。当任何事件中第一次出现特定属性值时(每个事件都会读取所有之前的事件并验证该值尚未出现),我想在我的数据库中添加新条目。
由于应用程序具有多线程性质,因此我需要一种验证方式,以确保我只是在首次遇到属性时才添加条目,且仅添加一次。我能想到的最佳解决方案是一种乐观锁定(确保我提交之前没有其他线程为此属性添加了条目)。
是否有ElasticSearch支持此功能?
是的,Elasticsearch提供了处理冲突的支持,您可以阅读官方Elasticsearch https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html文档,其中详细解释了这一点。
如果我们没有正确处理冲突,则可能会导致丢失更新问题,下面将解释如何处理
在数据库世界中,通常使用两种方法来确保在进行并发更新时不会丢失更改:
悲观并发控制:被关系型数据库广泛使用,此方法假定冲突更改很可能发生,因此阻止对资源的访问以防止冲突。一个典型的例子是在读取数据之前锁定行,确保只有放置锁的线程能够更改该行中的数据。
使用乐观并发控制方式,Elasticsearch认为冲突不太可能发生,因此不会阻止尝试进行的操作。但是,如果在读写之间修改了基础数据,则更新将失败。然后由应用程序决定如何解决冲突。例如,它可以使用新鲜数据重新尝试更新,或者向用户报告情况。