Работя върху приложение, базирано на машина за събития, което периодично проверява за промени в съхранени документи на MongoDB.
Един опростен кодов фрагмент може да изглежда така:
require 'rubygems'
require 'eventmachine'
require 'em-mongo'
require 'bson'
EM.run {
@db = EM::Mongo::Connection.new('localhost').db('foo_development')
@posts = @db.collection('posts')
@comments = @db.collection('comments')
def handle_changed_posts
EM.next_tick do
cursor = @posts.find(state: 'changed')
resp = cursor.defer_as_a
resp.callback do |documents|
handle_comments documents.map{|h| h["comment_id"]}.map(&:to_s) unless documents.length == 0
end
resp.errback do |err|
raise *err
end
end
end
def handle_comments comment_ids
meta_product_ids.each do |id|
cursor = @comments.find({_id: BSON::ObjectId(id)})
resp = cursor.defer_as_a
resp.callback do |documents|
magic_value = documents.first['weight'].to_i * documents.first['importance'].to_i
end
resp.errback do |err|
raise *err
end
end
end
EM.add_periodic_timer(1) do
puts "alive: #{Time.now.to_i}"
end
EM.add_periodic_timer(5) do
handle_changed_posts
end
}
Така че на всеки 5 секунди EM преглежда всички публикации и избира променените. За всяка променена публикация той съхранява comment_id в масив. Когато е готово, този масив се предава на handle_comments
, който зарежда всеки коментар и прави някои изчисления.
Сега имам някои трудности в разбирането:
Знам, че този цикъл load_posts->load_comments->calculate отнема 3 секунди в Rails конзола с 20 000 публикации, така че няма да е много по-бързо в EM. Планирам метода
handle_changed_posts
на всеки 5 секунди, което е добре, освен ако броят на публикациите не се увеличи и изчислението не отнеме повече от 5 секунди, след които същото изпълнение се планира отново. В такъв случай скоро ще имам проблем. Как да избегнем това?Вярвам на em-mongo, но не се доверявам на знанията си за ЕМ. За да наблюдавам, че EM все още работи, аз
puts
клеймо за време всяка секунда. Това изглежда работи добре, но става малко неравномерно на всеки 5 секунди, когато изчислението ми се изпълнява. Това знак ли е, че блокирам цикъла?Има ли някакъв общ начин да разбера дали блокирам цикъла?
Трябва ли да усъвършенствам своя процес на eventmachine с -19, за да му дам най-добрата операционна система преди винаги?