SlideShare a Scribd company logo
1 of 16
Batch processing on
           RoR
      http://slidesha.re/k6zrSL



@SergeyMoiseev
moiseev.sergey@gmail.com
О себе


• http://moiseev--sergey.moikrug.ru/
• пишу на Ruby с 2007 года.
Задача
• Генерация контента (книг) для сайта.
• Входной формат: PDF.
• Выходной формат: SWF.
• Генератор: print2flash.
• Основной приоритет: скорость обработки
  (количество публикуемых книг в месяц).
Нюансы

• Книги поступают разного качества, часть
  из них требует многократной
  переработки.
• Print2flash может печатать не более
  одного задания за раз в пределах машины.
• Требует windows окружения.
Архитектура
• Множественные инсталляции Rails
  приложения.
• Общая база.
• Конечный автомат для контроля
  состояния задания.
• Отдельные операции - rake таски
  запускаемые по крону или планировщику
  задач.
Конфигурация
https://github.com/rubyist/aasm
include AASM
aasm_column :state
aasm_initial_state :loaded
aasm_state :loaded, :enter => :reset_retry_count, :exit=>:apply_total_pages
aasm_state :in_abbyy, :enter => :copy_to_abbyy
aasm_state :p2f_queue, :enter=>:apply_pages_count
aasm_state :in_p2fline, :enter => :copy_to_p2fline
aasm_state :p2f_printing, :enter => :p2f_print
aasm_state :print_failed, :enter => :free_p2fline
aasm_state :wait_for_confirm, :enter => :free_p2fline
aasm_state :confirmed
aasm_state :confirmed_non_full
aasm_state :on_server
aasm_state :on_server_non_full
aasm_state :published
aasm_state :published_non_full
aasm_state :hold
aasm_state :mycop
aasm_state :restarting, :after_enter => :check_avail_pdf
aasm_state :restarting_full, :exit=>:restart_full


                          Состояния конечного автомата
Структура модельного слоя
Почему не очередь

• Так казалось проще.
• Для каждого задания можно одназначно
  сказать его статус.
• Единый каталог со всем готовым на
  текущий момент контентом.
Гетерогенность




•   return unless RUBY_PLATFORM =~ /mswin/

•   Dir[File.join(work_catalog,"page*.pdf")]
Аудит
   https://gist.github.com/949049#file_book.rb
                                                             https://github.com/collectiveidea/acts_as_audited
acts_as_audited :except => [:name, :file_name]

   https://gist.github.com/949049#file_production.rake

desc "Loads files into Production line"
task :process_batch => :environment do
  Audit.as_user("rake:process_batch") do
    Book.getFromBatch unless running?("process_batch")
  end
end
    https://gist.github.com/949049#file_books_controller.rb

def restart
  if @book.restartable?
    Audit.as_user current_user do
      @book.restart_production!
    end
    flash[:notice] = 'Обработка перезапущена.'
  else
    flash[:error] = 'Перезапуск невозможен.'
  end
  redirect_to request.referer
end
http://munin-monitoring.org/




Мониторинг
namespace :munin do

  task :config do
    puts <<-CONFIG
graph_title Produced pages in last 5 minutes
graph_args -l 0
graph_vlabel pages amount
graph_category App
graph_info This graph shows amount of pages produced
texts.label Text files
docs.label Doc files
views.label View files
quotes.label Quote files
CONFIG
  exit 0
  end

  task :run => :environment do
    res = ActiveRecord::Base.connection.execute("select count(nullif(text_ready_time>(now()-'5
minutes'::interval),false)) as c0,count(nullif(doc_ready_time>(now()-'5 minutes'::interval),false)) as
c1,count(nullif(view_ready_time>(now()-'5 minutes'::interval),false)) as
c2,count(nullif(quote_ready_time>(now()-'5 minutes'::interval),false)) as c3 from pages where updated_at >
(now()-'5 minutes'::interval);")
    if res
      puts "texts.value #{res[0]['c0']}"
      puts "docs.value #{res[0]['c1']}"
      puts "views.value #{res[0]['c2']}"
      puts "quotes.value #{res[0]['c3']}"
    end
    exit 0
  end
end                            https://gist.github.com/949049#file_munin.rake
http://www.nagios.org/
namespace :nagios do
  task :abbyy_activity, [:warn, :crit] => :environment do |t, args|
    if args.warn and args.crit
      states_list = ["loaded", "in_abbyy", "p2f_queue"]
      warn_level = args.warn.to_i
      crit_level = args.crit.to_i
      warn_events = Audit.find(:all, :conditions=>["auditable_type = 'Book' and (username is null or username
ilike 'rake:%') and action = 'update' and created_at > ?", warn_level.minutes.ago])
      crit_events = Audit.find(:all, :conditions=>["auditable_type = 'Book' and (username is null or username
ilike 'rake:%') and action = 'update' and created_at > ?", crit_level.minutes.ago])
      if (crit_count = crit_events.select{|a| a['changes']['state'] and (a['changes']['state'] &
states_list).size > 1 }).empty?
        puts "CRITICAL No state changes at abbyy for #{crit_level} minutes"
        exit 2
      end
      if (warn_count = warn_events.select{|a| a['changes']['state'] and (a['changes']['state'] &
states_list).size > 1 }).empty?
        puts "WARNING No state changes at abbyy for #{warn_level} minutes"
        exit 1
      end
      puts "OK Abbyy: state changes #{warn_count.size} for #{warn_level} minutes; state changes
#{crit_count.size} for #{crit_level} minutes."
      exit 0
    else
      exit 3
    end
  end


                                 https://gist.github.com/949049#file_nagios.rake

More Related Content

What's hot

Highload осень 2012 лекция 10
Highload осень 2012 лекция 10Highload осень 2012 лекция 10
Highload осень 2012 лекция 10Technopark
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSSFDConf
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 
Особенности совместной работы Ruby и Oracle
Особенности совместной работы Ruby и OracleОсобенности совместной работы Ruby и Oracle
Особенности совместной работы Ruby и OracleNikita Shilnikov
 
Cache GitHub Continous Integration
Cache GitHub  Continous IntegrationCache GitHub  Continous Integration
Cache GitHub Continous IntegrationEduard Lebedyuk
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.FDConf
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиKirill Mokevnin
 
Building better APIs on rails
Building better APIs on railsBuilding better APIs on rails
Building better APIs on railsRoman Gorel
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practiceAlexey Lesovsky
 
Собираем по винтикам 2ГИС Web API — инструкция в картинках
Собираем по винтикам 2ГИС Web API — инструкция в картинкахСобираем по винтикам 2ГИС Web API — инструкция в картинках
Собираем по винтикам 2ГИС Web API — инструкция в картинкахDevDay
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичковOvadiah Myrgorod
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussiaNikolay Samokhvalov
 
Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Sphere Consulting Inc
 

What's hot (20)

Highload осень 2012 лекция 10
Highload осень 2012 лекция 10Highload осень 2012 лекция 10
Highload осень 2012 лекция 10
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
Особенности совместной работы Ruby и Oracle
Особенности совместной работы Ruby и OracleОсобенности совместной работы Ruby и Oracle
Особенности совместной работы Ruby и Oracle
 
Cache GitHub Continous Integration
Cache GitHub  Continous IntegrationCache GitHub  Continous Integration
Cache GitHub Continous Integration
 
Wordpress Cron
Wordpress CronWordpress Cron
Wordpress Cron
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статики
 
Building better APIs on rails
Building better APIs on railsBuilding better APIs on rails
Building better APIs on rails
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practice
 
Chef
ChefChef
Chef
 
Собираем по винтикам 2ГИС Web API — инструкция в картинках
Собираем по винтикам 2ГИС Web API — инструкция в картинкахСобираем по винтикам 2ГИС Web API — инструкция в картинках
Собираем по винтикам 2ГИС Web API — инструкция в картинках
 
Docker
DockerDocker
Docker
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичков
 
Mysql replication
Mysql replicationMysql replication
Mysql replication
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 
Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.Roman Gorel: Building better APIs on Rails.
Roman Gorel: Building better APIs on Rails.
 

Viewers also liked

A HUGE Community Health Game
A HUGE Community Health GameA HUGE Community Health Game
A HUGE Community Health GameJudy Shasek
 
Aztec 2010 images short version
Aztec 2010 images short versionAztec 2010 images short version
Aztec 2010 images short versionPip Simonian
 
Aztec 2010 images short version
Aztec 2010 images short versionAztec 2010 images short version
Aztec 2010 images short versionPip Simonian
 
Negative contribution of automatic postural control
Negative contribution of automatic postural controlNegative contribution of automatic postural control
Negative contribution of automatic postural controlRajul Vasa
 
Documentation de Doctrine ORM
Documentation de Doctrine ORMDocumentation de Doctrine ORM
Documentation de Doctrine ORMgueste89c23
 
VASA CONCEPT - To Expand The Boundaries of Centre of Mass [COM]
VASA CONCEPT  - To Expand The Boundaries of Centre of Mass [COM] VASA CONCEPT  - To Expand The Boundaries of Centre of Mass [COM]
VASA CONCEPT - To Expand The Boundaries of Centre of Mass [COM] Rajul Vasa
 
How to restore balance following stroke?
How to restore balance following stroke?How to restore balance following stroke?
How to restore balance following stroke?Rajul Vasa
 
правовая основа и организация цессии
правовая основа и организация цессииправовая основа и организация цессии
правовая основа и организация цессииRoman Leontjevski
 

Viewers also liked (14)

A HUGE Community Health Game
A HUGE Community Health GameA HUGE Community Health Game
A HUGE Community Health Game
 
Worried code
Worried codeWorried code
Worried code
 
PHOTOBOOK BODA CLAROS BERNAL MUESTRA
PHOTOBOOK BODA CLAROS BERNAL   MUESTRAPHOTOBOOK BODA CLAROS BERNAL   MUESTRA
PHOTOBOOK BODA CLAROS BERNAL MUESTRA
 
Aztec 2010 images short version
Aztec 2010 images short versionAztec 2010 images short version
Aztec 2010 images short version
 
Aztec 2010 images short version
Aztec 2010 images short versionAztec 2010 images short version
Aztec 2010 images short version
 
Proof mi álbum
Proof mi álbumProof mi álbum
Proof mi álbum
 
Negative contribution of automatic postural control
Negative contribution of automatic postural controlNegative contribution of automatic postural control
Negative contribution of automatic postural control
 
Pm
PmPm
Pm
 
Documentation de Doctrine ORM
Documentation de Doctrine ORMDocumentation de Doctrine ORM
Documentation de Doctrine ORM
 
VASA CONCEPT - To Expand The Boundaries of Centre of Mass [COM]
VASA CONCEPT  - To Expand The Boundaries of Centre of Mass [COM] VASA CONCEPT  - To Expand The Boundaries of Centre of Mass [COM]
VASA CONCEPT - To Expand The Boundaries of Centre of Mass [COM]
 
Fire your front end
Fire your front endFire your front end
Fire your front end
 
WIU Math Conference
WIU Math ConferenceWIU Math Conference
WIU Math Conference
 
How to restore balance following stroke?
How to restore balance following stroke?How to restore balance following stroke?
How to restore balance following stroke?
 
правовая основа и организация цессии
правовая основа и организация цессииправовая основа и организация цессии
правовая основа и организация цессии
 

Similar to Batch processing in rails

Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к AnsibleIvan Grishaev
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Oleg Poludnenko
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesVictor Login
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 

Similar to Batch processing in rails (20)

Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
PowerShell
PowerShellPowerShell
PowerShell
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Why Ruby?
Why Ruby?Why Ruby?
Why Ruby?
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
бегун
бегунбегун
бегун
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Not the Rails Way
Not the Rails WayNot the Rails Way
Not the Rails Way
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 

Batch processing in rails

  • 1. Batch processing on RoR http://slidesha.re/k6zrSL @SergeyMoiseev moiseev.sergey@gmail.com
  • 2. О себе • http://moiseev--sergey.moikrug.ru/ • пишу на Ruby с 2007 года.
  • 3. Задача • Генерация контента (книг) для сайта. • Входной формат: PDF. • Выходной формат: SWF. • Генератор: print2flash. • Основной приоритет: скорость обработки (количество публикуемых книг в месяц).
  • 4. Нюансы • Книги поступают разного качества, часть из них требует многократной переработки. • Print2flash может печатать не более одного задания за раз в пределах машины. • Требует windows окружения.
  • 5. Архитектура • Множественные инсталляции Rails приложения. • Общая база. • Конечный автомат для контроля состояния задания. • Отдельные операции - rake таски запускаемые по крону или планировщику задач.
  • 7.
  • 8.
  • 9. https://github.com/rubyist/aasm include AASM aasm_column :state aasm_initial_state :loaded aasm_state :loaded, :enter => :reset_retry_count, :exit=>:apply_total_pages aasm_state :in_abbyy, :enter => :copy_to_abbyy aasm_state :p2f_queue, :enter=>:apply_pages_count aasm_state :in_p2fline, :enter => :copy_to_p2fline aasm_state :p2f_printing, :enter => :p2f_print aasm_state :print_failed, :enter => :free_p2fline aasm_state :wait_for_confirm, :enter => :free_p2fline aasm_state :confirmed aasm_state :confirmed_non_full aasm_state :on_server aasm_state :on_server_non_full aasm_state :published aasm_state :published_non_full aasm_state :hold aasm_state :mycop aasm_state :restarting, :after_enter => :check_avail_pdf aasm_state :restarting_full, :exit=>:restart_full Состояния конечного автомата
  • 11. Почему не очередь • Так казалось проще. • Для каждого задания можно одназначно сказать его статус. • Единый каталог со всем готовым на текущий момент контентом.
  • 12. Гетерогенность • return unless RUBY_PLATFORM =~ /mswin/ • Dir[File.join(work_catalog,"page*.pdf")]
  • 13. Аудит https://gist.github.com/949049#file_book.rb https://github.com/collectiveidea/acts_as_audited acts_as_audited :except => [:name, :file_name] https://gist.github.com/949049#file_production.rake desc "Loads files into Production line" task :process_batch => :environment do Audit.as_user("rake:process_batch") do Book.getFromBatch unless running?("process_batch") end end https://gist.github.com/949049#file_books_controller.rb def restart if @book.restartable? Audit.as_user current_user do @book.restart_production! end flash[:notice] = 'Обработка перезапущена.' else flash[:error] = 'Перезапуск невозможен.' end redirect_to request.referer end
  • 15. namespace :munin do task :config do puts <<-CONFIG graph_title Produced pages in last 5 minutes graph_args -l 0 graph_vlabel pages amount graph_category App graph_info This graph shows amount of pages produced texts.label Text files docs.label Doc files views.label View files quotes.label Quote files CONFIG exit 0 end task :run => :environment do res = ActiveRecord::Base.connection.execute("select count(nullif(text_ready_time>(now()-'5 minutes'::interval),false)) as c0,count(nullif(doc_ready_time>(now()-'5 minutes'::interval),false)) as c1,count(nullif(view_ready_time>(now()-'5 minutes'::interval),false)) as c2,count(nullif(quote_ready_time>(now()-'5 minutes'::interval),false)) as c3 from pages where updated_at > (now()-'5 minutes'::interval);") if res puts "texts.value #{res[0]['c0']}" puts "docs.value #{res[0]['c1']}" puts "views.value #{res[0]['c2']}" puts "quotes.value #{res[0]['c3']}" end exit 0 end end https://gist.github.com/949049#file_munin.rake
  • 16. http://www.nagios.org/ namespace :nagios do task :abbyy_activity, [:warn, :crit] => :environment do |t, args| if args.warn and args.crit states_list = ["loaded", "in_abbyy", "p2f_queue"] warn_level = args.warn.to_i crit_level = args.crit.to_i warn_events = Audit.find(:all, :conditions=>["auditable_type = 'Book' and (username is null or username ilike 'rake:%') and action = 'update' and created_at > ?", warn_level.minutes.ago]) crit_events = Audit.find(:all, :conditions=>["auditable_type = 'Book' and (username is null or username ilike 'rake:%') and action = 'update' and created_at > ?", crit_level.minutes.ago]) if (crit_count = crit_events.select{|a| a['changes']['state'] and (a['changes']['state'] & states_list).size > 1 }).empty? puts "CRITICAL No state changes at abbyy for #{crit_level} minutes" exit 2 end if (warn_count = warn_events.select{|a| a['changes']['state'] and (a['changes']['state'] & states_list).size > 1 }).empty? puts "WARNING No state changes at abbyy for #{warn_level} minutes" exit 1 end puts "OK Abbyy: state changes #{warn_count.size} for #{warn_level} minutes; state changes #{crit_count.size} for #{crit_level} minutes." exit 0 else exit 3 end end https://gist.github.com/949049#file_nagios.rake

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n