Кто-нибудь пробовал такую схему чата: ... ?

  • Автор темы Benvolio
  • Дата начала

Benvolio

Guest
Кто-нибудь пробовал такую схему чата: ... ?

Привет! Кто-нибудь пробовал такую структуру чата на больших нагрузках (например на человеках 300 одновременно)?

Стандартная связка Linux, Apache, PHP (mod_php), MySQL. Физически все находится на одной машине. PHP скомпилен с поддержкой shared memory. В ней мы храним last_message_id последнего сообщения из таблицы сообщений. На одном из апачевских портов настроено keep-alive=on. На этом порту будет сидеть скрипт вывода непрерывного потока сообщений чата. Скрипт, выводящий сообщения, с интервалом в полсекунды смотрит на значение переменной last_message_id, находящейся в shared memory, если оно увеличилось - коннектится к БД и выводит необходимое кол-во новых сообщений. Соответственно, при записи новых сообщений в таблицу увеличиваем last_message_id. Предусмотрена "многокомнатность" чата.

Вроде как бы все для начала... Основные вычислительные ресурсы машины обычно тратятся на запрос типа есть ли новые сообщения, мы это обыгрываем с shared memory.

Поделитесь опытом и соображениями, плз... Какие есть здесь узкие места, опасения?

Спасибо!
 

RomikChef

Guest
а че бы весь чат в шаред мымре не хранить?
Зачем вообще базу дергать?
 

Barlone

Guest
Основное узкое место - это копия апача (а это минимум 5 мег памяти) на каждого клиента. Так что на 300 человек одновременно в чате это полтора гига....
 

voodoo

Новичок
Основные вычислительные ресурсы машины обычно тратятся на запрос типа есть ли новые сообщения
соб-сно, при кол-ве посетителей больше какого-то числа (ок. 50), дергать базу придется каждый раз (одно-два сообщения в секунду будет).

потому, как говорит Ромик, все в SysVShm
 

voodoo

Новичок
для справки: keep-alive к обсуждаемой теме не имеет вообще никакого отношения.
 

Benvolio

Guest
Автор оригинала: voodoo
для справки: keep-alive к обсуждаемой теме не имеет вообще никакого отношения.
прокомментируйте ваше высказывание, плз..
 

Barlone

Guest
Можно я прокомментирую ? keep-alive подразумевает сохранение открытого соединения между запросами, то есть очень грубо говоря: открыл юзер страничку - а соединение с сервером осталось, ждет когда он следующую страничку откроет
 

Benvolio

Guest
ну так это и надо, я говорил про keep-alive только для скрипта, который непрерывно сообщения выводит.. как тут без keep-alive обойтись?

Host: chat.php.spb.ru:8888
Accept: */*
Connection: Keep-Alive
 

voodoo

Новичок
ерунда.

1. keep alive используется _только_ для отправки нескольких запросов через одно соединение. Для push-чата это совершенно не является необходимым -- достаточно одного запроса, к "телу"

2. keep alive используется _только_ когда размер _всех_ запрашиваемых (в течение соединения) документов известен. Что, в случае push-чата не выполняется вообще никогда.

Для более подробной справки:
rfc 2616 (ftp://ftp.isi.edu/in-notes/rfc2616.txt), 8.1.x (например,
In order to remain persistent, all messages on the connection MUST
have a self-defined message length (i.e., one not defined by closure
of the connection), as described in section 4.4.
)


и httpd.apache.org
 

Phobos

Guest
Простенький совет по оптимизации:

MySql таблицы типа HEAP ( хранятся в памяти )
create ... () type=HEAP;

Исходящие cообщения которые посылает пользователь отображать JavaScript (Сократит немного трафик и даст впечатление мгновенности отсылки).

Используй cжатый MIME-TYPE

И ВООБЩЕ ЕСЛИ ТЫ РАЗБИРАЕШЬСЯ В SQL ТО ПРОЦЕДУРУ ПРОВЕРКИ НА НОВЫЕ СООБЩЕНИЯ МОЖНО УПУСТИТЬ ЗАМЕНИВ СОРТИРОВКОЙ ПО ПОСЛЕДНЕМУ ЗАПРОСУ ПРИМЕРНО ТАК

SELECT MESSAGE FROM YOUR_TABLE WHERE TIMESTMP="$LAST_TIMESTAMP" AND OWNER!="$SELF" ORDER BY ASC;

Потом проверяешь результат, устанавливаешь $LAST_TIMESTAMP И ПО НОВОЙ.......................

А если чесно, то ПШП хоть и очень модный и мощный, но он не расчитан для таких задач, нужно что-то сильнее, С++
к примеру.
 

Benvolio

Guest
2Phobos:
по поводу HEAP - спасибо, сам натолкнулся на эту же мысль.. Ведь таблицы с сообщениями чата обычно мелкие..
За JS сообщение сразу в окно - спасибо, мысль толковая :)
Что есть такое за зверь сжатый MIME-TYPE? Насколько это может быть эффективно?
По поводу SQL - нет проблем :)

2RomikChef:
тут форум по пхп :)
 

Phobos

Guest
За JS сообщение сразу в окно - спасибо, мысль толковая :)
Что есть такое за зверь сжатый MIME-TYPE? Насколько это может быть эффективно?

Современные бровзеряки потдерживают сжатую передачу
данных ну типа WinZip только для данных HTML
, а по умолчанию Апач выдаёт MIME-TYPE: text/html/plain
, что бы сократить трафик придумали MIME-TYPE: deflate/gzip
если не ошибаюсь в названии.

В идеале должно давать меньше трафика (не намного, но выгода есть).

Попробуй поискать на ПШП.НЕТ может найдёшь, сам точной реализации не помню но знаю что такую муть когда то делал не только для чата но и для всех систем которые выдавали много информации.

Удачи.!!!!!!!!!!
 

Benvolio

Guest
имеется ввиду
mod_gzip
PEAR gzencode
и т.п. из темы "Прозрачный qzencode "?
 

RomikChef

Guest
А ты, значит, уперся на php сделать?
флаг в руки.
 

Benvolio

Guest
tcl к сож. не знаю..

я так понял, что тут обыгрывается push технология..
соответственно я должен написать чатовский push-сервер?
 
Сверху