动机:
我想将连续的统计信息发送到我们的(自定义构建的)指标服务器,并继续加载、批量处理这些请求并每次发送它们,例如,50 个请求已经堆积。
要求:
- 跨不同进程的 stat 事件必须按顺序到达指标服务器(我们使用 unicorn 和几个工人)
- 尽可能避免使用任何外部队列
- 优雅地处理无响应的指标服务器(可能发生)
致谢:
仅使用外部队列(memcache 等)是一种简单的方法,但也是我们需要扩展/部署/管理的另一件事,如果可以避免的话,我真的不想忍受。
动机:
我想将连续的统计信息发送到我们的(自定义构建的)指标服务器,并继续加载、批量处理这些请求并每次发送它们,例如,50 个请求已经堆积。
要求:
致谢:
仅使用外部队列(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
这很容易使用,只需在初始化程序中创建一个 MetricReporter 实例并将指标排入队列即可。
配置/初始化程序/mymetrics.rb
METRIC_REPORTER = MetricReporter.new
应用程序/模型/myuser.rb
def login
METRIC_REPORTER.enqueue({:action => 'User Logged In', :data => username})
end