8

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

私たちは、アプリケーション内にコードを埋め込み、実行されるたびにアプリケーションが中央サーバーにいくつかの統計を報告することを可能にする独自の「分析システム」に取り組んできました。現在、システムは正常に動作しています。ただし、ベータ版であり、1時間あたりのヒット数は100〜200です。「ヒット」は問題なくサーバーに送信されます。ヒットの受け入れと保存を処理するための非常に堅固なAPIを構築しました(MySQL DB内)。負荷をテストしたところ、1時間あたり数十万のヒットに問題なく対応できるはずです。それは実際には問題ではありません。

問題は統計を表示することです。Mint(haveamint.com)に似たディスプレイパネルを作成しました。これは、1時間ごと、過去数日、数か月、数週間、数年などのヒットを表示します。最初のバージョンでは、ヒットテーブルからデータを取得し、その場で解釈するストレートクエリを実行しました。それはあまり長くは機能しませんでした。現在の解決策は、ヒットを処理するために「キューに入れ」、5分ごとにcronを取得してヒットを取得し、時間、日、週、月、年などごとに「キャッシュ」に並べ替えることです。これは驚くほど機能し、信じられないほどスケーラブルです。ただし、1つのタイムゾーンでのみ機能します。会社全体がこれにアクセスできるため、さまざまなタイムゾーンで数百人のユーザーに対応しています。私が「今日」と定義するもの サンノゼでの私の同僚が今日と定義しているものとは大きく異なります。現在のソリューションは1つのタイムゾーンにしかキャッシュされないため、タイムゾーン外のデータをチェックする人にとっては悪夢です。

これを修正する現在の計画は、すべてのタイムゾーン(合計40)のキャッシュを作成することです。ただし、これは、データ量に40を掛けていることを意味します...これは私にとってひどいことであり、キャッシュが非常に大きくなる可能性があることを考えると、それを掛けることは悪い考えのように聞こえます。さらに、キューを処理する場合、40個の異なるキャッシュにキューを配置するのにさらに多くのCPU時間がかかります。

他の誰かがこの問題を解決する方法についてより良い考えを持っていますか?

(長い質問でごめんなさい。説明するのは簡単ではありません。ありがとうございました!)

4

4 に答える 4

4

提案しているソリューションの冗長性が高すぎます。データを1時間ごとではなく、少なくとも30分のバケットに保存し、タイムゾーンをUTCに正規化することをお勧めします。

30分のバケットを使用すると、ユーザーが-4.5 UTCから1〜2PMの1時間ごとのデータを要求した場合、システムから5:30〜6:30PMのデータをフェッチして表示できます。データを1時間単位で保存する場合、N+0.5時間の差があるタイムゾーンのユーザーにリクエストを処理することはできません。

1日の数については、48の30分スロットを集約する必要があります。選択するスロットは、ユーザーのタイムゾーンによって決まります。

年間データを取得すると、17,520の30分バケットを集約する必要があるため興味深いものになります。その計算を容易にするために、UTC時間ごとに事前に集計された年次データを取得し、その年の最初の4.5時間の集計データを減算し、翌年の最初の4.5時間の集計データを追加することをお勧めします。これにより、基本的に1年が4.5時間シフトし、作業はそれほど多くありません。ここから作業して、システムをさらに微調整できます。

編集:カトマンズは+5.45 GMTであることが判明したため、データを30分のバケットではなく15分のバケットに保存する必要があります。

編集2:もう1つの簡単な改善は、年次集計に関するものです。これにより、国ごとに1つの集計を必要とせずに、毎回17,520バケットを追加する必要がなくなります。1月2日から12月30日までの年次データを集計します。2つの国の最大タイムゾーン差は23時間であるため、年次データ(1月2日から12月30日)を取得して、前後にいくつかのバケットを追加できます。適切に。たとえば、-5 UTCタイムゾーンの場合、0500以降の1月1日にすべてのバケットを追加し、12月31日にすべてのバケットを追加し、翌年の1月1日に0500時間まで追加します。

于 2009-04-12T17:52:45.620 に答える
2

複数のタイムゾーンに対応するソフトウェアを設計する場合、常に元のタイムゾーンの別のフィールドを使用して日付/時刻をUTCで保存し、時間をかけてUTC/タイムゾーンとの間で変換する機能を備えていると思います。夏時間調整、夏時間調整、地球の反対側から国の統計を見る人々などのさまざまなケースを処理するために、多くの手間を省くことができます。

あなたの場合、UTCでキャッシュを持ち、UTCで変換されるように要求を調整するだけで役立つはずです。統計を「今日」として保存せず、00:00:00UTCから23:59:59UTCの時間保存し、誰かがニューヨークで今日の統計を要求したら、変換を行います。

于 2009-04-12T17:34:43.730 に答える
0

私が見る限り、ここでデータウェアハウスシステムのストレージ部分を探しています(レポートはフロントエンドになります)。

実際、商用システムがそれを行っている方法は、あなたが説明したキャッシュです。テーブルを事前に集約し、それらのキャッシュを作成します。クエリを高速化する唯一の方法は、データベースシステムによるクエリの実行を減らすことです。これは、データが少なくなることを意味します。つまり、データの反復に費やされる時間が少なくなるか、インデックス内のデータが少なくなります。

そうは言っても、私は「40キャッシュソリューション」を提案します(実際には24を超えるタイムゾーンがあります)。データのコピーを作成することで、並べ替えキューを簡単に並列化できるはずです。

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

于 2009-04-12T17:35:06.023 に答える
0

この種のデータは通常、ラウンドロビンまたは循環データベースを使用して保存されます。このhttp://www.shinguz.ch/MySQL/mysql_20070223.htmlとこのhttp://techblog.tilllate.com/2008/06/22/round-robin-data-storage-in-mysql/をチェックして、方法を確認してください。それらは機能し、MySQLでそれを実装する方法

于 2009-04-12T17:48:20.670 に答える