Недавно передо мной стала задача написать небольшой чат-демон для крупного интернет-проекта. Эту задачу я решил с помощью Ruby и Event Machine. Подробности и маленький пример под катом.
После пробной версии чата, написанной на нативных сокетах Ruby, стало понятно что для достаточно большой нагрузки она не подойдет. Плюс ко всему работала она нестабильно. Я принял решения оптимизировать код. Поиски необходимой информации по теме особыми успехами не увенчались, тогда я решил посетить страницу проекта thin, чтобы узнать как сделан этот веб-сервер и на этой странице наткнулся на ссылку на Event Machine — библиотеку сетевого ввода/вывода с крайне высокой масштабируемостью, производительностью и стабильностью. Я был впечатлен обещаниями и решил попробовать.
Как я понял из документации по Event Machine, библиотека не использует родные сокеты Ruby и реализует иной подход при работе с сетью, а также предоставляет событийно-управляемую программную модель.
Итак, приступим к созданию самого простого чат-сервера на EventMachine. Для начала, необходимо установить гем:
Приведу сразу код с комментариями:
Подсвеченый код на GitHub.
Как видно, третьим параметром в метод EventMachine::start_server передается имя модуля, который содержит объявление протокола или пользовательского функционала. Этот модуль будетвмешан (mixed-in) в класс EventMachine::Connection.
Также в модуле ChatLogic переопределны три метода, которые EventMachine вызовет автоматически при наступлении соответствующих событий: post_init, receive_data( data ), unbind которые инициируются для соединения при соединении, получении данных и разрыве. Разумеется в модуле можно определить и другие методы и классы для реализации логики работы сервера, только вызывать их нужно будет самостоятельно.
Итак, я привел код самого простого, но однако быстрого и стабильного чат-сервера на Ruby с использованием библиотеки Event Machine, которая похоже заслуживает внимания программистов и, кстати сказать, доступна не только для Ruby.
После пробной версии чата, написанной на нативных сокетах Ruby, стало понятно что для достаточно большой нагрузки она не подойдет. Плюс ко всему работала она нестабильно. Я принял решения оптимизировать код. Поиски необходимой информации по теме особыми успехами не увенчались, тогда я решил посетить страницу проекта thin, чтобы узнать как сделан этот веб-сервер и на этой странице наткнулся на ссылку на Event Machine — библиотеку сетевого ввода/вывода с крайне высокой масштабируемостью, производительностью и стабильностью. Я был впечатлен обещаниями и решил попробовать.
Как я понял из документации по Event Machine, библиотека не использует родные сокеты Ruby и реализует иной подход при работе с сетью, а также предоставляет событийно-управляемую программную модель.
Итак, приступим к созданию самого простого чат-сервера на EventMachine. Для начала, необходимо установить гем:
sudo gem install eventmachine
Приведу сразу код с комментариями:
require 'rubygems'
require 'eventmachine'
module ChatLogic
@@connections = [] #Массив соединений
# Этот метод будет вызван при инициации соединения
def post_init
@@connections << self
end
# При получении новых данных будет вызван этот метод
def receive_data data
# Пересылаем данные каждому активному клиенту
@@connections.each{ |connection| connection.send_data data }
end
# При разрыве соединения будет вызван этот метод
def unbind
@@connections.delete(self)
end
end
# Запускаем сервер
EventMachine::run {
host,port = "0.0.0.0", 8090
EventMachine::start_server host, port, ChatLogic
puts "Listening #{host}:#{port}..."
}
Подсвеченый код на GitHub.
Как видно, третьим параметром в метод EventMachine::start_server передается имя модуля, который содержит объявление протокола или пользовательского функционала. Этот модуль будет
Также в модуле ChatLogic переопределны три метода, которые EventMachine вызовет автоматически при наступлении соответствующих событий: post_init, receive_data( data ), unbind которые инициируются для соединения при соединении, получении данных и разрыве. Разумеется в модуле можно определить и другие методы и классы для реализации логики работы сервера, только вызывать их нужно будет самостоятельно.
Итак, я привел код самого простого, но однако быстрого и стабильного чат-сервера на Ruby с использованием библиотеки Event Machine, которая похоже заслуживает внимания программистов и, кстати сказать, доступна не только для Ruby.