1Построение событийноуправляемого веб-сервисана RubyОнлайн: http://bit.ly/devconf-slidesИван Касатенкоivan@uniqsystems.ruh...
13 игровых клубов                                                                        2                               К...
Внутри клуба                                                     3                        Игровая консоль                 ...
Превед, участнеги!                          4Компьютер                          Сервер              Начать сессию         ...
Do you speak XML-RPC?                          5<array>  <data>    <value><i4>1404</i4></value>    <value><string>Что-нибу...
Запрос авторизации                          6                            Вернуть отказ                                   н...
Запрос «я здесь»                                                 7                                                        ...
Слишком много нитей!   8
Да придет Спаситель!   9
Ммм, спагетти...                               10... или какие демоны ждут Вас в асинхронных закоулках                    ...
Да придет Спаситель 2!                               11  Генератор             Потребитель   событий                событи...
Да придет Спаситель 2!   12         Элемент         системы
Да придет Спаситель 2!      12      Модуль тестирования           Элемент           системы
Не стоит увлекаться...                       13  ... или все ли стоит делать асинхронным?    CPU-intensive вызовы    Запро...
Не стоит увлекаться...                       13  ... или все ли стоит делать асинхронным?    CPU-intensive вызовы    Запро...
Не стоит увлекаться...                       13  ... или все ли стоит делать асинхронным?    CPU-intensive вызовы    Запро...
И рыбку съесть, и   14аквариум выпить
Асинхронный вызов                                                  15                                         Ядро системы...
Синхронный вызов                                   16Thread-обработчик                    XML-RPC сервер                  ...
Есть, из чего выбрать...   17
Реализация сервера                                18 Синхронный                       Асинхронные обработчик              ...
Server Foundation Gem                                                        19               Executor                    ...
Синхронное плавание                                            20class Auth < SyncExecutor  def sync_handle(username, pass...
Асинхронное плавание                                     21class Pipe < Executor  include SubscriberRoutines  attr_accesso...
SubscriberRoutines                             22module SubscriberRoutines  def subscribe_to(unsubscribe_proc)    raise "N...
Генератор событий                                   23class UnsubscribableTimer  def self.on_timeout(time_period, &block) ...
Пришло ли счастье?          24                             До:                     37 клиентов до                   100% з...
Спасибо   25
26         Отвечайте на мой             конкретно        поставленный ответ!«Построение событийно управляемого веб-сервиса...
Upcoming SlideShare
Loading in …5
×

Построение событийно управляемого веб-сервиса на Ruby

917 views
758 views

Published on

Однажды мы с друзьями решили построить большую ERP-систему. И одна из ее частей оказалась событийно управляемой. Как это было и что из этого вышло.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
917
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Построение событийно управляемого веб-сервиса на Ruby

    1. 1. 1Построение событийноуправляемого веб-сервисана RubyОнлайн: http://bit.ly/devconf-slidesИван Касатенкоivan@uniqsystems.ruhttp://twitter.com/sky31338
    2. 2. 13 игровых клубов 2 Клуб 4 Клуб Клуб 3 5 Асинхронная multi- master репликация Клуб Клуб 2 6Клуб Клуб Централизованная 1 Центр 7 аналитика Клуб 13 Клуб 8 Клуб Лучи добра 12 Клуб 9 Клуб Клуб 11 10
    3. 3. Внутри клуба 3 Игровая консоль XML-RPC Нас 200 Сервер клуба C XM - RP L- RP L C XM КомпьютерПианино
    4. 4. Превед, участнеги! 4Компьютер Сервер Начать сессию (START) "Я тут, что но вого?" (PIPE) Завершить сессию (END)
    5. 5. Do you speak XML-RPC? 5<array> <data> <value><i4>1404</i4></value> <value><string>Что-нибудь</string></value> <value><i4>1</i4></value> </data></array>
    6. 6. Запрос авторизации 6 Вернуть отказ нет Начать Проверить Все ОК? сессию пароль и баланс да Начать сессию Вернуть идентификатор сессии
    7. 7. Запрос «я здесь» 7 Уведомить об окончании сессии да 30-секундный циклНачать Проверить Рассчитать Кончилисьзапрос баланс остаток времени деньги? нет Таймаут нет запроса? да Вернуть баланс HTTP-соединение с клиентом и оценку поддерживается оставшегося времени
    8. 8. Слишком много нитей! 8
    9. 9. Да придет Спаситель! 9
    10. 10. Ммм, спагетти... 10... или какие демоны ждут Вас в асинхронных закоулках «Спагетти-код»Конец Делай два Делай раз Инвертированный поток выполнения Невыносимая боль тестирования
    11. 11. Да придет Спаситель 2! 11 Генератор Потребитель событий событий Элемент системы Раздел «Выделение событийно- управляемых абстраций»
    12. 12. Да придет Спаситель 2! 12 Элемент системы
    13. 13. Да придет Спаситель 2! 12 Модуль тестирования Элемент системы
    14. 14. Не стоит увлекаться... 13 ... или все ли стоит делать асинхронным? CPU-intensive вызовы Запросы, проводящие значительную часть времени в ожидании событий
    15. 15. Не стоит увлекаться... 13 ... или все ли стоит делать асинхронным? CPU-intensive вызовы Запросы, проводящие значительную часть времени в ожидании событий
    16. 16. Не стоит увлекаться... 13 ... или все ли стоит делать асинхронным? CPU-intensive вызовы Запросы, проводящие значительную часть времени в ожидании событий
    17. 17. И рыбку съесть, и 14аквариум выпить
    18. 18. Асинхронный вызов 15 Ядро системы Проверка баланса Баланс изменился Калькулятор времени Остаток времени изменилсяОбработчик запроса Генератор пульса Наступил таймаут XML-RPC сервер Появился ответ
    19. 19. Синхронный вызов 16Thread-обработчик XML-RPC сервер Появился ответ
    20. 20. Есть, из чего выбрать... 17
    21. 21. Реализация сервера 18 Синхронный Асинхронные обработчик обработчики SyncExecutor Executor Обработчик XML-RPC XMLRPC::BasicServer Приложение Rack OmgServerFoundation Thin
    22. 22. Server Foundation Gem 19 Executor SyncExecutor+ handle(response_callback, параметры) + handle(response_callback, параметры) + sync_handle(параметры)# Инициализирует callbackи и # Инициализирует callbackи, создает# возвращает управление. # блок EM.defer и возвращаетdef handle(response_callback, *params) # управление. def handle(response_callback, *params) # Выполняется в отдельном треде def sync_handle(*params)
    23. 23. Синхронное плавание 20class Auth < SyncExecutor def sync_handle(username, password, computer_number) return { :error => "Wrong password" } if username != test session = Session.create(:login => login, :computer => computer) return { :id => session.id } endend
    24. 24. Асинхронное плавание 21class Pipe < Executor include SubscriberRoutines attr_accessor :response_callback def handle(response_callback, session_id) self.response_callback = response_callback session = Session.find(session_id) subscribe_on_timeout(session) end def subscribe_on_timeout(session) subscribe_to(UnsubscribableTimer.on_timeout(30) do unsubscribe_from_everything self.response_callback.({ :result => "OK" }) end) endend
    25. 25. SubscriberRoutines 22module SubscriberRoutines def subscribe_to(unsubscribe_proc) raise "Not expecting a block!" if block_given? subscriptions << unsubscribe_proc end def unsubscribe_from_everything subscriptions.each { |s| s.() } endprotected def subscriptions @subscriptions ||= [ ] endend
    26. 26. Генератор событий 23class UnsubscribableTimer def self.on_timeout(time_period, &block) timer = EventMachine::Timer.new(time_period) { block.() } ->() { timer.cancel } endend
    27. 27. Пришло ли счастье? 24 До: 37 клиентов до 100% загрузки ЦППосле:500+ клиентов до100% загрузки ЦП
    28. 28. Спасибо 25
    29. 29. 26 Отвечайте на мой конкретно поставленный ответ!«Построение событийно управляемого веб-сервиса на Ruby» Онлайн: http://slideshare.com/test123/blaИван Касатенкоivan@uniqsystems.ruhttp://twitter.com/sky31338

    ×