В прошлый раз я запустил свой сайт на ARM сервере от хостера GlobalTel, а теперь решил написать проект с 0 для этого сервера.
Получилось вот это: habrachat.org. Маленькие подробности под катом.
Мотивация
- Хотелось загрузить ARM сервер чем то лёгким, такой задачей где ненужны были бы мощные ядра x86. По этому выбрал асинхронный сервер tornado и классическую задачу чат.
- Я не видел чата для habrahabr. Есть IRC но я там бываю всё меньше и меньше, и людей там вижу реже.
- Я не нашёл готового, простого чата на tornado+redis с поддержкой комнат. В целом для этой связки и tornado в частности, примеров законченного чата очень мало. Кроме того эти чаты не могли работать сразу на нескольких ядрах (только один инстанс).
Реализация
- Компоненты взял простые nginx (WebsocketProxy), Tornado(WebSocket), tornado-redis, Redis. На клиенте bootstrap+dojo.
- Авторизацию реализовал через сервис ulogin для скорости разработки. Да и в целом удобный сервис.
- Форматирование текста реализовал через bbcode библиотеку для python.
- Сначала сделал всё за один день и достаточно просто (где то 300 строк), но работало только в одном экземпляре. Когда решил сделать синхронизацию между инстансами — меня понесло. В итоге код разросся до 540 строк.
- Если передача сообщений пользователю достаточно простая задача и везде описана, то вот передача сообщения соседнему «чату» (инстансу) уже сложнее. Каждый «чат» я подписываю в redis на один и тот же канал, причём в отдельном коннекте (так как это блокирующая операция). При включении каждый «чат» шлёт просьбу сообщить всех своих пользователей, все кто получает это сообщение так же всем отсылают свои списки. В дальнейшем созданное сообщение я отправляю не только пользователям конкретного «чата» но и в всем остальным «чатам» где работает специальная callback функция. Деталей там много, лучше сразу смотреть код.
- Сам код github.com/stalkerg/habrachat. Ошибок там много, много не красивых подходов так, что если найдёте то пиши на гитахб или пушите патчи (писал в спешке и на результат). Кроме того если идея понравится то буду развивать.
Дополнение
- Ядро Ubuntu для ARM собрана только с базовым набором netfilters из-за чего нельзя даже прокинуть порт. В итоге я собирал из исходников nginx и проксировал WebSocket на нём. :(
- Недавно у GlobalTel была авария и после отключения света, у сервера время сбилось в 0 т.е. 73 год. Наверное у ARM с этим проблемы. Я долго гадал почему у меня ssl глючит везде где только можно.
PS если реально кому то это будет нужно, то сервис будет обрастать фичами и прочим, а костыли будут убираться. Пишите в комментариях ваши пожелания.
PS2 надеюсь хабра эффект не уронит бедный 4 ядерный ARM сервер.
Автор: stalkerg