Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на новые письма. Как лучше организовать? чтобы нагрузка на сервер была минимальна 
:(
    Опции темы
Wowa
Дата 31.5.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



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

Вот пока писал пост пришла в голову идея записывать информацию о последних N-постах в какой-то массив, его сериализировать и ложить в memcache. Наверное ложить в память стоит лишь ИД-юзеров, которые за последний час получили новые сообщения. При обращении доставать из памяти, производить десериализацию и проверять через isset($myarray[$user_id]) наличие нового сообщения для этого юзера в массиве. 

Критика? Предложения?
PM WWW   Вверх
Nigel
Дата 31.5.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



Т.е. правильно ли я понял, что ты хочешь навесить таймаут на функцию, которая будет опрашивать базу на наличие новых писем?
И как ты собираешься сделать это через аякс, разбить на фреймы, положив в 1 из них нужную функцию, или же запускать ее при загрузке контента?
PM MAIL   Вверх
Wowa
Дата 31.5.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Nigel @  31.5.2008,  09:10 Найти цитируемый пост)
Т.е. правильно ли я понял, что ты хочешь навесить таймаут на функцию, которая будет опрашивать базу на наличие новых писем?

да
PM WWW   Вверх
Nigel
Дата 31.5.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



А тогда вопрос, зачем так делать? Мне кажется, разумнее будет делать запрос при определенном событии, скажем, переходе на страницу. Ведь в большинстве случаев у тебя результатом будет 0.
PM MAIL   Вверх
Wowa
Дата 31.5.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Nigel @  31.5.2008,  14:35 Найти цитируемый пост)
А тогда вопрос, зачем так делать?

зачем - это вопрос из другой плоскости smile Даже если делать проверку при переходе на новую страницу, то все равно нужно минимизировать нагрузку.
PM WWW   Вверх
Nigel
Дата 1.6.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



Нагрузки никакой этот запрос не должен создавать, так как выбираешь только число, потом при переходе по ссылке юзером, вытаскиваешь необходимую инфу и показываешь, + кэш на уровне субд, если идет частое обращение к базе. Этот запрос у тебя в slow_queries попадает?
зы. какой серв и какая планируемая нагрузка?
PM MAIL   Вверх
Wowa
Дата 1.6.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Nigel @  31.5.2008,  23:18 Найти цитируемый пост)
Этот запрос у тебя в slow_queries попадает?

Это пока лишь в теории.


Цитата(Nigel @  31.5.2008,  23:18 Найти цитируемый пост)
зы. какой серв и какая планируемая нагрузка? 

ну, например, на сайте одновременно 10 000 людей сидеть будет. В среднем каждый юзер если будет страницу новую раз в минуту грузить, то это 10 000/60 секунд=166 запросов в секунду. В принципе это не так уж мало. А если проверять поступление новой почты через аякс, как задумано, например, каждые 10 сек, то это уже 10 000/6=1666 запросов в секунду. Т.е. дофига.
PM WWW   Вверх
sTa1kEr
Дата 6.6.2008, 10:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Wowa @  31.5.2008,  01:34 Найти цитируемый пост)
Вот пока писал пост пришла в голову идея записывать информацию о последних N-постах в какой-то массив, его сериализировать и ложить в memcache. Наверное ложить в память стоит лишь ИД-юзеров, которые за последний час получили новые сообщения. При обращении доставать из памяти, производить десериализацию и проверять через isset($myarray[$user_id]) наличие нового сообщения для этого юзера в массиве. 

Memcache - это хорошая мысль. Только зачем массив? Для каждого пользователя отдельно хранить количество непрочитанных сообщений. При поступлении нового сообщения memcache_increment($prefix.$uid), при проверке memcache_get($prefix.$uid) и отдаем пользователю, если вернула false, то читаем из базы и пишем в memcache. При прочтении, соответственно, memcache_decrement($prefix.$uid) или memcache_delete($prefix.$uid).

Если нужна еще большая производительность, то можно написать демона, которым будет раздавать информацию о новых письмах.
PM MAIL   Вверх
MoLeX
Дата 6.6.2008, 11:03 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 0
Всего: 140



Цитата(sTa1kEr @  6.6.2008,  10:44 Найти цитируемый пост)
Если нужна еще большая производительность, то можно написать демона, которым будет раздавать информацию о новых письмах. 

ИМХо: лучший вариант. у Пети может за весь день письма не будет, а запросы идут, а так без них можно будет обойтись.


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Wowa
Дата 6.6.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(sTa1kEr @  6.6.2008,  09:44 Найти цитируемый пост)
Если нужна еще большая производительность, то можно написать демона, которым будет раздавать информацию о новых письмах. 

каким образом? ведь должен сначала запрос от клиента прийти.
PM WWW   Вверх
sTa1kEr
Дата 6.6.2008, 12:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(MoLeX @  6.6.2008,  12:03 Найти цитируемый пост)
ИМХо: лучший вариант. у Пети может за весь день письма не будет, а запросы идут, а так без них можно будет обойтись. 

Цитата(Wowa @  6.6.2008,  12:27 Найти цитируемый пост)
каким образом? ведь должен сначала запрос от клиента прийти. 

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

Что жрет львиную долю ресурсов? В первую очередь любые механические действия (чтение/запись с жесткого диска). Удаленные запросы (loopback не в счет, но я сомневаюсь, что у вас и веб сервер, и БД, и memcache на одном сервере smile)

Т.к. демон будет висеть в памяти, а запросы будут идти напрямую(или, к примеру, через nginx), то для обработки запроса затраты ресурсов будут минимальны.

Добавлено через 3 минуты и 13 секунд
В упрощенном варианте примерно так smile Далее уже детали реализации. Хотя для винграда, я думаю, более чем достаточно будет memcach-а
PM MAIL   Вверх
Wowa
Дата 6.6.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(sTa1kEr @  6.6.2008,  11:18 Найти цитируемый пост)
Хотя для винграда, я думаю, более чем достаточно будет memcach-а


Это не только для Винграде. Я делаю расчет, что на другом портале одновременно будут по 20 000 юзеров на сайте. Не уверен, что хорошо будет если 20 000 переменных создать в мемкеше:

Цитата(sTa1kEr @  6.6.2008,  09:44 Найти цитируемый пост)
Только зачем массив? Для каждого пользователя отдельно хранить количество непрочитанных сообщений. При поступлении нового сообщения memcache_increment($prefix.$uid), при проверке memcache_get($prefix.$uid) и отдаем пользователю, если вернула false, то читаем из базы и пишем в memcache. При прочтении, соответственно, memcache_decrement($prefix.$uid) или memcache_delete($prefix.$uid).


PM WWW   Вверх
sTa1kEr
Дата 6.6.2008, 13:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Wowa @  6.6.2008,  13:56 Найти цитируемый пост)
Это не только для Винграде. Я делаю расчет, что на другом портале одновременно будут по 20 000 юзеров на сайте.

Тогда действительно стоит подумать о написании специального демона для этого.

Цитата(Wowa @  6.6.2008,  13:56 Найти цитируемый пост)
Не уверен, что хорошо будет если 20 000 переменных создать в мемкеше

Согласен. Из этих 20000 большинство несут бесполезную информацию, по этому нет смысла хранить их там все. Как альтернатива, помещать в мемкеш количество новых сообщений только для тех пользователей у которых они есть (тогда количество объектов будет на пару порядков меньше). Актуализировать информацию можно отдельным скриптом работающим через крон, к примеру, каждые 15 минут.
PM MAIL   Вверх
IZ@TOP
Дата 9.6.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Цитата(Wowa @  31.5.2008,  01:34 Найти цитируемый пост)
Вот пока писал пост пришла в голову идея записывать информацию о последних N-постах в какой-то массив, его сериализировать и ложить в memcache. 

Не имеет смысла затрачивать процессорное время на сериализацию, когда данные в Memcache попадают уже сериализованными.
Тебе подойдет решение от Сталкера с Memcache и increment'ом по "unread-messages-userid".

Цитата(Wowa @  6.6.2008,  13:56 Найти цитируемый пост)
Это не только для Винграде. Я делаю расчет, что на другом портале одновременно будут по 20 000 юзеров на сайте. Не уверен, что хорошо будет если 20 000 переменных создать в мемкеше:

Мелочь какая, 20к переменных. Для примера, у нас на одном Memcache сервере (на текущий промежуток времени) хранится 1270459 записей.



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.