2016-08-29 6 views
0

CakePhpを異なるマーケットプレイスのインベントリを同期させ、注文履歴を保存する中間APIとして使用します。 1つのマーケットプレイスで注文が行われると、それは他のマーケットプレイスの在庫を更新し、その逆も同様です。今、私は注文を受け取ったばかりのマーケットプレイスから通知を受けています。この通知は、同じ情報を使って2回に分けて同時に送信されます。私のAPIは、この2つの別々の呼び出しを同時に実行し、2つの挿入を生成します。着信オーダーのOrder_IDが、それが挿入される注文履歴を保存するテーブルに重複していないことを確認するコードがあります。しかし、呼び出しが正確に同じ時刻に行われているため、コードがOrder_IDが存在するかどうかをチェックすると、2つの異なる挿入が作成され、その順序が重複します。つの通知にCakePhp:同時に同じ情報を挿入する重複呼び出しを防止する

{ 
    "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" 
}‌ 

、他方は同じ情報を有しているが送信され、最初の通知から受信との間の差の1秒、次いで以下で:

通知は、私はこれを受け、ほぼ同一です。私はorder_idを使って注文から情報を呼び出し、それを履歴テーブルに保存します。

私が必要とするのは、発生したものを遅らせるための方法です。これは、正常に動作しているか、重複したorder_idをチェックする別の方法です。それは1つの呼び出しで2つの挿入ではないことに注意する価値があります。 2つの別々の通知呼び出しがあります。これにより、コードが複製されたときに実際にコードが取得されにくくなります。私は何を試すことができる任意のアイデア?

+0

リクエストを表示します。チャールズプロキシのようなツールを使用して、リクエストをダンプするのに最適です。彼らは確かに同一ですか?私は、両方のリクエストのどちらが先に来て、前のリクエストと比較しているのか把握することは可能でしょうか。もう1つの解決策は、要求を積み重ねて、それを互いに順番にキューに処理することです。 – burzum

+0

通知はほぼ同じです: '{"リソース": "\ /オーダー\ /オーダーID" "ユーザーID" "トピック": "オーダー"、 "アプリケーションID":idhere、 "試行":1、"送信済み ":" 2016-07-26T14:34:00.342Z "、"受信済み ":" 2016-07-26T14:34:00.338Z "} 'と同じ情報を持ちますが、第1の通知からの送受信の差が1秒未満である。私はorder_idを使って注文から情報を呼び出し、それを履歴テーブルに保存します。 –

+1

モデルでisUnique()ルールを使用し、その上にユニークなインデックスをDB自体に追加します。これはすでに問題を解決していませんか?いいえ、なぜですか?その後何が起こるのですか?トランザクションを使用すると、各保存後にコミットしようとするので、複数の可能な重複行を1つのトランザクションに保存しようとしません。 – burzum

答えて

1

ちょっと醜いですが、履歴テーブルのOrder_ID列にユニークなインデックスを作成できます。

このように、同じOrder_IDを持つ挿入は成功しません。

+0

私はそのハハハを考えましたが、それがうまくいくかどうかは確かではありませんでした。 –

関連する問題