|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Добрый день уважаемые! Хотел бы послушать ваши замечания/предложения по описанной мною схемы построения системы. Разрабатываю проект, являющийся веб-приложением. Весь бэкенд на php + mysql. В какой-то момент понял, что обновление данных на страничке пользователя через периодические ajax запросы проверки на сервер очень быстро погубят систему. Просто в силу большого количества запросов и необходимости при каждом таком запросе делать запрос к БД. Решил использовать для этого Node.JS и WebSocket'ы. Итого пришёл к такой схеме: Веб сервер c PHP Веб сервер с Node.JS Сервер БД MySQL Сервер memcached Логика предполагается такой: Страничку клиенту генерирует веб сервер с PHP запрашивая данные с MySQL. В процессе работы, если изменяются какие-то данные, требующие обновления у клиентов это помечается флагом в memcached. На страничках клиентов устанавливается соединение WebSocket с сервером Node.JS, где в цикле проверяются флаги из memcached и если для данного клиента есть необходимость обновить содержимое, то с Node.JS ему отправляется команда и клиент обращается ajax-запросом на веб-сервер, где ему всё что надо генерируют. Для сопоставления сессий на сервере с php и Node.JS при первоначальном входе клиента и генерации ему странички с генерацией php сессии отправлять этот идентификатор сессии на Node.JS для установки WebSocket'а и там уже его сохранять в массиве WebSocket соединений. Вопросы у меня такие: Стоит ли городить такую схему или у неё есть какой-то принципиальный изъян? Схема сопоставления сессий адекватна или это колхоз? Сразу дам свои пояснения почему так решил делать. Так как во-первых с Node.JS опыт работы это прямо вот сейчас и начал "щупать" при возникновении задачи, то не хочу неумеючи писать на нём что-то большее чем проверка при необходимости получить обновления с сервера. И во-вторых, просто не нравится идея писать что-то серверное на JS. А с сессиями вопрос, потому что ведь получение флагов с memcached должно быть для данной сессии, а идентификаторы этих сессий в php и Node.JS никак не связаны между собой. Хотя сессии php опять же может автоматом держать в memcached. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2015, 09:54 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Классно! Вот только ничего не понятно. Ни что за приложение, ни какие факторы повлияли на выбор архитектуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2015, 10:20 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша...с Node.JS опыт работы это прямо вот сейчас и начал "щупать".... я не знаком с указанным зверем, но чем это лучше стандартизированного ява-скрипта? Вроде как там на раз-два вашу логику реализовать = не вы первый в сотом кругу... (круглый) ЗЫ Если реклама была - простите, заткнулся ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2015, 18:29 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
skyANA...ни какие факторы повлияли на выбор архитектуры. kolobok0я не знаком с указанным зверем, но чем это лучше стандартизированного ява-скрипта? Вроде как там на раз-два вашу логику реализовать = не вы первый в сотом кругу... (круглый) ЗЫ Если реклама была - простите, заткнулся В том и дело. Вот зачем мне нужны эти два зверя дополнительных (Node.JS + Memcached). Чтобы пользователю на экран браузера прилетали обновления без его участия, т.е. не когда он обновил страницу, а когда на сервере появилось что ему показать нового, так вот для этого если делать периодические запросы к серверу через IFRAME или через setInterval тот же самый, это получается что просто каждую секунду будет генерировать запрос на сервер. И соответственно для каждого такого запроса надо обратиться к БД. При допустим 100 одновременных клиентах, это 100 запросов в секунду. Я считаю что это будет совершенно лишний и серьёзный напряг впустую для сервера. А вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2015, 20:09 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша...соединение при загрузке страничке установлено и висит себе.... даже глянул, что за хрень в вики :) давайте от печки 1) вам нужно за минимальный джитер средствами вэб броузера показывать события клиенту(ну типа врач подсчитывает пульс клиента). 2) 100 запросов в секунду на заточенный для этого сервак вэб службы - для Вас дорого. 3) 100 миллионов(тут конечно-же будет обломс, т.к. это ресурс системный и любой вэб админ зарежет на второй сотне этот огород - не суть) коннекшеннов(которые имеют тенденцию расти прямо пропорционально времени) через аля сервер приложения(тут надо сказать - если коннекшен через TCP - то гоняем некий траф, хотя-бы для детекции облома связи) - ожидается некий бонус в чём-то. всё правильно описал? ик (круглый) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2015, 21:50 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
в форуме общаются только разработчики гугла, судя по всему. Ворочают все миллионами запросов секунду ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2015, 21:58 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаskyANA...ни какие факторы повлияли на выбор архитектуры. kolobok0я не знаком с указанным зверем, но чем это лучше стандартизированного ява-скрипта? Вроде как там на раз-два вашу логику реализовать = не вы первый в сотом кругу... (круглый) ЗЫ Если реклама была - простите, заткнулся В том и дело. Вот зачем мне нужны эти два зверя дополнительных (Node.JS + Memcached). Чтобы пользователю на экран браузера прилетали обновления без его участия, т.е. не когда он обновил страницу, а когда на сервере появилось что ему показать нового, так вот для этого если делать периодические запросы к серверу через IFRAME или через setInterval тот же самый, это получается что просто каждую секунду будет генерировать запрос на сервер. И соответственно для каждого такого запроса надо обратиться к БД. При допустим 100 одновременных клиентах, это 100 запросов в секунду. Я считаю что это будет совершенно лишний и серьёзный напряг впустую для сервера. А вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление.а реальные цифры какие? Ползапроса в минуту? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2015, 13:21 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаА вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление. А что, сразу прислать новые данные серверу впадлу?.. Зачем тут генерация дополнительного запроса на обновление? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2015, 14:56 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
skyANAа реальные цифры какие? Ползапроса в минуту? А реальных цифр нет. Приложение пока разрабатывается, но разрабатывается с прицелом на вполне приличную аудиторию. Потому какие-то кажущиеся мне в будущем очевидно проблемные места хочу заранее учесть. Dimitry SibiryakovА что, сразу прислать новые данные серверу впадлу?.. Зачем тут генерация дополнительного запроса на обновление? Теоретически не впадлу. Проблема в том, что как уже написал, с Node.JS знаком "слегка", а эти новые данные чтобы послать, это надо из БД выбрать данные, всячески их обработать, сформировать в зависимости от обновляемых данных контент и потом уже послать клиенту. Для того чтобы сделать это не "говнокодом" надо нехило влезать в изучение этой самой Node.JS, а писать код совсем уж "рукожопно", лишь бы как-то работало - не хочется. Поэтому и думаю цель эту достигнуть кратчайшим путём. Вроде как не сильно усложняется схема. Как вся логика приложения писалась, так и будет писаться. А проверка просто реализуется дополнительным сервером. Сетевые издержки тоже минимальны, от сервера лишь несколько байт ответа о необходимости выполнить ajax запрос и всё. Прошу вас Уважаемые рассмотреть мой вопрос о том, каким образом мне информацию о сессии в на php сервере и Node.JS сервере синхронизировать. В частности в Node.JS в общем виде сессии (точнее даже не сессии а коннекты и не в Node.JS а в WebSocket компоненте для Node.JS) реализуются таким образом: Код: javascript 1. 2. 3. 4.
Что типа новое соединение добавляется в массив соединений, который обходится постоянно и проверяется что для каждого соединения делать. Если что-то для него надо сделать, то шлём по этому соединению клиенту сообщение: Код: javascript 1. 2. 3. 4. 5.
Так вот вопрос в том, как мне связать элемент из clientsArr со значением SESSION_ID в php? Пока всё что пришло в голову, так это при установке соединения WebSocket клиент должен послать на сервер Node.JS идентификатор сессии сгенерированный в php и на стороне Node.JS в массиве сохранить соответствие соединения c сессией. Есть ли у вас опыт как такую задачу решать правильно? Что меня смущает: Если идентификатор сессии слать на Node.JS через страничку, т.е. php генерирует код странички, в этом коде в JS-переменную записан идентификатор php сессии и эта переменная вместе с остальными параметрами передаётся для установления WebSocket'а, то ведь теоретически можно смухлевать и используя простейшие средства встроенные в каждый современный браузер послать на Node.JS произвольный идентификатор сессии. Если с php такой фокус не пройдёт, так как php имеет свою схему проверки корректности сессий, то Node.JS то никакой возможности для проверки правда ли эта сессия сгенерированная каким-то другим сервером соответствует этому клиенту нет. Помогите кто понял что я написал и кто знает как это решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2015, 21:13 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша...Помогите кто понял что я написал и кто знает как это решить. Есть замечательная книга по пых-пыху Максим Кузнецов Игорь Симдянов "Головоломки на PHP для хакера" Ну и форумы профильные читайте. Если по теме вопроса, то делается следующим образом: На стороне сервака идентификатор сессии заносится в бд. И в записи ставится однозначное соответствие сессии и куки, которая и уходит клиенту. Клиент гоняет куку, пока явно не сделает логофф. Сервак в каждую сессию запрашивает соответствие и в зависимости от результата обламывается или работает с определёнными правами для данного коннекта. Вообще-то, если хотите скорости = забудьте про всякие нахлобучки типа цэмээсов или раскрученных библиотек. В рукопашную - и будет Вам счастье... Пару запросов базу и Вы уже знаете что рисовать. Ышо парочка (в случае како-го нить ИМ) и полностью ответ готов. удачи вам (круглый) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 06:03 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаЧто меня смущает: Если идентификатор сессии слать на Node.JS через страничку, т.е. php генерирует код странички, в этом коде в JS-переменную записан идентификатор php сессии и эта переменная вместе с остальными параметрами передаётся для установления WebSocket'а, то ведь теоретически можно смухлевать и используя простейшие средства встроенные в каждый современный браузер послать на Node.JS произвольный идентификатор сессии. Если с php такой фокус не пройдёт, так как php имеет свою схему проверки корректности сессий, то Node.JS то никакой возможности для проверки правда ли эта сессия сгенерированная каким-то другим сервером соответствует этому клиенту нет. Помогите кто понял что я написал и кто знает как это решить. тебе в принципе слабое место на котором всё пойдёт прахом уже написали, где то на 40-м, 100-м соединении это всё у тебя отвалится для надёжности реконнекта можно Socket.io посоветовать, он в обход пойдёт если websocket отвалится - но тоже полумера и тормоза дополнительные высокие нагрузки сокетов только "легкие" потоки потянут: Erlang, Inferno - может до 2-х, 10-и тыщ коннектов дотянешь без БД ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 07:32 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаВесь бэкенд на php + mysql. В какой-то момент понял, что обновление данных на страничке пользователя через периодические ajax запросы проверки на сервер очень быстро погубят систему. Просто в силу большого количества запросов и необходимости при каждом таком запросе делать запрос к БД. я не понял. У вас основной ЯП - PHP. Но вы решили на форуме по ЯП не спрашивать т.к. у них проекты недостойны вашего? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 11:12 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
kolobok0..... Спасибо за информацию. CMS-ки никакие и не использую. Всё самописное, ну кроме например когда сильно нужны нахлобучки по типу класса для разбора/генерации XLS файлов, или класс мэйлер. Книжку возьму на заметку и почитаю. А про куки я что-то совсем не подумал. kealon(Ruslan)... всё отвалится Можете ссылкой кинуть, почему отвалится? У Node.JS или WebSocket есть серьёзные проблемы с производительностью? Это плохое решение? Прошу дайте ссылку с более развёрнутыми пояснениями вашей мысли. Petro123...профильный форум Так у меня же вопрос не по php программированию. У меня больше вопрос по организации схемы работы задуманного комбайна. Потому и нашёл самое близкое как я посчитал по смыслу "разработка ИС" ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 11:35 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаУ меня больше вопрос по организации схемы работы задуманного комбайна у программиста должна быть логика. У тебя вся задумка стоит на утверждении: Гуляев ГошаВ какой-то момент понял, что обновление данных на страничке пользователя через периодические ajax запросы проверки на сервер очень быстро погубят систему. Посмотри по сторонам. Как другие живут? )). Если твой посыл не верен, то жизнь прожита зря)). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 12:10 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гошазадуманного комбайнавелосипеда ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 12:11 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша, не спец. по данной теме, но, возможно, что-то можно узнать [здесь=] http://habrahabr.ru/company/comet-server/blog/273573/ [/здесь] ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 16:55 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаskyANAа реальные цифры какие? Ползапроса в минуту? А реальных цифр нет. Приложение пока разрабатывается, но разрабатывается с прицелом на вполне приличную аудиторию.Сколько миллионов? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 17:05 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша kealon(Ruslan)... всё отвалится Можете ссылкой кинуть, почему отвалится? У Node.JS или WebSocket есть серьёзные проблемы с производительностью? Это плохое решение? Прошу дайте ссылку с более развёрнутыми пояснениями вашей мысли. тебе же уже сказали почему, количество одновременно открытых соединений очень ограничено в любых системах ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2015, 07:00 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
kealon(Ruslan)количество одновременно открытых соединений очень ограничено в любых системах давайте в граммах вешать сколько топикстартеру нужно? 20000, 500000? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2015, 07:18 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Мнения по этому вопросу понял. Если что, надо провести тесты. Репрезентативен ли будет тест такого плана: На страничке циклом создаю N websocket соединений, а на сервере периодически рандомно посылаю каким-то из этих соединений сообщения, попутно подсчитывая сколько соединений закрылось. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2015, 12:48 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша, Броузер не даст создать большое N websocket соединений ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2015, 23:52 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев ГошаЕсли что, надо провести тесты. Тебя в школе учили? "Не если что...", а тестами подкрепить свои или чужие Утверждения. Сначала выдвигаешь утверждение , а потом тестом опровергаешь или подкрепляешью. Иначе весь топик в ПТ. Походу так оно и есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2015, 10:03 |
|
Обсуждение архитектуры информационной системы
|
|||
---|---|---|---|
#18+
Гуляев Гоша, Ты доведи систему для начала для того чтобы было. "Просто в силу большого количества запросов и необходимости при каждом таком запросе делать запрос к БД". Маштабировать систему нужно только тогда когда: 1) Текущая архитектура не тянет 2) У тебя по тех.требованиям оговоренно что система ОБЯЗАНА выдержать от 100.000 и более конкурентных пользователей. Выйди на рынок максимально быстро, будет спрос - задавай такие вопросы, в противном случае преждевременная оптимизация = рукоблудие ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2016, 19:12 |
|
|
start [/forum/topic.php?fid=33&fpage=10&tid=1547400]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
118ms |
get tp. blocked users: |
2ms |
others: | 290ms |
total: | 513ms |
0 / 0 |