Ruby on rails 从RubyonRails批量处理对metrics服务器的请求

Ruby on rails 从RubyonRails批量处理对metrics服务器的请求,ruby-on-rails,ruby,batch-processing,unicorn,Ruby On Rails,Ruby,Batch Processing,Unicorn,动机: 我想向我们的(定制的)metrics服务器发送连续的统计数据,并保持下载,批量处理这些请求,并在每次(比如)50个请求堆积时一次发送所有请求 要求: 跨不同进程的stat事件必须按顺序到达metrics服务器(我们使用unicorn和几个worker) 尽可能避免使用任何外部队列 优雅地处理无响应的度量服务器(可能发生) 致谢: 仅使用外部队列(memcache等)是一种简单的解决方法,但如果可以避免的话,我们还需要扩展/部署/管理另外一件事,我真的不想忍受。您最好的选择是使用专用的

动机:

我想向我们的(定制的)metrics服务器发送连续的统计数据,并保持下载,批量处理这些请求,并在每次(比如)50个请求堆积时一次发送所有请求

要求:

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


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

您最好的选择是使用专用的队列平台,因为它们提供了消息完整性和可靠的传输。此外,对于任何足够大的应用程序,消息传递是可伸缩性的关键。如果你真的需要自己从头开始烘焙,那么最好的办法就是使用赛璐珞库来处理线程管理,并给我们一个基于时间的延迟,而不是固定的队列限制

此外,当您关闭应用程序(如部署)时,队列中的任何内容都将丢失。下面是一个简单的实现方法

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
app/models/myuser.rb

def login
  METRIC_REPORTER.enqueue({:action => 'User Logged In', :data => username})
end

您最好的选择是使用专用的排队平台,因为它们提供了消息完整性和可靠的传输。此外,对于任何足够大的应用程序,消息传递是可伸缩性的关键。如果你真的需要自己从头开始烘焙,那么最好的办法就是使用赛璐珞库来处理线程管理,并给我们一个基于时间的延迟,而不是固定的队列限制

此外,当您关闭应用程序(如部署)时,队列中的任何内容都将丢失。下面是一个简单的实现方法

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
app/models/myuser.rb

def login
  METRIC_REPORTER.enqueue({:action => 'User Logged In', :data => username})
end

这看起来很有希望,我会试试看。至于您对应用程序在部署中被杀死的担忧,您认为创建一个进行刷新的at_出口能够可靠地覆盖这一点吗(当然,除非应用程序在SIGKILL中死亡)?我还没有很好地在线程上使用at_出口来保护它不将数据掉到地板上。使用诸如预写日志之类的工具可能是防止数据丢失的最佳选择。这看起来很有希望,我将尝试一下。至于您对应用程序在部署中被杀死的担忧,您认为创建一个进行刷新的at_出口能够可靠地覆盖这一点吗(当然,除非应用程序在SIGKILL中死亡)?我还没有很好地在线程上使用at_出口来保护它不将数据掉到地板上。使用诸如预写日志之类的工具可能是防止数据丢失的最佳选择。