Friday, December 23, 2011

Java, Erlang and Rock'n'Roll

Есть у меня игровой проект под названием Russian Roulette Pro. Адрес Вконтакте http://vkontakte.ru/app2417844, в фейсбуке http://apps.facebook.com/russianroulettepro. Это клиент-серверное приложение. Клиент написан на Adobe Flex, а сервер на Java, используя Netty. Соединение между Adobe Flex и Java сокетное. Но как известно, много кто играет в игры из офиса, где стоят всякие прокси-сервера, которые поддерживают только HTTP протокол. Тут я решил сделать соединение long-polling. Вменяемую реализацию для Netty я не нашел, да и шибко не хотелось, поэтому решил я заюзать модный ныне Erlang для реализации long-polling соединения. Начал искать готовые решения и таки нашел: https://github.com/yrashk/socket.io-erlang. Я вначале обрадовался, что вот она рыба моей мечты, но тестирование показало, что там блокирующая архитектура, в общем решил сделать форк https://github.com/sinnus/socket.io-erlang/tree/dev. Пофиксил некоторые баги, убрал блокирующий процесс. Этот сервер использует протокол Socket.IO (http://socket.io/) версии 0.6. Готовый клиент существовал только для JavaScript, а мне нужен был Adobe Flash клиент. Долго думать не стал и запилил клиент для флеша: https://github.com/sinnus/socket.io-flash. Он поддерживает long-polling и Websocket. Websocket, конечно, работает через сокетные соединения со всеми вытекающими последствиями, как настройка отдачи полиси через сокет. Я в своей рулетке решил воспользоваться только long-polling. Теперь встал вопрос, а как же все это дело прицепить к существующему серверу? Не выбрасывать же существующий код на джаве, не для того он писался, чтобы его выкидывать на помойку! Решение было простое - сделать socket.io-erlang  проксирующим сервером. Клиент подцепляется к 80 порту по Socket.IO протоколу, который слушает erlang. Erlang процесс создает сокетный коннект к Java серверу и затем редиректит сообщения от клиента на Java сервер. В общем, получился такой nginx в мире long-polling - socket. Решение уже работает несколько месяцев и пока проблем не было. Протестировано под всеми браузерами, полет тоже нормальный. Как говорится, Erlang your penis!

Monday, October 24, 2011

How to use JRebel in Eclipse with Jetty plugin

Add VM arguments:
-javaagent:${JRABEL_HOME}/jrebel.jar -Drebel.log=true ${jrebel_args}

Wednesday, August 31, 2011

My own game on facebook!!!

My own game (Russian Roulette Pro) on facebook!!!

Play it!

Tuesday, May 03, 2011

Москва - Минск или как задосить РЖД

Купили (ключевое слово) билеты из Москвы до Минска через интернет. Как обычно приехали на вокзал за час до отправления, чтобы их получить через терминал. Вместо четырех работающих было только три рабочих. За каждым простералась очередь из примерно двадцати человек. Хочется сказать, что терминалы эти достаточно не эргономичные и тормозные при печати билетов, т.е. на получение билета в среднем уходило около пяти - семи минут. Пассажири подтягивались. И вдруг, внезапно, один из терминалов перестает работать, видать не выдержал DoS-атаки, но умный админ (какой-то важный мужик) заранее начал налаживать третий! Такой лоад балансир. Но и он пал под натиском желающих попутешествовать вместе с РЖД. Разьяренные пассажири ломанулись к администратору Белорусского вокзала. Громко возле него кричали и махали руками, пока из администраторской не повеяло валерьнкой и полицейскими. Собственно, администратор вынесла вердикт, что они ни в чем не виноваты и сами дураки, что не успели получить КУПЛЕННЫЕ билеты. Пришлось все-таки стоять одну очередь, чтобы получить билеты через терминал, другую, чтобы купить билеты на следующий поезд и третью, чтобы сдать билеты на уже ушедший поезд.

"Летайте" поездами РЖД, ведь других попросту нет!