2016-03-23 14 views
2

同時に複数のプロセスから同時にESにデータを書き込む場合、2つのプロセスが同時に異なる値を持つ同じキーを書き込み、次のような例外が発生しました。同時に2つのプロセス書き込みを同時に行うと、同じキーでElasticSearchの競合を修正する方法

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

複数のプロセスを維持する必要があるため、上記の問題を解決する方法を教えてください。

+0

私はあなたがinsert/updateを行う直前にget by idを実行する明らかな解決策を試したと思いますか? – maximede

答えて

4

VersionConflictEngineExceptionがデータ損失を防ぐためにスローされます。 elasticsearch内のすべての文書には、文書が変更されるたびにインクリメントされる_versionの番号が付いています。

ESからドキュメントをクエリすると、レスポンスにはそのドキュメントのバージョンも含まれます。同じドキュメントを更新してバージョンを提供すると、同じバージョンのドキュメントがすでにインデックスに存在することが想定されます。

現在のバージョンは、私たちが今になるだろうことは、あなたの現在のシナリオでは409とVersionConflictEngineException

のHTTPエラーコードで、競合更新要求で1より大きいされている場合は、

バージョンの競合、電流2は、リクエストにいくつかの他のスレッドがalreadたことを意味する1であるのに対し、ES内の現在のバージョンは2である1

を提供しましたyがドキュメントを変更しました。あなたの変更がドキュメントを上書きしようとしています。

VersionConflictEngineExceptionの場合は、ドキュメントを再フェッチし、最新の更新バージョンで再度更新する必要があります。

versioning/Optimistic Concurrency Controlを使用するかどうかは、アプリケーションによって異なります。データを失うことなく暮らすことができれば、更新要求でバージョンを渡さないようにすることができます。

関連する問題