Verwenden eines Skripts zum bedingten Aktualisieren eines Dokuments in Elasticsearch

8

Ich habe einen Anwendungsfall, bei dem gleichzeitige Updateanforderungen meinen Elasticsearch-Cluster treffen. Um sicherzustellen, dass ein veraltetes Ereignis (das durch eine neuere Anforderung irrelevant wird) ein Dokument nicht aktualisiert, nachdem ein neueres Ereignis den Cluster bereits erreicht hat, möchte ich ein Skript mit meinen Aktualisierungsanforderungen übergeben, um ein Feld zu vergleichen um festzustellen, ob die eingehende Anfrage relevant ist oder nicht. Die Anfrage würde so aussehen:

%Vor%

Ist der Pseudocode, den ich im "script" -Feld geschrieben habe, in Elasticsearch möglich? Wenn dem so wäre, würde ich etwas Hilfe bei der Syntax (groovy, python oder javascript) mögen.

Alle alternativen Annäherungsvorschläge würden auch sehr geschätzt werden.

    
bkahler 23.07.2015, 22:21
quelle

2 Antworten

8

Elasticsearch hat eine optimistische Steuerung des gemeinsamen Zugriffs ( + hier und hier ).

Wie es funktioniert, ermöglicht Ihnen die Update-API Zwei verwenden den Parameter version , um zu steuern, ob das Update fortgesetzt werden soll oder nicht.

Wenn Sie das obige Beispiel nehmen, würde der erste Index- / Aktualisierungsvorgang ein Dokument mit version: 1 erstellen. Dann nehmen Sie den Fall, in dem Sie zwei gleichzeitige Anfragen haben. Beide Komponenten A und B senden ein aktualisiertes Dokument, sie haben beide das Dokument mit version: 1 abgerufen und geben diese Version in ihrer Anfrage an (siehe version=1 in der folgenden Abfragezeichenfolge). Elasticsearch aktualisiert das Dokument genau dann, wenn die bereitgestellte Version mit der aktuellen identisch ist

Komponente A und B senden beides, aber die Anforderung von A ist die erste, die es erstellt:

%Vor%

An diesem Punkt ist die Version des Dokuments 2 und die Anfrage von B wird mit HTTP 409 Conflict enden, weil B annahm, dass das Dokument immer noch auf Version 1 war, obwohl die Version in der Zwischenzeit aufgrund der Anfrage von A zugenommen hat / p>

B kann das Dokument definitiv mit der neuen Version (d. h. 2) abrufen und die Aktualisierung erneut versuchen, diesmal jedoch mit ?version=2 in der URL. Wenn es der Erste ist, der ES erreicht, wird das Update erfolgreich sein.

    
Val 24.07.2015 03:54
quelle
2

Ich denke, das Skript sollte so sein:

%Vor%

oder

%Vor%     
Terran 08.10.2015 08:43
quelle

Tags und Links