スケーラブルなヒット/分析システムを設計するための最良の方法?

StackOverflow https://stackoverflow.com/questions/742073

質問

私が働いている会社は、ブラックベリーのプラットフォーム用のアプリケーションを作成します。

私たちは、私たちのアプリケーション内のコードを埋め込むと、アプリケーションは、当社の中央サーバーに戻って、彼らが実行しているたびに、いくつかの統計情報を報告させることができるようにする独自の「分析システム」に取り組んできました。現在、システムは、[OK]を動作します。しかし、それだけで一時間当たり100〜200枚のヒットとベータ版です。 「ヒット」は問題なくサーバーに送信されます。我々は(MySQLのDBで)ヒットの受け入れと保管を処理するための非常に強固なAPIを構築しました。我々は、負荷をテストしてみたし、我々は問題なく時間あたりのヒット数十万人を収容することができるはずです。それは本当に問題ではない。

問題は、統計を示しています。我々は、それは過去、日、月、週、年...など、各時間かけてヒットを示しミントさん(haveamint.com)に似た表示パネルを構築しました。拳のバージョンは、ヒットテーブルからデータを引き出し、その場でそれを解釈ストレートクエリを実行しました。それは非常に長いために動作しませんでした。私たちの現在のソリューションは、ヒットを処理するために、「キューに登録」していることであり、我々はcronのは5分ごとなど...ヒットを取って、各時間、日、週、月、年のための「キャッシュ」にそれらを並べ替えて来ています。これは素晴らしい作品と、それは非常にスケーラブルです。しかし、それだけで1つのタイムゾーンのために動作します。会社全体がこれへのアクセス権を持っているので、私たちは、さまざまなタイムゾーンにある数百のユーザーを扱っています。私はサンノゼに「今日」として定義して、ロンドンでの私の同僚は、今日のように定義するものよりも大きく異なります。現在のソリューションは、唯一の1つのタイムゾーンにキャッシュされるので、それが私たちのタイムゾーンの外にデータをチェックだ、誰にとっては悪夢だ。

この問題を解決するために当社の現在の計画は、すべてのタイムゾーン(計40)のためにキャッシュを作成することです。しかし、それは我々が40でデータ量を乗算している...それは私にひどいことを意味し、キャッシュはそれだけで悪いアイデアのように聞こえる乗じ、非常に大きくなる可能性があることを考えるでしょう。私たちは、キューを処理するために行くときプラス、40種類のキャッシュにそれらを置くために多くのCPU時間を取るために起こってます。

他の任意の一つは、この問題を解決する方法の良いアイデアを持っていますか?

(このような長いquestion..itのため申し訳ありませんが、説明するのは、正確には容易ではありません。おかげですべての!)

役に立ちましたか?

解決

あなたが提案しているソリューションは、あまりにも多くの冗長性を持っています。私はあなたがUTCに正規化する代わりに、時間単位の時間帯の少なくとも30分のバケットにデータを格納お勧めします。

30分のバケットでは、ユーザーが1人の1時間ごとのデータを要求した場合 - お使いのシステムから午後6時30分、それを表示 - あなたは午前5時30分のデータを取り込むことができる-4.5 UTCから2PM。あなたは1時間単位でデータを保存する場合は、N + 0.5時間の違いとタイムゾーンのユーザーへのリクエストを処理することはできません。

毎日の数字のためには、48時間半スロットを集約する必要があります。選択するスロットがユーザのタイムゾーンによって決定されるであろう。

あなたは17520時間半バケットを集約する必要が終わるので、あなたが年次データを取得する場合

これは面白いです。その計算を簡単にするために、私はあなたがUTC時間当たりの事前集計の年次データと年の4.5時間の最初のための減算の集計データを取得し、来年の最初の4.5時間の集計データを追加することをお勧め。これは、基本的に4.5時間で全体の年間シフトするとの仕事はそれほどではありません。ここからの作業は、システムをさらに微調整することができます。

EDIT:あなたの代わりに30分バケットの15分バケットにデータを格納する必要がありますので、カトマンズは5.45 GMTで判明。

EDIT 2:もう一つの簡単な改善が周りので、あなたが国ごとに1つの集約を必要とせずに17520のバケット毎時間などを追加する必要はありません年間集約されます。 1月2日からの年間データを集約 - 前と後にいくつかのバケットを追加 - 任意の二国間の最大時差は23時間ですので、12月30には、これはあなたが(12月30日1月2日)の年次データを取ることができることを意味し適切に。 -5 UTCタイムゾーンのためにたとえば、あなたは、0500の後12月31日上のすべてのバケットを1月1日にすべてのバケットを追加し、1月1日0500時間まで次の年になります。

他のヒント

複数のタイムゾーンに触れたソフトウェアを設計する際は、

、私はいつも UTCにあなたの日付/時刻を格納するでしょうねオリジナルのタイムゾーンのために別のフィールドでと時間がかかり、UTC /タイムゾーンにしてから、それを変換する関数を持っています。あなたは一日スイッチ、夏時間、地球の反対側からの国からの統計情報を見ている人々のさまざまなケースを処理し、ために自分に手間を節約できますように....

あなたのケースでは、UTCでのキャッシュを持つとちょうどUTCに変換する要求を調整することに役立つはずです。 59UTCと誰かがニューヨークで、今日の統計情報を要求する場合、変換を行う

:59:23に00UTC:00:00時間のためにそれを保存し、「今日」であるとのstatを保管しないでください。

私の知る限り見ることができるように、あなたは(あなたのレポートは、フロントエンドになります)、ここで、データウェアハウスシステムの記憶部を探しています。

あなたのテーブルを事前集計し、それらのキャッシュを作成します。

実際には、商用システムはそれをやっている方法は、あなたが説明したキャッシュです。あなたのクエリを加速するための唯一の方法は、データベースシステムは彼らのために以下を行うようにすることです。これは、順番に、データや指標の少ないデータを反復処理に費やす時間を意味少ないデータを、意味している。

それは私が「40キャッシュソリューション」を提案する(実際には24の以上のタイムゾーンがある)だろうどちらか、と述べました。あなたは自明のデータのコピーを作成することにより、ソートキューを並列化することができる必要があります。

これを実行する別の方法は、時間の単位でキャッシュし、その後、(あなたのタイムゾーンがこれを必要とする場合または30分)日に時間を集約することであろう。これは、あなたの毎日のキャッシュより細かい粒度ではなく、元のデータよりも粗い粒度でキャッシュを意味します。

この種のデータは、通常、ラウンドロビン又は円形のデータベースを使用して格納されています。この http://www.shinguz.ch/MySQL/mysql_20070223.html にチェックし、このます。http://techblog.tilllate。 COM / 2008/6月22日/ラウンドロビン・データ・ストレージ・イン・mysqlの/ のは、彼らがどのように動作するかとMySQLの下でそれを実装する方法を知っている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top