3

現在、AWSインフラストラクチャを利用して最初のウェブアプリを実装し、基本を学んでいます。設計上の問題が発生したため、問題を説明するために次のシナリオを考え出しました。

WebサイトをPDFとして保存/印刷し、S3に保存するWebアプリを作成していたとします。フロントエンドには単一のフォームがあります。ユーザーは、PDFに保存するサイトのURLを入力し、[送信]をクリックします。アプリは、指定されたURLのページをPDFに印刷し、ファイルをユーザーに提示する必要があります。

アプリをスケーラブルにするために、[送信]をクリックすると、処理するURLを含むSQSメッセージがキューに送信されることを想像しました。その後、多数のワーカーがこのキューから消費し、PDFを作成してS3に保存し、S3キー/パスをSimpleDBに保存します。私が抱えている問題は、ワーカーがWebアプリに処理が完了したことをどのように通知するかです。

デザイン例: デザイン例

WebアプリはS3キーのエントリが表示されるまでSimpleDBを継続的にポーリングできると思いますが、このソリューションは少し不器用に見えます。これはパターンであると私は感じます/問題は一般的に遭遇しなければなりません。誰かがこれに対処するための一般的な方法を提供できますか?

さらに、クラウドの一般的なデザインパターンに推奨されるリソースは非常に有益です。

4

3 に答える 3

1

WebSocketのようなものを使用していない限り、これが問題になることはないと思います。ユーザーがリクエストを行うと、WebアプリケーションはSimpleDB(前述のように)をポーリングして、処理が完了したかどうか(またはエラーが発生したかどうか)を確認します。WebSocketのようなものを使用すると、処理が完了したときに通知されるようにWebアプリケーションがサブスクライブする別のキューを作成して、ブラウザーに完了したことを通知できます。

于 2012-04-07T07:49:16.887 に答える
1

あなたが述べたように、あなたは基本的にすべての問題を解決しました。ただし、フロントエンドはメディアの準備ができているかどうかを確認するためにバックエンドAPIをポーリングする必要があります。私の会社では、上記のことを行い、Webページのスクリーンショットだけでなく、PDF、オフィスドキュメントのjpgスナップショット、およびビデオとオーディオのエンコードの処理も行います。

更新にはajaxを使用し、サーバーに過度の負担をかけないように、1秒間に数回pingを実行してから、1秒に1回、数秒に1回に徐々にフォールバックするように設定します。他の選択肢は、他の答えが述べたように、WebSocketを使用することです。これは、データを「プッシュ」および「プル」できるサーバーへの永続的な接続です。ただし、ほとんどの人はajaxポーリングアプローチを使用しています。Apacheのような古いテクノロジーでは、これは何千もの接続にとって大きな問題になる可能性がありますが、Nginx、Node、中間キャッシングなどでは大きな問題ではありません。

于 2013-02-06T06:34:56.287 に答える
0

オブジェクト(マーカーなど)をS3に保存してから、単純なDBの代わりにS3をポーリングできます。このようにして、SimpleDBにストレスをかけることを回避でき、ポーリングパフォーマンスがより安定します。

このアプローチは、Webアプリインスタンスからポーリングすることも、ajaxレイヤーからポーリングすることもできます。(ただし、これらの呼び出しのエラーはサーバーに記録されないため、後者は最良の選択ではありません)

于 2015-05-22T11:38:07.173 に答える