1

アプリのプロトタイプを作成するタスクが与えられました。私が思いついたソリューションの概念はせいぜい臭いように見えるので、私はまだコードを持っていません...

問題:

このソリューションは、AzureSQLdb-sに格納されている大量のデータを処理するさまざまなAzureプロジェクトで構成されています。発生するほとんどすべてのアクションは、blobストレージにgzip圧縮されたログファイルを作成します。つまり、ログエントリごとに1つの.gzファイルです。

また、これらのログファイルの読み取り、フィルター処理、および並べ替えができる小さなデスクトップ(WPF)アプリも必要です。

ロギングの実行方法にはまったく影響がないので、これを変更してこの問題を解決することはできません。

私が(概念的に)思いついた可能な解決策:

1:

  • BLOBストレージに接続します
  • コンテナを開く
  • ブロブの読み取り/ダウンロード(フィルターを適用)
  • .gzファイルを解凍します
  • 読み取りと表示

これに伴う問題は、フィルターによっては、ダウンロード(低速)および処理(これもそれほど迅速ではない)する大量のデータを意味する可能性があることです。私はこれを使用可能なアプリケーションとして本当に見ることができません。

2:

  • WCFまたはRESTサービスを実行するWebロールを作成します
  • サービスはフィルターパラメーターやその他のものを取得し、データを含む単一のxml / jsonファイルを返します。処理は、クラウド上で行われます。

このアプローチでは、これらのファイルが多数ある場合、これらのファイルの解凍で問題が発生しますか(サービスが実行されているストレージ/コンピューティングインスタンスで余分なスペースを占有します)。

編集:私がフィルターとは、日付と重大度(情報、警告、エラー)によって結果を制限することを意味します。.gzファイルは、これを非常に簡単にする構造で保存されます。ファイル自体を調べてフィルタリングすることはしません。

3:

  • 私が知らない他のエレガントでシンプルなソリューション

また、表示されたログをアプリにリアルタイムで更新させる方法も必要です。これは、blobストレージ/サービスへの繰り返しのリクエストで行う必要があると思います。


これは、「コードを教えて」という質問の1つではありません。ベストプラクティス、または同様の問題に有効な同様のソリューションに関するアドバイスを探しています。また、問題に対するアプローチは人によって異なるため、これは「誰も正解ではない」質問の1つになる可能性があることも知っていますが、プロトタイプを作成する時間があるので、さまざまなことを試して、正しいものを選択します。答えは、実際に何かを構築してテストするまでに少し時間がかかったとしても、うまくいった解決策を示したもの、または正しい方向に私を導いたものになります。

4

2 に答える 2

1

私が理解しているように、特定の方法 (gzip) でフォーマットされた一連のログ ファイルが Azure Blob Storage にあり、それらを表示したいと考えています。

これらのファイルの大きさは? ログ ファイル内のすべての情報を表示していますか?

これがログ ファイルである場合、それは静的で履歴的なものであると仮定します...つまり、ログ/gzip ファイルが作成されると、変更することはできません (ブログ ストレージに出力されると、gzip ファイルは更新されません)。新しいファイルしか作成できません...

ワンソリューション


表示できるように、定期的に出てブロブ ストレージをスキャンし、永続化された "データベース" を構築するワーカー ロール/ジョブ プロセスを作成してみませんか。これの良いところは、WPF アプリまたは UI でログ ファイルを抽出するための解凍/ビジネス ロジックを配置していないことです。

1) ワーカー ロールに Azure Blob Storage のログ ファイルをスキャンさせる 2) 処理されたログ ファイルと現在の "状態" を追跡する何らかのメカニズムを用意する 最後の gzip ファイルの UTC 日付 3) すべての解凍を行う/Worker ロールでログ ファイルを抽出 4) Worker ロールにアクセス用の SQL データベース、Azure テーブル ストレージ、または分散キャッシュにコンテンツを配置させる 5) アクセスは REST サービス (ASP.NET Web API/ノード) によって行うことができます.js など)

これをスケールアウトする必要がある場合は、さらに追加することができます。たとえば、これをジョブとして実行して、特定の時間からすべてのログ ファイルをやり直す (すべてを更新する) ことができます。あなたのデータのサイズがわからないので、それが実現可能かどうかはわかりません。

これの良いところは、ジョブを (一晩で) スケーリングする必要がある場合、2、3、6 個のワーカー ロールをスピンアップできることです。コンテンツを抽出し、結果を Service Bus または SQL に挿入されるストレージ キューに渡します。 、アクセス用のキャッシュなど。

于 2012-11-07T14:02:20.633 に答える
1

BLOB を格納するだけでは不十分です。フィルタリングするメタデータは、すべてのメタデータを簡単にフィルタリングして取得できる別の場所に保存する必要があります。したがって、これを 2 つの問題に分割する必要があると思います。

A. すべての「gzip」をメタデータとともに効率的に一覧表示する方法と、これらの gzip にフィルタを適用してクライアント アプリケーションに表示する方法を教えてください。

ソリューション

  • BLOB: BLOB の一覧表示は遅く、フィルター処理はできません (月ごと、週ごと、またはユーザーごとにコンテナーにグループ化できますが、それはフィルター処理ではありません)。
  • テーブル ストレージ: 非常に高速ですが、検索は低速です (PK と RK のみがインデックス化されます)。
  • SQL Azure: "gzip" のリストと他のメタデータ (gzip を作成したユーザー、いつ、合計サイズなど) を含むテーブルを作成できます。いくつかの優れたインデックスを持つストアド プロシージャを使用すると、検索を非常に高速にできますが、SQL Azure は最もスケーラブルなソリューションではありません
  • Lucene.NET:アプリケーションで Lucene.NET を使用できるようにする Windows Azure 用のAzureDirectoryがあります。これは、「ドキュメント」(メタデータ) のインデックス作成を可能にする超高速検索エンジンであり、「gzip」のリストをフィルタリングして返すのに最適です。

更新:日付と重大度でのみフィルタリングするため、Blob と Table のオプションを確認する必要があります。

  • BLOB: 日付と重大度 (20121107-low、20121107-medium、20121107-high ...) ごとにコンテナーを作成できます。データ + 重大度あたりの BLOB が多すぎないと仮定すると、コンテナーから直接 BLOB を単純に一覧表示できます。ここで発生する可能性のある唯一の問題は、ユーザーが先週 (7 日間) から重大度の高いすべてのアイテムを表示したいということです。これは、7 つのコンテナー内の BLOB を一覧表示する必要があることを意味します。
  • テーブル: テーブル ストレージやデータベースはオプションではないと言いますが、テーブル ストレージを検討してください。パーティションと行キーを使用すると、非常にスケーラブルな方法で簡単にフィルター処理できます ( CompareToを使用して、アイテムの範囲を取得することもできます (たとえば、11 月 1 日から 11 月 7 日までのすべてのレコード)。Table Storage では、データの複製は完全に許容されます。 include some data from the gzip in the Table Storage entity in order to show it in your WPF application (フィルタリング後に表示したい最も重要な情報). これは、ユーザーが開いた/ダブルしたときにのみ blob を処理する必要があることを意味しますWPF アプリケーションでレコードをクリックします

B. アプリケーションで「gzip」を表示するにはどうすればよいですか (たとえば、検索結果をダブルクリックした後)

ソリューション

  • WPF アプリケーションからストレージ アカウントに接続し、ファイルをダウンロードして解凍し、表示します。つまり、ストレージ アカウントを WPF アプリケーションに保存する (または SAS またはコンテナー ポリシーを使用する) 必要があり、ファイルの保存方法のバックエンドで何かを変更する場合は、. WPF アプリケーション。
  • Web ロールに接続します。この Web ロールは、BLOB ストレージから BLOB を取得し、解凍してネットワーク経由で送信します (または、転送を高速化するために圧縮して送信します)。ファイルの保存方法が変わった場合は、Web ロールを更新するだけで済みます
于 2012-11-07T14:02:37.863 に答える