0

动机:

我想将连续的统计信息发送到我们的(自定义构建的)指标服务器,并继续加载、批量处理这些请求并每次发送它们,例如,50 个请求已经堆积。

要求:

  • 跨不同进程的 stat 事件必须按顺序到达指标服务器(我们使用 unicorn 和几个工人)
  • 尽可能避免使用任何外部队列
  • 优雅地处理无响应的指标服务器(可能发生)

致谢:

仅使用外部队列(memcache 等)是一种简单的方法,但也是我们需要扩展/部署/管理的另一件事,如果可以避免的话,我真的不想忍受。

4

1 回答 1

3

您最好的选择是使用专用的排队平台,因为这些平台提供消息完整性和可靠的传输。此外,对于任何足够大的应用程序,消息传递是可扩展性的关键。如果您真的必须自己从头开始烘焙,最好的办法是使用赛璐珞库来处理线程管理,并使用基于时间的延迟而不是固定的队列限制。

此外,当您终止应用程序(例如部署)时,队列中的任何内容都将丢失。这是一种方法的粗略实现。

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 实例并将指标排入队列即可。

配置/初始化程序/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 回答