我想在简单的记录器中编写将消息放入内存的文件,在后台,每隔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()
访问@buffer
和log
方法中的相同write_buffer
var。但是一旦我开始制作或上演环境,即一旦我落后于乘客,这@buffer
似乎就不再被共享了。
任何指针?
答案 0 :(得分:1)
由于passenger
创建了单独的流程,以及这些流程如何持续取决于乘客的算法,我想它不会像您期望的那样运行良好。 (顺便说一句,我在这方面使用全局变量/类变量的经验很糟糕。)
我建议缓冲日志,使用像fluentd这样的记录器作为中间处理器。流利的人可以监控和收集日志。您可以编写一个插件来将收集的日志写入DB。我认为这符合您的需求。
答案 1 :(得分:0)
如果您尝试保存数据库I / O通常不是问题,那么您可能会过早地进行优化。
如果我需要缓冲数据库写入,我可能会关闭自动提交,然后在记录发生时写入记录,在n个记录之后提交,或者在n秒之后,以先到者为准。
数据库可以处理大量流量并且还具有各种内部缓冲,因此可以最大限度地减少磁盘和系统的影响。如果您的数据库与Rails主机位于同一台计算机上,那么出于性能原因,您应该将它们拆分。
否则,除非您已经收集了指标并且可以将数据库I / O指向一个问题,否则我会说编写代码并且在问题出现之前不要担心缓冲。