Pull to refresh

Comments 75

Под убунтой ни в хроме ни в ff 6 не заработало
Под дебианом в хроме замечательно заработало.
Хм.
Чую дело в заблокированных портах.
А socket.io по какому порту общается?
Смотря какой транспорт выбран. XHR и web-sockets по стандартному 80. Флеш вроде по какому-то своему.
Чудеса
8080 заблокирован

Я удивлен, честно гря. Пойду узнавать, зачем так сделано.
какая версия?
у меня не заблокирован, u10.10 x64
Да не
Это у меня на работе, оказывается, почти все порты заблокированны.
Просто я не ожидал, что 8080 тоже заблокируют.
Хьюстон у нас не взлетает :(
kubuntu11.4 fx6 ch12
Видимо, хабрэффект накрыл динамику на клиент-сайде.
*сервер-сайде, простите.
эм, так вы засеките при каком максимуме все падает и изза чего — это бесплатное нагрузочное тестирование
Так не я автор же. Я тоже бесплатный нагрузочный тестер :)
Нет, мне интересно в node.js и socket.io.
Запустил заново. Сервер работает, а вот node-скрипт отрубился. Теоретически, надо бы поставить через npm модуль forever, чтобы само перезапускалось, но что-то не ставится… Сейчас послежу, когда вырубается.
под убунтой заработало во всех браузерах установленных.
Тормозит сильно то ли сервер то ли у меня :( Проц под 100%. Последний хром
Ну, в клиенте пока тормозить нечему, а вот сервер не выдерживает, да) Кто подскажет утилиты, чтобы мониторить загруженность / потребление отдельным процессом памяти, проца, инета etc через терминал?
Спасибо за наводку. Как и предполагалось, основную нагрузку создает apache…
Чат — это видимо самый простой и яркий пример технологии node и веб-сокетов. В то же время это одна из такий фундаментальных и интересных задач для Comet технологий. Наверное в основе многих такий сервисов будет лежать нечто похожее на чат.

Насчет этой реализации сказать ничего не могу, но когда мне понадобилось реализовать чат на nodejs и socket.io быстро удалось найти рабочий пример.
расскажите впечатления от использования?
То что я делал было не совсем чатом, это небольшая система для стресс тестирования для веб приложения. Socket.io и node.js в этом плане оказались очень удобными. Основа была как у чата: агенты сбрасывают в чат раз в секунду счетчики производительности и данные тестов и получают из чата команды (остановить тест/запустить тест).

Удобно что через тот же самый socket.io я мог работать с чатом как с веб странички (результаты тестов видно в реальном времени) так и с агентов. За счет такого out-of-proc общения через socket.io можно создавать агентов на разных компьютерах или в одном компьютере в разных процессах. Очень легко масштабируется.

Чат не был главной вещью на которую падает нагрузка, основная задача выдавать максимум HTTP запросов для нагрузки серверов.
В данном случае меня сподвигла не самая идея чата, а отсутствие внятной документации для Socket.IO. По ссылкам в конце статьи можно найти куски кода, но это больше примеры — в них не обьясняется какая функция что делает. Методом тыка, чтения исходников и вывода в консоль объектов библиотеки я более-менее разобрался, что что делает и делюсь с вами)
Мда, судя по тематике постов в чате, следует сделать функцию автобана)
Можно еще так сделать: используем сервер ejabberd, в качестве сервера обработки сообщений. Клиенты соединяются с ним через прокси-сервер, который проксирует websocket. Такой проксик придется написать самому, т.к. готового решения для ejabberd я не знаю.

В итоге, получим полноценную XMPP = много фич, которые остается реализовать на клиенте.
Не нужно делать велосипеды, посмотрите в сторону XMPP-BOSH, ejab умеет этот протокол. Достаточно будет обычного аякса. Если хочется готовых реализаций, то есть github.com/sstrigler/JSJaC, например
Что-то лежит чатик.
Сколько народу сейчас?
Да вроде не лежит, живой. У вас какой браузер?
пардон, я пытался отправить по-русски — не сразу понял, что это не работает
А он что русский язык не поддерживает????
Это как?
И русский язык поддерживает. Похоже, не у всех, но сейчас человек 5 в чате кириллицей отписались. На странице UTF-8 кодировка, возможно браузер принудительно переопределяет?

UPD. Так, вылезла ошибка — Segmentation fault. Пошел курить мануалы.
Chrome 11 @MacOS
UTF-8 — родная кодировка, все должно быть ок с ней

Да, я тоже удивился увидев русские буквы — какой-то страный баг почему не отправляется. Может где-то с сервера не та кодировка приходит?
А, мой косяк, понял. Пытался по-быстрому пофиксить баг с отправкой пустых строк — поставил регэксп на вхождение печатных символов, а про кириллицу забыл. Возможно, это. Сейчас подправлю код, через пару минут перезагрузите страницу.
теперь русский нормально
А сколько было соединений, очень интересно когда начало тормозить.

В каком режиме работает апачи? Мне кажется что WS он не пробрасывает никак.

И ещё: у вас в примере есть вызов io.sockets.json.send вместе с emit. send — это низкоуровневая функция, не стоит смешивать с emit. Возможно от туда и проблемы с русскими буквами
Пардон за навязчивость.
Вот тут однокомнатный чат с поддержкой русского и хабраэффекта — chat.websockets.ru
Сколько пользователей? Какая нагрузка? На каком железе работает?
UFO just landed and posted this here
Ану быстро предъявили свой чатик!-!-!

С чатика проще всего стартовать, по сути все остальное это то же самое взаимодействие, разве что посылается не просто текст, а текст с форматированием и не всем, а определенным пользователям.
Собственно, чем не нравится чат? Это основа для всего, любое общение клиента с сервером — обмен пакетами, сейчас обмениваемся текстовыми сообщениями, завтра меняем в коде 10 строчек и привязываем к игрушке/рисовалке/документам/календарю чему там еще…
UFO just landed and posted this here
Потому что конкретно на Socket.IO на хабре еще не было? И да, мне инвайт (куча интересных статей лежит в закрытых блогах, неизвестно почему) и опыт (когда тестируешь сам — в голову не придет спамить пустыми строками каждую секунду), серверу — нагрузочное тестирование, троллям — радость.
Или вы имеете что-то против троллей?
UFO just landed and posted this here
Сердечное спасибо!)
С точки зрения пользователя — весь интернет это шайтан-машина. Им не нужно знать как это работает, почему, как делалось etc — пользователю главное, чтоб работало.
Когда нет websocket — в ход идет XmlHttpRequest-polling. Не думаю, что что-то сверхсложное. Если любопытно, могу полазить по исходникам, расписать.
UFO just landed and posted this here
Кол-во соединений/пользователей пока не считал, хотя на тестовом сервере есть. В следующей статье будет. Кстати, на chat.websockets.ru хорошо сделано, может сппозаимствовать идею?..
Железо — тучка от Selectel'а, 32-битный Lycid Lynx Ubuntu, 168-512 оперативки (сейчас 260), 8 ядер.
Апач работает в режиме «apt-get — vim virtualhosts — PROFIT!» — я больше программист нежели администратор) впрочем, все вебсокеты идут на node, с апачем они на разных портах и не пересекаются. emit — в самой программе не используются, т.к. пришлось бы на каждый event писать свой обработчик, я пробовал так делать — куча повторяющегося кода.
А какую идею хотите оттуда позаимствовать? Я не жадный — буду рад поделиться :)
Справа список пользователей, их количество etc. У меня пока была идея выводить список в чат по команде /userlist (или какой-то в этом роде), но ваша реализация лучше — лог не засоряется.
Исправил. Съели всю память, так что пришлось серв перезапускать — node отказывался работать) Добавил еще оперативы, до вечера надеюсь этого хватит.
А можно ли это как-то настроить, чтобы работало на 80-м порту на том же домене?

Приходит в голову или писать веб-сервер на node для отдачи статики (не радует идея что-то), или отдавать статику через nginx и проксировать чат, но он вроде websokets не поддерживает.
На том же домене и на том же порту? Что-то я не онял задачу…

Лучше на сабдомен положить, и кстати — нода очень хорошо статику отдает ;)
UFO just landed and posted this here
для nginx есть патч-плагин для WS(фактически TCP wrapper), но придётся пересобирать его.
Надо свой чатик выложить, как говорится — других посмотреть, свой померять…
Кстати, в хроме проблема замечается толька за прокси года сидишь
Как только прочитал заголовок статьи, сразу же вспомнил NowJS: чат занимает где-то 5-10 строчек на сервере и примерно столько же на клиенте :)
По факту — nowjs надстройка к socket.io которая типа шарит объект между сервером и клиентом, но как-то у меня с авторизацией лагать начинает на 1000+ юзерах (правда в дев енв), сейчас переписываю на express+socket.io, как-то оно пошустрее на вид получается…

И да now.js + 500 юзеров + около пары сотен сообщений в памяти — ест 180 метров…
Тут еще меньше кода Клиент Сервер. Это KnockoutJS+NowJS(SocketIO)+Плугин для Knockout (ссылки на него на Github). Кстати, почему никто не пишет про Knockout 1.3? Там много вкусного.
Меньше кода писать? Возможно. Больше кода в подключаемых библиотеках? Да.
Конечно, можно написать свою высокоуровневую библиотеку, в которой чат вообще будет реализован функцией addChat(). Но надо ли? Я хотел написать на чистом JS — не срослось, Socket.IO — имхо, ближе всего по логике к чистому языку.
Вы бы хоть глянули, что там. Что значит «на чистом JS»? А SocketюIO или тот же jQuery — это по вашему не чистый JS? И чем Socket.IO «чище» NowJS? Так бы сразу и написали — «хотел написать свой велосипед».
Пожалуй, я неверно выразился. С минимумом синтаксического сахара. ko.liveModel() — немного не нативная функция. Вы б хоть и мой пост прочитали) И периодически изобретать велосипед таки полезно.
Опять мимо — это не синтаксический сахар. А велосипед изобретать — да полезно, чтобы понять как оно работает внутри. Только в первом абзаце своего поста Вы отказались от изобретения велосипеда. Я бы сказал, что Socket.IO и NowJS позволяют работать на разных уровнях абстракции. Socket.IO — уровень сокетов, NowJS — уровень разделяемых объектов. Можно опуститься еще ниже, но тяжело. Ну а ko.liveModel() на столько же нативная, как io.connect(). ko.liveModel() выводит нас на новый уровень — уровень разделяемой модели, которая привязана к элементам DOM. В результате изменения в DOM одного клиента, автоматически приводят к изменениям у остальных. Я просто хотел обратить внимание на эту технологию.
Наверно, я не смогу передать словами, почему именно Socket.IO, но посмотрите на это:
Websockets:
var socket = new Websocket('http://example.com/');
socket.on('connect', function() {});
socket.on('message', function() {});
Socket.IO:
var socket = new io.socket('http://example.com/'); // до версии 0.7.x
socket.on('connect', function() {});
socket.on('message', function() {});
KnockoutJS + NowJS
var chatRoom = ko.liveModel({
messages: ko.observableArray([]),
send: function() {
chatRoom.messages.push({text: this.text()});
ko.save({ overwrite: true, ignore: [«text»]});
},
text: ko.observable()
}); // и так далее
плохо что не учли самого элементарного касающегося чатов — отправка пустых сообщений.
уже стоит в пачке хотфиксов на сервере и клиенте) здесь только основная логика, без всяких плюшек, проверок и ограничений. думал накатать список в продолжении (судя по реакции аудитории не таком уж и нужном, но дело надо доводить до логического конца...).
а мне бы очень хотелось увидеть продолжение))
чтобы сообщения в redis базе сохранялись например сколько-то последних) чтобы список участников онлайн был с аватарками итд) многие проекты начинали и загнулись. интересно почему? неужели спроса нет?
например тот-же ajax.im aka ajaxim.com и многие другие.
Статья полезная и актуальная до сих пор, некоторые вещи, конечно не идеальны, НО! Для нормального программиста достаточно, чтобы понять в какую сторону копать и что читать.

Статью рекомендую!

Если кому будет интересно, то готовый чат по этой технологии выложен тут: websocket чат, в качестве примера и начала изучения данной технологии была взята данная статья пару недель назад.
Использую связку: Nginx + Apache + Node.JS (Socket.IO + Forever)
Forever — для подвешивания чата в процессы и управления им.
Sign up to leave a comment.

Articles