powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Обсуждение архитектуры информационной системы
23 сообщений из 23, страница 1 из 1
Обсуждение архитектуры информационной системы
    #39131554
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые!

Хотел бы послушать ваши замечания/предложения по описанной мною схемы построения системы.

Разрабатываю проект, являющийся веб-приложением.
Весь бэкенд на 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.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132278
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классно!

Вот только ничего не понятно. Ни что за приложение, ни какие факторы повлияли на выбор архитектуры.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132370
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гоша...с Node.JS опыт работы это прямо вот сейчас и начал "щупать"....

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

(круглый)
ЗЫ
Если реклама была - простите, заткнулся
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132394
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA...ни какие факторы повлияли на выбор архитектуры.


kolobok0я не знаком с указанным зверем, но чем это лучше стандартизированного ява-скрипта? Вроде как там на раз-два вашу логику реализовать = не вы первый в сотом кругу...

(круглый)
ЗЫ
Если реклама была - простите, заткнулся

В том и дело. Вот зачем мне нужны эти два зверя дополнительных (Node.JS + Memcached). Чтобы пользователю на экран браузера прилетали обновления без его участия, т.е. не когда он обновил страницу, а когда на сервере появилось что ему показать нового, так вот для этого если делать периодические запросы к серверу через IFRAME или через setInterval тот же самый, это получается что просто каждую секунду будет генерировать запрос на сервер. И соответственно для каждого такого запроса надо обратиться к БД. При допустим 100 одновременных клиентах, это 100 запросов в секунду. Я считаю что это будет совершенно лишний и серьёзный напряг впустую для сервера.

А вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132421
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гоша...соединение при загрузке страничке установлено и висит себе....

даже глянул, что за хрень в вики :)
давайте от печки
1) вам нужно за минимальный джитер средствами вэб броузера показывать события клиенту(ну типа врач подсчитывает пульс клиента).
2) 100 запросов в секунду на заточенный для этого сервак вэб службы - для Вас дорого.
3) 100 миллионов(тут конечно-же будет обломс, т.к. это ресурс системный и любой вэб админ зарежет на второй сотне этот огород - не суть) коннекшеннов(которые имеют тенденцию расти прямо пропорционально времени) через аля сервер приложения(тут надо сказать - если коннекшен через TCP - то гоняем некий траф, хотя-бы для детекции облома связи) - ожидается некий бонус в чём-то.

всё правильно описал?
ик
(круглый)
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132426
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в форуме общаются только разработчики гугла, судя по всему. Ворочают все миллионами запросов секунду
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132530
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаskyANA...ни какие факторы повлияли на выбор архитектуры.


kolobok0я не знаком с указанным зверем, но чем это лучше стандартизированного ява-скрипта? Вроде как там на раз-два вашу логику реализовать = не вы первый в сотом кругу...

(круглый)
ЗЫ
Если реклама была - простите, заткнулся

В том и дело. Вот зачем мне нужны эти два зверя дополнительных (Node.JS + Memcached). Чтобы пользователю на экран браузера прилетали обновления без его участия, т.е. не когда он обновил страницу, а когда на сервере появилось что ему показать нового, так вот для этого если делать периодические запросы к серверу через IFRAME или через setInterval тот же самый, это получается что просто каждую секунду будет генерировать запрос на сервер. И соответственно для каждого такого запроса надо обратиться к БД. При допустим 100 одновременных клиентах, это 100 запросов в секунду. Я считаю что это будет совершенно лишний и серьёзный напряг впустую для сервера.

А вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление.а реальные цифры какие? Ползапроса в минуту?
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132545
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаА вебсокетом соединение при загрузке страничке установлено и висит себе. Когда на сервере есть что клиенту показать нового, сервер сам шлёт клиенту сообщение и на клиенте генерируется запрос на обновление.
А что, сразу прислать новые данные серверу впадлу?.. Зачем тут генерация дополнительного запроса на обновление?
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132633
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAа реальные цифры какие? Ползапроса в минуту?
А реальных цифр нет. Приложение пока разрабатывается, но разрабатывается с прицелом на вполне приличную аудиторию. Потому какие-то кажущиеся мне в будущем очевидно проблемные места хочу заранее учесть.

Dimitry SibiryakovА что, сразу прислать новые данные серверу впадлу?.. Зачем тут генерация дополнительного запроса на обновление?
Теоретически не впадлу. Проблема в том, что как уже написал, с Node.JS знаком "слегка", а эти новые данные чтобы послать, это надо из БД выбрать данные, всячески их обработать, сформировать в зависимости от обновляемых данных контент и потом уже послать клиенту. Для того чтобы сделать это не "говнокодом" надо нехило влезать в изучение этой самой Node.JS, а писать код совсем уж "рукожопно", лишь бы как-то работало - не хочется.

Поэтому и думаю цель эту достигнуть кратчайшим путём. Вроде как не сильно усложняется схема. Как вся логика приложения писалась, так и будет писаться. А проверка просто реализуется дополнительным сервером. Сетевые издержки тоже минимальны, от сервера лишь несколько байт ответа о необходимости выполнить ajax запрос и всё.

Прошу вас Уважаемые рассмотреть мой вопрос о том, каким образом мне информацию о сессии в на php сервере и Node.JS сервере синхронизировать.

В частности в Node.JS в общем виде сессии (точнее даже не сессии а коннекты и не в Node.JS а в WebSocket компоненте для Node.JS) реализуются таким образом:
Код: javascript
1.
2.
3.
4.
websocket.addListener("connect", function() { 
      // добавляем это соединения в массив пользователей 
      clientsArr.push(websocket); 
   });


Что типа новое соединение добавляется в массив соединений, который обходится постоянно и проверяется что для каждого соединения делать. Если что-то для него надо сделать, то шлём по этому соединению клиенту сообщение:
Код: javascript
1.
2.
3.
4.
5.
for(var i=0, l=clientsArr.length; i<l; i++) { 
         if(Надо_ли_чего_то_сделать){
           clientsArr[i].write("...");
         }
}



Так вот вопрос в том, как мне связать элемент из clientsArr со значением SESSION_ID в php?
Пока всё что пришло в голову, так это при установке соединения WebSocket клиент должен послать на сервер Node.JS идентификатор сессии сгенерированный в php и на стороне Node.JS в массиве сохранить соответствие соединения c сессией.
Есть ли у вас опыт как такую задачу решать правильно?

Что меня смущает: Если идентификатор сессии слать на Node.JS через страничку, т.е. php генерирует код странички, в этом коде в JS-переменную записан идентификатор php сессии и эта переменная вместе с остальными параметрами передаётся для установления WebSocket'а, то ведь теоретически можно смухлевать и используя простейшие средства встроенные в каждый современный браузер послать на Node.JS произвольный идентификатор сессии. Если с php такой фокус не пройдёт, так как php имеет свою схему проверки корректности сессий, то Node.JS то никакой возможности для проверки правда ли эта сессия сгенерированная каким-то другим сервером соответствует этому клиенту нет.

Помогите кто понял что я написал и кто знает как это решить.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132724
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гоша...Помогите кто понял что я написал и кто знает как это решить.

Есть замечательная книга по пых-пыху
Максим Кузнецов
Игорь Симдянов
"Головоломки на PHP для хакера"

Ну и форумы профильные читайте.

Если по теме вопроса, то делается следующим образом:
На стороне сервака идентификатор сессии заносится в бд. И в записи ставится однозначное соответствие сессии и куки, которая и уходит клиенту. Клиент гоняет куку, пока явно не сделает логофф.
Сервак в каждую сессию запрашивает соответствие и в зависимости от результата обламывается или работает с определёнными правами для данного коннекта.

Вообще-то, если хотите скорости = забудьте про всякие нахлобучки типа цэмээсов или раскрученных библиотек. В рукопашную - и будет Вам счастье... Пару запросов базу и Вы уже знаете что рисовать. Ышо парочка (в случае како-го нить ИМ) и полностью ответ готов.

удачи вам
(круглый)
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132732
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаЧто меня смущает: Если идентификатор сессии слать на Node.JS через страничку, т.е. php генерирует код странички, в этом коде в JS-переменную записан идентификатор php сессии и эта переменная вместе с остальными параметрами передаётся для установления WebSocket'а, то ведь теоретически можно смухлевать и используя простейшие средства встроенные в каждый современный браузер послать на Node.JS произвольный идентификатор сессии. Если с php такой фокус не пройдёт, так как php имеет свою схему проверки корректности сессий, то Node.JS то никакой возможности для проверки правда ли эта сессия сгенерированная каким-то другим сервером соответствует этому клиенту нет.

Помогите кто понял что я написал и кто знает как это решить.
тебе в принципе слабое место на котором всё пойдёт прахом уже написали, где то на 40-м, 100-м соединении это всё у тебя отвалится
для надёжности реконнекта можно Socket.io посоветовать, он в обход пойдёт если websocket отвалится - но тоже полумера и тормоза дополнительные
высокие нагрузки сокетов только "легкие" потоки потянут: Erlang, Inferno - может до 2-х, 10-и тыщ коннектов дотянешь без БД
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132852
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаВесь бэкенд на php + mysql.
В какой-то момент понял, что обновление данных на страничке пользователя через периодические ajax запросы проверки на сервер очень быстро погубят систему. Просто в силу большого количества запросов и необходимости при каждом таком запросе делать запрос к БД.
я не понял. У вас основной ЯП - PHP.
Но вы решили на форуме по ЯП не спрашивать т.к. у них проекты недостойны вашего?
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132901
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0.....
Спасибо за информацию. CMS-ки никакие и не использую. Всё самописное, ну кроме например когда сильно нужны нахлобучки по типу класса для разбора/генерации XLS файлов, или класс мэйлер.
Книжку возьму на заметку и почитаю.
А про куки я что-то совсем не подумал.

kealon(Ruslan)... всё отвалится
Можете ссылкой кинуть, почему отвалится? У Node.JS или WebSocket есть серьёзные проблемы с производительностью? Это плохое решение?
Прошу дайте ссылку с более развёрнутыми пояснениями вашей мысли.

Petro123...профильный форум
Так у меня же вопрос не по php программированию. У меня больше вопрос по организации схемы работы задуманного комбайна. Потому и нашёл самое близкое как я посчитал по смыслу "разработка ИС"
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132942
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаУ меня больше вопрос по организации схемы работы задуманного комбайна
у программиста должна быть логика.
У тебя вся задумка стоит на утверждении:
Гуляев ГошаВ какой-то момент понял, что обновление данных на страничке пользователя через
периодические ajax запросы проверки на сервер очень быстро погубят систему.
Посмотри по сторонам. Как другие живут? )).
Если твой посыл не верен, то жизнь прожита зря)).
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39132943
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гошазадуманного комбайнавелосипеда
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39133474
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гуляев Гоша,
не спец. по данной теме, но, возможно, что-то можно узнать [здесь=] http://habrahabr.ru/company/comet-server/blog/273573/ [/здесь]
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39133498
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаskyANAа реальные цифры какие? Ползапроса в минуту?
А реальных цифр нет. Приложение пока разрабатывается, но разрабатывается с прицелом на вполне приличную аудиторию.Сколько миллионов?
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39134044
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гоша
kealon(Ruslan)... всё отвалится
Можете ссылкой кинуть, почему отвалится? У Node.JS или WebSocket есть серьёзные проблемы с производительностью? Это плохое решение?
Прошу дайте ссылку с более развёрнутыми пояснениями вашей мысли.

тебе же уже сказали почему, количество одновременно открытых соединений очень ограничено в любых системах
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39134052
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)количество одновременно открытых соединений очень ограничено в любых системах
давайте в граммах вешать

сколько топикстартеру нужно? 20000, 500000?
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39134399
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мнения по этому вопросу понял. Если что, надо провести тесты.

Репрезентативен ли будет тест такого плана:
На страничке циклом создаю N websocket соединений, а на сервере периодически рандомно посылаю каким-то из этих соединений сообщения, попутно подсчитывая сколько соединений закрылось.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39135244
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гоша,

Броузер не даст создать большое N websocket соединений
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39135439
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаЕсли что, надо провести тесты.
Тебя в школе учили?
"Не если что...", а тестами подкрепить свои или чужие Утверждения.
Сначала выдвигаешь утверждение , а потом тестом опровергаешь или подкрепляешью.
Иначе весь топик в ПТ. Походу так оно и есть.
...
Рейтинг: 0 / 0
Обсуждение архитектуры информационной системы
    #39148469
mvn3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гуляев Гоша,

Ты доведи систему для начала для того чтобы было.
"Просто в силу большого количества запросов и необходимости при каждом таком запросе делать запрос к БД".


Маштабировать систему нужно только тогда когда:
1) Текущая архитектура не тянет
2) У тебя по тех.требованиям оговоренно что система ОБЯЗАНА выдержать от 100.000 и более конкурентных пользователей.
Выйди на рынок максимально быстро, будет спрос - задавай такие вопросы, в противном случае преждевременная оптимизация = рукоблудие
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Обсуждение архитектуры информационной системы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]