2016-08-29 2 views
0

Im mit CakePhp als eine mittlere API, die Bestände in verschiedenen Marktplätzen synchronisiert und speichert die Bestellungen Geschichte. Wenn eine Bestellung auf einem Marktplatz getätigt wird, aktualisiert sie das Inventar auf dem anderen Marktplatz und umgekehrt. Im Moment habe ich eine Benachrichtigung von einem der Marktplätze, die meiner API mitteilt, dass gerade eine Bestellung eingegangen ist. Problem ist, dass diese Benachrichtigungen zwei separate Zeiten mit genau der gleichen Information zur gleichen Zeit gesendet werden. Meine API führt diese zwei separaten Aufrufe gleichzeitig aus und generiert zwei Einfügungen. Ich habe einen Code, der überprüft, dass die Order_ID aus der eingehenden Bestellung nicht auf der Tabelle dupliziert wird, in der ich die Bestellhistorie speichern, in die er eingefügt wird. ABER da die Aufrufe genau zur selben Zeit ausgeführt werden, wenn der Code prüft, ob die Order_ID existiert, erstellt er nicht zwei verschiedene Einfügungen und die Reihenfolge wird verdoppelt.CakePhp: Verhindern doppelte Aufrufe, die zur gleichen Zeit die gleichen Informationen einfügen

Die Anmeldung ist fast identisch, erhalten I dies:

{ 
    "resource":"\/orders\/order_id", 
    "user_id":"user_id", 
    "topic‌​":"orders", 
    "applicat‌​ion_id":idhere, 
    "atte‌​mpts":1, 
    "sent":"2016‌​-07-26T14:34:00.342Z‌​", 
    "received":"2016-0‌​7-26T14:34:00.338Z" 
}‌ 

Auf einer Benachrichtigung und die andere die gleichen Informationen hat, aber mit weniger als 1 Sekunde der Differenz zwischen von der ersten Benachrichtigung gesendet und empfangen werden. Damit benutze ich order_id, um die Informationen aus der Bestellung aufzurufen und in der History-Tabelle zu speichern.

Was ich brauche, ist eine Möglichkeit, entweder einen zu verzögern, so dass die Überprüfung, die ich habe funktioniert gut oder eine andere Möglichkeit, nach doppelten Order_id zu überprüfen. Es ist erwähnenswert, dass es nicht zwei Einsätze in einem Anruf ist. Es gibt zwei getrennte Benachrichtigungsaufrufe, die es für meinen Code schwierig machen, wirklich zu erhalten, wenn einer dupliziert wird. Irgendwelche Ideen was ich ausprobieren könnte?

+0

Zeigen Sie die Anforderungen, die beste eine vollständige Anfrage Dump mit einem Werkzeug wie Charles Proxy genommen. Sind sie sicher identisch? Ich bin mir ziemlich sicher, dass es möglich ist, herauszufinden, welche der beiden Anfragen zuerst eingegangen ist und sie mit einer früheren Anfrage verglichen haben. Eine andere Lösung könnte sein, die Anfragen zu stapeln und nacheinander in einer Warteschlange zu bearbeiten. – burzum

+0

Die Benachrichtigung ist fast identisch, ich empfange dies: '{"resource": "\/orders \/order_id", "user_id": "benutzer_id", "topic": "orders", "application_id": idhere, "versucht ": 1," gesendet ":" 2016-07-26T14: 34: 00.342Z "," erhalten ":" 2016-07-26T14: 34: 00.338Z "} auf einer Benachrichtigung und die andere hat die gleiche Information aber mit weniger als 1 Sekunde Unterschied zwischen gesendet und empfangen von der ersten Benachrichtigung. Damit benutze ich order_id, um die Informationen aus der Bestellung aufzurufen und in der History-Tabelle zu speichern. –

+1

Verwenden Sie die isUnique() - Regel in Ihrem Modell und fügen Sie darüber hinaus einen eindeutigen Index zur DB hinzu. Löst das nicht schon das Problem? Wenn nein, warum? Was passiert dann? Wenn Sie Transaktionen verwenden, versuchen Sie, nach jedem Speichern zu committen, so dass nicht versucht wird, mehrere mögliche doppelte Zeilen in einer Transaktion zu speichern. – burzum

Antwort

1

Es ist wenig hässlich, aber Sie könnten einen eindeutigen Index für Order_ID Spalte in der Verlaufstabelle erstellen.

Auf diese Weise wird die Einfügung mit der gleichen Order_ID nicht erfolgreich sein.

+0

Ich dachte darüber nach, hahaha, war mir aber nicht ganz sicher, ob es funktionieren würde: P Ich gebe es eine Chance. –

Verwandte Themen