铁路,乘客,线程之间的通信

时间:2012-09-26 20:35:06

标签: ruby-on-rails ruby ruby-on-rails-3 passenger

我想在简单的记录器中编写将消息放入内存的文件,在后台,每隔X秒将消息写入数据库。

以下是缓冲的记录器代码:

module BufferedLogger
  def buffer
    @buffer ||= []
  end

  def log( message )
    buffer << message
  end

  def write_buffer  
    while message = buffer.shift do 
      # save the message in nosql
    end
  end

  def repeat_every( interval )
    Thread.new do
      loop do
        start_time = Time.now
        yield
        elapsed = Time.now - start_time
        sleep([interval - elapsed, 0].max)
      end
    end
  end

  extend self

  thread = repeat_every(10) do
    write_buffer
  end 

end

在开发中,这可以很好地buffer()访问@bufferlog方法中的相同write_buffer var。但是一旦我开始制作或上演环境,即一旦我落后于乘客,这@buffer似乎就不再被共享了。

任何指针?

2 个答案:

答案 0 :(得分:1)

由于passenger创建了单独的流程,以及这些流程如何持续取决于乘客的算法,我想它不会像您期望的那样运行良好。 (顺便说一句,我在这方面使用全局变量/类变量的经验很糟糕。)

我建议缓冲日志,使用像fluentd这样的记录器作为中间处理器。流利的人可以监控和收集日志。您可以编写一个插件来将收集的日志写入DB。我认为这符合您的需求。

答案 1 :(得分:0)

如果您尝试保存数据库I / O通常不是问题,那么您可能会过早地进行优化。

如果我需要缓冲数据库写入,我可能会关闭自动提交,然后在记录发生时写入记录,在n个记录之后提交,或者在n秒之后,以先到者为准。

数据库可以处理大量流量并且还具有各种内部缓冲,因此可以最大限度地减少磁盘和系统的影响。如果您的数据库与Rails主机位于同一台计算机上,那么出于性能原因,您应该将它们拆分。

否则,除非您已经收集了指标并且可以将数据库I / O指向一个问题,否则我会说编写代码并且在问题出现之前不要担心缓冲。