Может ли очередь быть спасательным кругом?

Статус
В этой теме нельзя размещать новые ответы.

weldp

Новичок
Может ли очередь быть спасательным кругом?

Привет Всем.

До очереди:
POST-запрос передаем некому скрипту, который возвращает данные, допустим из ДБ. Возникает вопрос - как защитить БД, как справится с нагрузкой ( 1000 пользователей решили что-то изменить одновременно).

После очереди:
Делаем POST-запрос который обрабатываем в скрипте, тот данные кладет в нужную очередь, дальше их достаем из очереди, обрабатываем. Вроде бы некий оверхед? Но с другой стороны у нас есть механизм управления нагрузкой - скорость обработки очереди :) MemcacheQ позволяет обращаться по сети, а это значит, что очередь легко разгребать на множестве машин :)

На ум приходит таким образом проводить регистрацию/добавление данных/удаление данных отсылка уведомлений и т.п. - то, что может подождать.

По идеи можно защитить свою БД от атак - нападающий не получает назад никаких worning'ов, предупреждений или же изменение поведения ПО, он видит - данные добавлены(после стандартных методов обработки/анализа).И только в недрах обработчика данные заливаются в БД. Кстате БД может быть и не реляционой :)))

Я не знаю может ли быть выигрыш от того, что один/несколько обработчиков разгребают постоянно очередь перед тем, что каждый раз в скриптах Мы коннектимся к БД, вносим изменения?...

Хотелось бы услышать мнения других и примеры где используют/не используют очереди(memcacheQ и подобные).
 

TutanXamoN

Новичок
weldp
Если, допустим, 1000 пользователей решили что-то изменить одновременно и имеют такую возможность это проблема архитектуры. (это чтоб не сказать о полной нереальности примера)
Очередь в данном случае не спасательный круг в том виде в котором представляете её вы.
Какой смысл создания плавно обрабатываемой очереди в ситуации когда пользователь хочет изменить конкретное значение (исходя из вашей очереди уже не то которое дал ему скрипт) и увидеть его (исходя из вашей очереди есть риск что это значение существует несколько секунд в итоге). Не реляционная БД? А что дальше? Плоские файлы + система очереди + (так как это необходимо для адекватности восприятия окружающей среды) система логирования и отображения изменений.
И что мы получили на выходе - правильно CVS.
Итак переплетя нереальные исходные данные по нагрузке, пост запросы, реляционную а впоследствии и не реляционную (пардон за плоские файлы но это будет следующий шаг) БД - был вновь изобретён велосипед.
 

DiMA

php.spb.ru
Команда форума
> Если, допустим, 1000 пользователей решили что-то изменить одновременно и имеют такую возможность это проблема архитектуры. (это чтоб не сказать о полной нереальности примера)

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

TutanXamoN

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

weldp

Новичок
Автор оригинала: TutanXamoN
weldp
Если, допустим, 1000 пользователей решили что-то изменить одновременно и имеют такую возможность это проблема архитектуры. (это чтоб не сказать о полной нереальности примера)
Очередь в данном случае не спасательный круг в том виде в котором представляете её вы.
Какой смысл создания плавно обрабатываемой очереди в ситуации когда пользователь хочет изменить конкретное значение (исходя из вашей очереди уже не то которое дал ему скрипт) и увидеть его (исходя из вашей очереди есть риск что это значение существует несколько секунд в итоге).
Во первых Я не утверждаю, а спрашиваю :)
У нас есть что-то, что не требует явных изменений в текущий момент...другими словами - если пользователи получат информацию устаревшую за последнюю минуту, то это не убьет бизнесс :) - Я это поставил за аксиому...
Понятно, что изменение регистрационных данных пользователя можно провести через очередь - пользователю все равно, что его данные для других появятся через 1сек или через 1мин! Но вот уникальный идентификатор логинЪ - пройдя через очередь может быть подвержен конфликту...

Допустим у Нас есть статьи/комментарии, которые пользователи добавляют - насколько важно пользователю что бы его комментарии были добавлены для просмотра через 1сек или через 60сек?

Идея в том, что бы положить в очередь все, что не требует риалтайм изменений или же связи с пользователем...

На сколько понимаю что-то подобное можно применить к блогам/форумам/соц.сетям, но надо будет раскорячиваться с:
Допустим Мы отсылаем сообщение, и оно должно сразу же нам отобразиться...
Мы сделали POST-запрос, получили в Ajax success ответ с данными которые послали:
PHP:
<?php echo $_POST['data']; ?>
и добавить в текущий html например с помощью jquery или чего-то другого, но для других это все будет доступно когда оно пройдет очередь...
Что по этому поводу думаете?

PS:
Есть memcacheDB и подобные - становится вопрос в том, а зачем нам вообще БД?
Если связать это все с очередью, то можно организовать свою логику хранения/индексирования...
Правда проблема с memcacheDB - ограничение в 4Гб...
И проблема - усложнение проектирования приложения...

Ну и наверное это подходит только для своего сервера/vds/vps...

извините, что сумбурно

Не реляционная БД? А что дальше? Плоские файлы + система очереди + (так как это необходимо для адекватности восприятия окружающей среды) система логирования и отображения изменений. И что мы получили на выходе - правильно CVS. Итак переплетя нереальные исходные данные по нагрузке, пост запросы, реляционную а впоследствии и не реляционную (пардон за плоские файлы но это будет следующий шаг) БД - был вновь изобретён велосипед.
тот же берклиДБ поддерживает транзакции, репликации :)
 

Макс

Старожил PHPClub
weldp
У вас уже сейчас проблема с нагрузкой или занимаетесь преждевременной оптимизацией ?

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

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

PS
слово "одновременно" - очень нетехническое. Лучше говорить о кол-ве запросов или соединений за единицу времени.
 

TutanXamoN

Новичок
Но вот уникальный идентификатор логинЪ - пройдя через очередь может быть подвержен конфликту...
Эту ситуацию необходимо обрабатывать в любом случае с очередью или без.
пользователю все равно, что его данные для других появятся через 1сек или через 1мин!.....
насколько важно пользователю что бы его комментарии были добавлены для просмотра через 1сек или через 60сек?...
Не соглашусь. Если говорить про анкету пользователя - возможно. А что есть комменты - тормозная версия чата в которую мы внесем ещё эффект торможения.

Не поймите меня неправильно. Я не критикую ваше мышления, но я не вижу больших плюсов данной организации работы с базой данных (абстрагируемся пусть это просто база)
Касательно минусов - Вы сами всё прекрасно понимаете:
усложнение проектирования приложения
ограничение в 4Гб
организовать свою логику хранения/индексирования...
+если в определённых моментах возможно решить имеет ли задержка обновления данных, то в некоторых моментах такое решение как минимум спорно
 

weldp

Новичок
Автор оригинала: Макс
weldp
У вас уже сейчас проблема с нагрузкой или занимаетесь преждевременной оптимизацией ?
можно сказать, что преждевременная оптимизация :) Строю проект, который должен будет жить на ВПС-е + как-то синхронизироваться с другим ВПС-ом...

Все о чем ты говоришь имеет смысл. Другое дело что примеры, которые ты приводишь мне лично кажутся неудачными. Например после регистрации юзер должен иметь возможность сразу же авторизоваться, для чего он должен уже быть в базе. И не должно быть возможности зарегистрировать еще одного юзера с такими же данными - и для этого он тоже должен быть в базе.
Да...но у нас обычно регистрация 2-а действия - запись в базу, потом подтверждение...
Например по этому форуму:
Участников: 9,847. Всего тем: 59,931. Всего сообщений: 584,862.
отношение регистраций к сообщениям 1/59...

Спасательным кругом является масштабируемая архитектура (и наличие денег на железо:)) а не очереди. Очереди один из дополнительных методов оптимизации определенных частей системы. Наверное даже очереди + кеширование помогут прожить проекту без доп. железа относительно долго, но лишь пока нагрузка не привысит какой-то предел.
К этому и стремлюсь - что бы проект жил как можно дольше без вливаний денег:)

ЗЫ:
А чем очереди не масштабируемая архитектура?

Есть серверА, серверБ, серверВ - пишут в очередь на серверД, при этом серверЕ занимается обработкой данных из очереди, не справляется серверЕ, ставим еще один...

-~{}~ 11.04.09 18:31:

Автор оригинала: TutanXamoN
Не соглашусь. Если говорить про анкету пользователя - возможно. А что есть комменты - тормозная версия чата в которую мы внесем ещё эффект торможения.

+если в определённых моментах возможно решить имеет ли задержка обновления данных, то в некоторых моментах такое решение как минимум спорно
Допустим этот форум...
Я нажал цитирование/ответ на чье-то сообщение...Я трачу от 1-ой минуты, а иногда могу несколько часов потратить - вышел хлеба купить...
Если бы Мы отвечали сразу, но ведь пока Я писал коменты Ты ответил...То есть мои коменты в момент отсылки уже изначально устарели(не учитывал Я что есть уже твои). Так какая разница насколько мои коменты устареют?
Проблема тут в другом - Я отсылаю коменты, потом Ты отсылаешь коменты - они в очереди...И для одного из нас ситуация будет следующей:

надо вставить чужие коменты перед своими, то что Я выше приводил с jquery и подобными - не очень подходит, хотя может Я просто не знаю как же это реализовать?...

ЗЫ:
Мы чат с эффектом торможения не тормозим еще больше, так как время ответа не известно...
 

Макс

Старожил PHPClub
weldp
Есть серверА, серверБ, серверВ - пишут в очередь на серверД, при этом серверЕ занимается обработкой данных из очереди, не справляется серверЕ, ставим еще один...
Это только часть картины. Ведь серверЕ не просто обрабатывает данные, он их куда-то сохраняет - например в серверЖ. А Серверы А,Б,В делают туда запросы (SELECT-ы например) чтобы показать страницы со статьями, комментами и прочим контентом.
Если серверЖ перестанет справляться ты добавишь серверЖ2.
Сможет ли твоя система делать SELECT-ы/INSERT-ы в серверы Ж/Ж2 ? То есть половина контента на одном сервере, вторая половина на втором.
Как будут показываться новые статьи, новые юзеры? Будешь делать 2-селекта на оба Ж-сервера и потом мержить результаты ?
А ведь потом появятся сервера Ж3, Ж4 ... :)
 

weldp

Новичок
Автор оригинала: Макс
weldp

Это только часть картины. Ведь серверЕ не просто обрабатывает данные, он их куда-то сохраняет - например в серверЖ. А Серверы А,Б,В делают туда запросы (SELECT-ы например) чтобы показать страницы со статьями, комментами и прочим контентом.
Если серверЖ перестанет справляться ты добавишь серверЖ2.
Сможет ли твоя система делать SELECT-ы/INSERT-ы в серверы Ж/Ж2 ? То есть половина контента на одном сервере, вторая половина на втором.
Как будут показываться новые статьи, новые юзеры? Будешь делать 2-селекта на оба Ж-сервера и потом мержить результаты ?
А ведь потом появятся сервера Ж3, Ж4 ... :)
Запись:
Что нельзя в очередь - сразу в базу
Что можно в очередь - в пишем очередь

При разборе очереди и изменении чего-либо - меняем и в кеше(memcacheDB).

Чтение:
Читаем из memcacheDB - нет ничего - читаем из базы.

memcacheDB позволяет делать реплику, а значит можно разнести на несколько серверов, на эти же сервера можно и очередь подвесить, на отдельных серверах база...

Итого если падают все сервера баз - очередь не обрабатывается, из кеша читаем, если падает весь кеш - читаем из базы, если все падает, значит надо что-то делать :)))
 

Gorynych

Посетитель PHP-Клуба
А какова реальная суть задачи/вопроса?

Как было сказано выше, если проблема 1000 одновременных коррекций одной записи - то, помимо малой реальности, это скорее проблема архитектуры, чем логики.

Если в потенциальной возможности 1000 одновременных добавлений разнородной информации, то (имхо) - я бы думал в сторону связки мастер - слэйв на уровне БД, чем городил огород в виде очереди.

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

Чем больше времени вы тратите на одну отработку, тем меньше запросов вы способны обработать в минуту. В итоге - умный сервер становится большим тормозом
 

Gorynych

Посетитель PHP-Клуба
я как бы догадывался (исходя из "мне на практике такие случаи не особо встречаются"), но любопытно стало...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху