Red Spirit

Блог Алексея Таянчина

RSS 2.0

Разработка чата на Node.JS – этапы разработки

Еще с полгода назад решил разработать для своего сайта новый чат. Сейчас у меня работать чат на основе конференций Jabber на сервере ejabberd, а в качестве клиента выступает скрипт Candy Chat с моими доработками.

Но со временем оказалось, что функционала очень не хватает. XMPP, конечно, расширяемый и все такое, но это не то. Если функционал клиента я еще смогу изменить, то с сервером ничего сделать не смогу. В общем решил разработать свой чат с нуля на своем протоколе. Эти полгода назад начал разработку протокола, сейчас процентов на 70 готов его черновой вариант. С неделю назад поставил весь необходимый софт (Node.JS + Socket.IO + MongoDB) и начал написание скриптов. Чат ориентирован на веб, клиент будет работать в браузере, хотя будет возможность подключения настольных клиентов.

Далее буду расписывать этап разработки:

Май 2012 – начало разработки протокола, имеет JSON-формат.

далее была долгая пауза, ничего не делал…

Начало сентября – установка сервера, базы данных и необходимых библиотек для начала разработки

5 сентября – написание клиентского приложения для отладки сервера, позволяет формировать и отправлять нужные запросы и получать ответ.

6 сентября – начал писать сервер, определил роутер для разруливания запросов, прикрутил базу, сделал парсер конфиг файла.

7-8 сентября – написал функции отправки информации о сервере и функцию регистрации новых пользователей.

9 сентябряфункция авторизации (залогирование и разлогирование), установка и получение данных профиля с учетом привилегий и настройки видимости. Воскресенье – такой продуктивный день.

10 сентября – дорабатывал клиентскую часть для более удобной отладки (пока не закончил), одновременно исправлял кое-какие ошибки в уже сделанных функциях сервера

11 сентября – доделывал клиентский скриптик. Добавил возможность удаления пользователя админом и установки блокировки с указанием причины (при этом заблокированный юзер не сможет залогинится и ему вернется причина блокировки). Слегка изменил работу профиля.

12 сентября – сделал авторизацию для анонимок, личные сообщения с поддержкой оффлайна, список запрещенных логинов и ников. Исправил выявленные ошибки в существующих функциях.

13 сентября – функция выборки личных сообщений (для формирования хистори) по разным параметрам. И как обычно исправил некоторые мелкие неисправности в существующем коде

14 сентября – Начал работать над комнатами. Создание / удаление комнаты, вход в комнату и отправка сообщений. Потом начал верстать полноценную клиентскую часть чата, сделал основной макет и написал функции для вывода модальных окон (такие алерты). А еще придуман название, назову чат Hitagi.

15 сентября – продолжаю делать клиентскую часть для продакшина. Прикрутил авторизацию и автоматический вход в комнату, от куда получаем и отображаем последние сообщения и список пользователей.

16 сентября – почти весь день только и делал, что доводил сервер и клиента до ума, никаких новых функций – только исправлял и доделывал старые

17 сентября – продолжаю работу над клиентом, делал получение и сохранение данных профиля, немного играл со стилями. Кинул сервер на удаленную машину, теперь все это дело можно испробовать из интернета. Функции работают пока стандартные: Регистрация, Авторизация, Вход в комнату нескольких участников, переписка. Перед сном уже прикрутил возможность регистрироваться и авторизовываться с помощью ВК. Все это делается нажатием одной кнопки, очень удобная штука.

18 сентября – получилось мало что сделать – авторизацию через ВК немного переработал с учетом безопасности и кое что еще по мелочи.

19 сентября – решил опять все переделать с аватрками. Раньше у меня авки загружал PHP скрипт и отдавал из Апач как обычный веб сервер, но я подумал что это не очень хорошо и решил унифицировать сервер тем, что сам Node будет загружать через Ajax картинки аватарок, обрабатывать их (сжимать и кропить), сохранять и отдавать в дальнейшем через HTTP протокол на каком-нибудь отдельном порту. Сделал загрузку и обработку, а отдачу пока нет, поджимает другой заказ, надо немного повременить с чатом…

20 сентября – под конец дня уже взялся за тудушку и выполнил несколько пунктов. Теперь аватарки загружаются и отдаются исключительно силами самой Ноды и еще кое что переделал, так что с аватарками можно считать, что покончил, все работает так как надо.

21 сентября – опять очень мало свободного времени, сделал только кнопочку при нажатии на которую можно изменять топик комнаты. Чую, что в ближайшую неделю времени не будет совсем, очень напряжная неделька намечается.

/* ПАУЗА В ПАРУ НЕДЕЛЬ */

12 октября – вопреки тудушки как только освободился сделал следующее: хостинг картинок на Ноде, юзер загружает картинку прямо из чата и она вставляется в виде превьюшки со ссылкой на оригинал. Автозалогинивание под последней учеткой.

13 октября – сделал прикольную штуку – возможность удаления сообщений онлайн, то есть написал кто-то мат или паршивую картинку, то админ может оперативно ее удалить и это сообщение удалится с экранов всех юзеров.

14 октября – теперь можно ставить статусные сообщения и устанавливать состояние (онлайн, отошел, занят и др), а так же для вставляемых картинок сделал всплывающую панельку с кнопками, где можно скрыть картинку или оценить ее (лайк, дизлайк). Сами кнопки пока ничего не выполняют, обработчики оставил на завтра.

15 октября – поставил обработчики на лайки картинок, теперь ведется учет рейтинга юзеров. Сделал установку привелегий на стороне сервера, начал делать динамическое меню около аватарок для каждого пользователя, пункты будут высвечиватся в зависимости от прав юзера, то есть предлагаться различные варианты действий.

~~~~ ляляля ~~~~~

16 октября пришлось переезжать на новый сервер, решил в этот момент не ставить старый чат а установить сразу новый в том виде, какой он был на момент разработки. Правда от всеобщего доступа закрыл и оставил только для нескольким проверенным юзерам, которым помогли мне доработать проблемы и довести чат до той кондиции, когда его можно было выпускать в народ.

Сейчас 17 ноября, чат работает хорошо, гораздо быстрее и резвее старого на XMPP. Однако есть некоторые проблемы, которые часто дают о себе знать. В первую очередь, это то, что иногда бывает внезапные дисконнекты, причем не у всех юзеров или у кого-то одного, а у, скажем, половины людей в чате, такой групповой дисконнект. Еще бывают случаи, когда до некоторых пользователей “не доходят” сообщения о приходе или заходе юзера в комнату. Эту ситуацию мне удалось смоделировать на локалхосте, я убедился в том, что сообщения точно отправляются, но не доходят до клиента, вне зависимости от браузера, примерно в 10% случаях такая неприятность случается. Я почти (хоть и не полностью) уверен, что сама Нода тут не причем, а проблема в модуле Socket.IO который занимается транспортом сообщений. Хотя это странно, библиотека довольно мощная и используется во многих проектах, почему она дает такой глупый сбой… в общем, чтобы это проверить я решил написать свою реализацию вебсокетов и лонгполлинга и посмотреть как оно будет все работать.

На данный момент я слегка закидан разными заказами и оставил чат в покое, пока нормально не освобожусь…

  • Александр

    Добрый день, заинтересовала ваша разработка. Нам нужно функционал чата встроить в наш софт, но не хотелось бы разрабатывать что-то с нуля. Сколько будет стоить ваша наработка вместе с консультациями по кастомизации.

  • http://redspirit.ru Red Spirit

    Здравствуйте. Даже не знаю что ответить, я этот чат так люблю, что даже не хочу брать за него деньги ) Клиент есть на гитхабе (https://github.com/redspirit/hitagi-client), а серверные скрипты могу так же выложить бесплатно в открытый доступ. Уже давно хочу взяться за разработку второй версии, чтобы переписать код как на сервере так и на клиенте. Хоть сейчас все и работает нормально, но некоторые вещи не удовлетворяют, как качество кода так и некоторые ошибки оставшиеся с этапа проектирования. Так что смотря что вам надо и насколько сильно кастомизировать. Могу дать все исходники, можно использовать как угодно с условием сохранения авторства.

  • Ray Williams

    Приветствую! Я совсем не разбираюсь в Node.JS, смогу ли я поставить ваш чат к себе на страницу? он мне очень понравился, простой и удобные фичи на месте. Не пробовали под нагрузкой как оно ? 500-1000чел? справа конечно список юзеров превратиться в мега-фейсбук ))

  • http://redspirit.ru Red Spirit

    Здравствуйте. Тут все не так уж просто ) Надо выделенный сервер или VPS, на нем должен стоять MongoDB и Node.JS со всеми нужными модулями. Без подробного мануала не обойтись. Да и проект в постоянно доработке и пока не рассчитан на распространение. Технически сервер справится и более чем с 1000 соединений, но все они стекаются в общую комнату в одну кучу. Так что не вариант, надо продумывать чтобы они расползались сразу по разным комнатам, тогда пойдет.

  • FriendsKenny

    Здравствуйте, Алексей. Где можно найти серверные скрипты для чата?

  • http://redspirit.ru Red Spirit

    Если интересно, то вот тут есть серверные скрипты, правда устаревшие https://github.com/redspirit/hitagi-server

  • FriendsKenny

    Спасибо =)

  • Юлдаш

    Как с вами связаться? Очень ,очень – очень нужно!!