0

動機:

私は、継続的な統計を (カスタム構築された) メトリクス サーバーに送信し、ロード ダウンを維持し、それらのリクエストをバッチ処理して、たとえば 50 件のリクエストが積み重なるたびに一度に送信したいと考えています。

要件:

  • さまざまなプロセスにまたがる統計イベントは、順番にメトリクス サーバーに到達する必要があります (いくつかのワーカーでユニコーンを使用します)。
  • 可能な限り、外部キューの使用を避ける
  • 応答しないメトリック サーバーの適切な処理 (発生する可能性があります)

謝辞:

外部キュー (memcache など) を使用するだけで簡単に解決できますが、スケーリング/デプロイ/管理に必要なもう 1 つのこともあり、回避できる場合は我慢したくありません。

4

1 に答える 1

3

メッセージの整合性と信頼性の高いトランスポートを提供するため、専用のキューイング プラットフォームを使用することをお勧めします。さらに、十分に大きなアプリケーションの場合、メッセージングは​​スケーラビリティの大きな鍵となります。本当に最初から自分で焼く必要がある場合は、Celluloid ライブラリを使用してスレッド管理を処理し、固定のキュー制限ではなく時間ベースの遅延を使用することをお勧めします。

また、アプリを強制終了したとき (デプロイなど) にキューにあったものすべて失われます。これを行う 1 つの方法の大まかな実装を次に示します。

class MetricReporter
  include Celluloid

  def initialize
    @queue = Queue.new
  end

  def enqueue(metric)
    @queue << metric
    empty! if @queue.length > 50
  end

  def empty!
    until queue.length.zero?
      metric = @queue.pop
      #process metric
    end
  end
end

これは非常に簡単に使用できます。イニシャライザで MetricReporter のインスタンスを作成し、それにメトリクスをエンキューするだけです。

config/initializers/mymetrics.rb

METRIC_REPORTER = MetricReporter.new

アプリ/モデル/myuser.rb

def login
  METRIC_REPORTER.enqueue({:action => 'User Logged In', :data => username})
end
于 2012-07-17T20:39:37.257 に答える