質問
ゲートウェイに送信された SMS メッセージを取得する Web サイトを開発しています。ゲートウェイには、次の形式のリクエストを使用して API 経由でアクセスします。
http://www.smsgateway.com/?login=myusername&password=mypassword&lasttime=1236164238
メッセージが最後にダウンロードされた時刻を追跡する必要があることに注意してください。その時刻以降に受信したメッセージのみが返されます。
問題は、サーバー間に約 5 分の時差があることです。何が起こっているかは次のとおりです。
-> ユーザーが SMS を送信します。ゲートウェイ サーバーのタイムスタンプは午前 11 時です (実際の時刻は午前 10 時 55 分だとします)。
->サーバーは 10.56 以降に送信されたすべてのメッセージを要求します - 上記のメッセージを受信し、データベースに追加します
->サーバーは 10.58 以降に送信されたすべてのメッセージを要求します。タイムスタンプが午前 11 時であるため、上記のメッセージを受信して再度追加します。
->サーバーは 11:00 に別のリクエストを送信します - メッセージを受信してデータベースに再度追加します
したがって、私の問題は、1つの元のメッセージが3回受信されていることです。
サーバーの時刻を変更することは可能ですが、リモート サーバーは変更できません。
メッセージがすでにデータベースにあるかどうかを確認せずに、この問題を処理するにはどうすればよいでしょうか?
解決
10.56 以降に送信されたメッセージを受信した場合は、最後のメッセージ時刻を確認します。午前11:00に言ってから、次の電話は、サーバーの時間の午前11時まで既に受け取っていたため、午前11:00にのみ送信します。こうすることで投票数を減らすことができます。これは、サーバーの時間が逆の状態にある場合でも機能します。
例)最後のメッセージの時刻を確認します。
次回のポーリングでは、最後のメッセージの時刻からチェックします。
他のヒント
基本的な設定は危険で、たとえ 2 つのサーバーの時計を同期させていたとしても、タイムスタンプを共有するメッセージ (タイムスタンプの解像度とメッセージ トラフィックに応じて、メッセージの数が多くなったり少なくなったりする可能性があります) が失われるか倍増することになります。
メッセージにアクセスするには別の API が必要になるか、メッセージをリクエストして重複するメッセージをリクエストする必要があります。 latest_processed_timestamp - 1
そしてあなたの側で重複を整理してください。