当前位置: 首页 > 面试题库 >

当两个进程同时写入时如何解决同一密钥上的ElasticSearch冲突

柳坚白
2023-03-14
问题内容

我有多个进程同时将数据写入ES,而且两个进程可能同时写入具有不同值的相同密钥,这导致了以下异常:

"error" : "VersionConflictEngineException[[website][2] [blog][1]:
             version conflict, current [2], provided [1]]",
"status" : 409

请问我该如何解决以上问题,因为我必须保留多个流程


问题答案:

VersionConflictEngineException引发以防止数据丢失。_version更改文档时,elasticsearch中的每个文档都有一个递增的数字。

当您从ES查询文档时,响应中还会包含该文档的版本。当您更新相同的文档并提供版本时,索引中应该已经存在具有相同版本的文档。

如果当前版本大于更新请求中的版本,那么我们现在将获得冲突,HTTP错误代码为409, VersionConflictEngineException

在当前情况下,

版本冲突,当前2,提供了1

ES中的当前版本为2,而您的请求中的当前版本为1,这意味着某个其他线程已经修改了该文档,而您的更改正在尝试覆盖该文档。

如果是VersionConflictEngineException,则应重新获取文档并尝试使用最新的更新版本进行更新。

是否使用版本控制 /
乐观并发控制,取决于应用程序。如果您可以忍受数据丢失,则可以避免在更新请求中传递版本。



 类似资料:
  • 在一次采访中,有人问我,关于多线程,假设在同一个对象上有两个线程(线程1和线程2)。Thread-1在synchronized method1()中,Thread-2能以任何方式在java中同时进入synchronized method2()吗? 我回答“不”。这里,当Thread-1处于synchronizedmethod1()时,它必须持有对象监视器上的锁,并且只有当它退出synchroniz

  • 如果我没有错的话,Thread-1和thread-3正在进入synchronized方法,因为它有两个不同的目标对象。但是为什么线程2进入同步块呢? 请帮助我理解这一点。提前谢了。

  • 假设有一个多线程服务器将数据写入同一端口上的两个不同套接字,其中一个专用线程处理每个套接字。两个线程是否可以同时写入各自的套接字?(所谓“同时”,我指的是真正的同时性,而不仅仅是并发交错。)或者,套接字共享同一端口的事实是否意味着强制执行互斥? 一般来说,我不清楚如何在两个任意I/O流之间共享资源。我知道两个线程不能同时写入磁盘,因为磁盘本身是共享资源。然而,在套接字和端口的情况下,我没有类似的物

  • 问题内容: 程应在同一瞬间开始。我了解,如果你这样做,则下次执行之前需要花费几毫秒的时间。 可能还是不可能?线程应该在同一瞬间开始。我知道,如果你执行,则下次执行thread2.start()需要几毫秒。 这是可能的还是不可能的? 问题答案: 要完全同时(至少尽可能好)启动线程,可以使用CyclicBarrier: 这不必是,你也可以使用 这仍然无法确保它们已正确启动 在其他平台上,确切地说启动线

  • 问题内容: 操作系统是否正确处理? 还是我必须打电话给flock()? 问题答案: 虽然OS不会崩溃,并且文件系统不会被破坏,呼叫被 不 保证的广告是原子的,除非有问题的文件描述符是一个管道,数据的写入量字节或更少。标准的相关部分: 尝试写入管道或FIFO具有几个主要特征: * 原子/非原子:如果一个操作中写入的总量未与任何其他进程的数据交错,则写入是原子的。当有多个作者将数据发送到单个读者时,此

  • 我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段