пятница, 27 января 2012 г.

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

Предистория

Решил привести мысли в порядок и изложить в одном месте всё то, что пришлось перелопатить за последнее время. Итак, началось все с одной очень интересной задачи, которую мне поставили на моем нынешнем месте работы (UniqSystems).

Задача

Есть несколько игровых клубов, в каждом клубе по ~200 компьютеров. Есть демон, обрабатывающий в фоне сессии клиентов. Клиент платит деньги в кассу, садится за компьютер и авторизуется. Далее компьютер шлет на сервер long-polling запрос. Сервер подписывается на новые события, по данному клиенту и запускает таймер на 30 секунд. 

Если по истечению 30 секунд не происходит никаких событий, сервер возвращает ответ "Ок" и разрывает соединение с компьютером, компьютер шлет новый запрос. Если же, например, у клиента кончаются деньги, то демон останавливает сессию. В этом случае сервер получает событие о том что сессия остановилась и шлет компьютеру команду отключить клиента.

Компьютеры и сервер общаются по протоколу XML-RPC. Запросы делятся на два типа, асинхронные (long-polling) и синхронные (авторизация, завершение сессии и т.д.)

Иллюстрация для наглядности