1

私は、 Web サーバーC# mobileとの主要な対話を必要とするアプリケーションに取り組んでいます。PHPただし、接続はcellular network. このネットワークは、ランダムなタイミングでリクエストをドロップする可能性があります。以前の「オフライン モード」アプリケーションで経験した問題は、リクエストがタイムアウトになったときに、サーバーがそのリクエストを処理済みである場合と、処理していない場合があることです。リクエストを複数回送信すると重複が生じる場合、これは問題です。私はこれを歩いていて、次のアイデアを思いつきました。

  • UniqueRequestID: 1モバイルは、リクエストとともに送信されるようにヘッダー値を設定します。
  • リクエストを受信すると、PHP サーバーはUniqueRequestIDを現在のユーザー セッションに追加します。$_SESSION['RequestID'][] = $headers['UniqueRequestID'];
  • idサーバーは、現在のセッションに が存在する場合は true を返し、存在しない場合は false を返す GetRequestByID を実装します。または、キャッシュされたリクエストの結果を返すこともできます。

これは、リクエストがサーバーに正常に接続されたかどうかを確認するためのある程度信頼できる方法のようです。モバイルでは、サーバーへの再接続時に、リクエストが受信されたかどうかを確認します。その場合は、その保留中をスキップしoffline messageて、次の保留に進みます。

質問 ここで車輪を再発明しましたか? この方法は失敗しやすいですか (または、うさぎの穴に落ちますか)? より良い方法/代替手段はありますか?

-私はこれをここで他の開発者に売り込みましたが、これは非常に単純に見え、この「システム」がすでにどこかに存在する可能性が高いことを暗示していると考えました。

-今日、私の Google スキルが役に立たなかったら申し訳ありません。

4

1 に答える 1

1

あなたが正しく述べたように、この問題は新しいものではありません。さまざまなレベルでそれを解決するための複数の試みがありました。

輸送レベル

HTTP トランスポート プロトコル自体は、信頼できるデータ転送のためのメカニズムを提供しません。その理由の 1 つは、HTTP がステートレスであり、以前の要求と応答をあまり気にしないことです。IBM は、HTTPR と呼ばれる、HTTP に基づいた信頼性の高いトランスポート プロトコルを作成しようと試みてきましたが、普及することはありませんでした。詳細については、こちらをご覧ください。

メッセージング レベル

世に出回っているほとんどの Web サービスは、HTTP をトランスポート プロトコルとして使用し、その上に SOAP メッセージング プロトコルを使用しています。アプリケーション レベルのメッセージング プロトコルで一定レベルの信頼性とセキュリティも保証する必要がある場合、SOAP over HTTP では十分ではありません。これが導入された理由WS-ReliabilityWS-ReliableMessagingプロトコルです。これらのプロトコルを使用すると、ソフトウェア コンポーネント、システム、またはネットワークに障害が発生した場合でも、SOAP メッセージを分散アプリケーション間で確実に配信できます。同時に、追加のセキュリティを提供します。これらのプロトコルの詳細については、こちらこちらをご覧ください。

あなたのソリューション

メッセージがまだ処理されていないことを確認する簡単な方法が必要な場合、アプローチに問題はないと思います。セッションの代わりにデータベースを使用して、各リクエストの処理結果を保存することをお勧めします。使用$_SESSION['RequestID'][]すると、セッションが失われた場合に問題が発生します (ユーザーが特定の時間オフラインになった、サーバーが再起動された、またはクラッシュしたなど)。また、セッションの代わりにデータベースを使用する場合は、Web サーバーを追加するだけで、後で簡単にスケールアップできます。

于 2014-02-11T16:03:37.567 に答える