grails アプリケーションに StatsD データ コレクションを追加することを考えていて、既存のライブラリとコードを調べていると、スケーラブルな優れたソリューションとは何かについて少し混乱しています。質問を少し文脈に入れるために、私はオンラインゲームタイプのプロジェクトに取り組んでおり、ゲームエンジンとのユーザーのやり取りを自然に監視します。これらは、Xユーザーがウィンドウ内でやり取りを行う特定の瞬間に自然にクラスター化されます1 ~ 2 秒、10 ~ 20 秒の一時停止後に繰り返します。
これが、今日利用可能なオプションの私の分析です。
Etsy StatsD クライアントの例
https://github.com/etsy/statsd/blob/master/examples/StatsdClient.java
「おそらく機能する可能性がある最も単純なもの」の解決策として、このクラスをプロジェクトに取り込み、シングルトン インスタンスを Spring Bean としてインスタンス化し、それを直接使用することができました。しかし、grails-statsd プラグインがクライアント インスタンスのプールを作成することに気付いた後、このアプローチのスケーラビリティについて疑問に思うようになりました。
多くのスレッドが同時にイベントを送信しようとすると、doSend
メソッドがボトルネックになる可能性があるようですが、私が理解しているように、UDP パケットを送信することの発火と忘却の性質により、これは迅速に発生し、巨大なオーバーヘッドを回避する必要があります。私たちは通常、ネットワーク接続に関連付けます。
grails-statsd プラグイン
https://github.com/charliek/grails-statsd/
withTimer
注釈やメソッドなどの優れた機能を含む grails 用の StatsD プラグインを作成した人がいます。ただし、 への呼び出しでロケールを指定するなど、サンプル実装からのいくつかのバグ修正が実装に欠けていることがわかりますString.format
。また、標準の Executor が同様の効果を達成できる場合、このためだけに apache commons-pool を引き込むこともあまり好きではありません。
java-statsd-クライアント
https://github.com/tim-group/java-statsd-client/
これは、独自の ExecutorService を維持することで非同期に動作する代替の純粋な Java ライブラリです。セットとサンプリングを含む StatsD API 全体をサポートしますが、スレッド プールとキュー サイズを構成するためのフックは提供しません。問題が発生した場合、監視などの重要ではないことについては、ヒープをいっぱいにする無限のキューを持つよりも、有限のキューと失われたイベントを好むと思います。
statsd プラグインを再生する
https://github.com/vznet/play-statsd/
現在、このコードを自分の grails プロジェクトで直接使用することはできませんが、どのように実装されているかを確認する価値はあると思いました。StatsdClient.scala
一般的に、コードが非常にクリーンで読みやすいように構築されている方法が気に入っています。また、ロケールのバグがあるようですが、それ以外の機能は etsy サンプルで完全です。興味深いことに、私が理解していない scala マジックがない限り、StatsD に送信されるデータ ポイントごとに新しいソケットが作成されるようです。このアプローチはオブジェクト プールやエグゼキュータ スレッドの必要性を適切に回避しますが、非常に効率的であるとは思えません。可能な限り早くユーザーに返される要求スレッド内で DNS ルックアップを実行する可能性があります。
質問
- 他のすべての実装が並行性を処理するための別の戦略を実装しているように見えるという事実から判断すると、Etsy の例は本番環境で使用するには少し単純すぎると思いますか?
- ここでの私の分析は正しいように見えますか?
- java/groovy の statsd に他の人は何を使用していますか?
これまでのところ、commons-pool の依存関係を受け入れることができる限り、既存の最良のソリューションは grails プラグインのように見えますが、現在、日曜日に各実装の最良の部分を組み合わせた独自のバージョンを作成することを真剣に考えています。