Как стать автором
Обновить

Чат-сервер на Ruby и Event Machine

Время на прочтение 2 мин
Количество просмотров 1.7K
Недавно передо мной стала задача написать небольшой чат-демон для крупного интернет-проекта. Эту задачу я решил с помощью Ruby и Event Machine. Подробности и маленький пример под катом.



После пробной версии чата, написанной на нативных сокетах 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 передается имя модуля, который содержит объявление протокола или пользовательского функционала. Этот модуль будет вмешан (mixed-in) в класс EventMachine::Connection.

Также в модуле ChatLogic переопределны три метода, которые EventMachine вызовет автоматически при наступлении соответствующих событий: post_init, receive_data( data ), unbind которые инициируются для соединения при соединении, получении данных и разрыве. Разумеется в модуле можно определить и другие методы и классы для реализации логики работы сервера, только вызывать их нужно будет самостоятельно.

Итак, я привел код самого простого, но однако быстрого и стабильного чат-сервера на Ruby с использованием библиотеки Event Machine, которая похоже заслуживает внимания программистов и, кстати сказать, доступна не только для Ruby.
Теги:
Хабы:
+4
Комментарии 9
Комментарии Комментарии 9

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн