Что более эффективно для отправки обновлений WebSocket с изменением базы данных MySQL

В настоящее время я экспериментирую с WebSockets, чтобы уменьшить/устранить необходимость в постоянных запросах AJAX в среде с потенциально низкой пропускной способностью. Все устройства совместимы с WebSocket, поэтому здесь нет проблем, и я пытаюсь сохранить его для собственных веб-сокетов PHP, без node.js или других фреймворков/библиотек (что до сих пор было хорошо).

Что я хочу сделать, так это решить, как уведомлять подключенных клиентов об обновлении базы данных другим клиентом. Рассматриваемый вариант использования — это человек, нажимающий кнопку на своем устройстве, который затем предупреждает менеджеров по персоналу об этом нажатии. Итак, у меня есть два варианта:

<сильный>1. Зацикливание запроса к базе данных (PHP)

Моя первая мысль состояла в том, чтобы вставить запрос на сервер WebSocket, который фактически говорит: «Изменилось ли поле предупреждения? Если да, уведомите менеджера (ов)». Хотя это самый простой и разумный подход (который я могу придумать), кажется расточительным иметь PHP-скрипт, предназначенный для снижения нагрузки на сервер, который теперь выполняет запрос каждую секунду, однако, по крайней мере, это гарантирует, что при обнаружении обновления базы данных оно отправляется.

<сильный>2. Отправка уведомления от Клиента

Еще одна мысль, которая у меня была, заключалась в том, что когда клиент обновляет базу данных, он фактически может сам отправлять уведомление WebSocket. Преимущество этого заключается в сокращении любых интенсивных и зацикленных запросов, но также означает, что мне нужно будет отправлять сообщение WebSocket каждый раз, когда я хочу изменить какие-либо данные, например:

$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code
{
    if(Result == "Successful")
    {
        SendWebSocketNotification(OtherData);
    }
}

Возможно, это лучший вариант, поскольку он наиболее эффективен, но я беспокоюсь, что есть вероятность, что соединение может разорваться между обновлением базы данных и отправкой уведомления WebSocket, что может создать необходимость резервной проверки в файле PHP. , как и в первом решении, хотя и с более длинным интервалом (скажем, каждые 30 секунд).

<сильный>3. Триггер MySQL?

Это чисто предположение, но, возможно, еще один вариант — создать триггер MySQL, который может каким-то образом напрямую уведомлять файл server.php? Я понятия не имею, как это будет работать, и рискну предположить, что это может закончиться теми же или подобными требованиями к запросу, что и решение № 1, но это всего лишь...

Заранее спасибо за вашу помощь :)

EDIT: вариант решения 4

На самом деле мне только что пришла в голову еще одна мысль: файл PHP, используемый для обновления базы данных, на самом деле может иметь встроенное в него сообщение WebSocket. Так что, когда файл PHP обновляет базу данных, сервер WebSocket уведомляется через PHP, возможно ли это?


person Duncan McArdle    schedule 01.11.2013    source источник
comment
Рассматривали ли вы возможность использования SSE (Server Side Event)?   -  person Aaron Gong    schedule 01.11.2013
comment
Не раньше, только что просмотрел их, и хотя у них есть потенциал, я чувствую, что наличие прослушивателя событий на месте было бы менее эффективным, чем просто отправка одного уведомления? Тем более, что система развивается с потенциалом для многих подобных вариантов использования, работающих в одной системе. Или есть какой-то способ заставить SSE выполнять обновление базы данных MySQL, уведомляя об аспекте сервера WebSocket?   -  person Duncan McArdle    schedule 01.11.2013
comment
для одностороннего SSE кажется более простым в реализации и управлении, и, читая некоторые статьи, их производительность кажется похожей. Я думаю, что сценарий, который обрабатывает обновление, также можно использовать для отправки обновления после успешного обновления в БД.   -  person Aaron Gong    schedule 01.11.2013


Ответы (2)


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

Если вы беспокоитесь о несоответствиях из-за обрыва соединения или каких-либо промежуточных изменений, вы можете реализовать систему, подобную HTTP ETags, где клиент отправляет хэш-код, на который вы можете ответить на стороне сервера в случае возникновения конфликта при обновлении.


Обновление: я думаю, я немного неправильно понял вашу первоначальную проблему. Если я правильно понимаю ваш вариант использования: вы отправляете обновления базы данных с клиента, и после этого все подключенные клиенты должны быть обновлены. В этом случае я думаю, что сервер должен отправлять сообщения об обновлении после того, как обновления БД были выполнены, поэтому я согласен с решением 4. Здесь я предполагаю, что ваш сервер веб-сокетов — это тот же сервер, на котором работает PHP и который выполняет обновления БД.

Однако, в зависимости от вашего варианта использования, клиент по-прежнему должен отправлять хэш-значение при следующем запросе, идентифицирующем его «представление о мире», поэтому вы не будете выполнять одинаковые обновления несколько раз, если соединение будет разорвано.


Обновление 2: теперь стало понятно, что вы действительно используете отдельный автономный сервер веб-сокетов. По сути, у вас есть два разных веб-сервера на стороне сервера, и у вас есть проблема с тем, как общаться между ними. Это реальная проблема, и я бы рекомендовал использовать только один сервер за раз — либо взгляните на использование Поддержка веб-сокетов Apache (экспериментальная и не рекомендуется) или перенос ваших php-скриптов на экземпляр веб-сокета.

Ни PHP, ни Apache на самом деле не были созданы с учетом веб-сокетов. Довольно легко настроить автономный сервер веб-сокетов, используя только PHP, но может быть не так просто перенести на него остальную часть стека PHP, если код зависит от Apache/веб-сервера. Поддержка веб-сокетов Apache также вряд ли оптимальна. К сожалению, для реального веб-решения лучше всего использовать технологию, которая создана для него с нуля.

person eis    schedule 01.11.2013
comment
Меня беспокоит не столько конфликт при обновлении, сколько то, что если пользователь обновил БД, то у него обрывается соединение, БД поставил бы алерт, но клиент не уведомил бы тех, кто подключился через WebSocket. Согласно вашему первому пункту, я бы по-прежнему использовал WebSockets для уведомления клиента, я бы просто инициировал исходное уведомление через сервер, поскольку это уведомление уже поступает с сервера как есть (решение № 4). Похоже, это устраняет возможность разрыва соединения между ними? - person Duncan McArdle; 01.11.2013
comment
@Redgie хорошо, тогда я немного неправильно понял вашу первоначальную проблему. Я добавил некоторые детали в свой ответ. - person eis; 01.11.2013
comment
Да, теперь это имеет немного больше смысла, хотя мне все еще нужно найти способ, чтобы файл PHP, который обновляет БД, взаимодействовал с сервером WebSocket! - person Duncan McArdle; 01.11.2013
comment
@Redgie Я предполагаю, что ваш сервер веб-сокетов — это тот же сервер, на котором работает PHP и который выполняет обновления БД. - это другой или тот же сервер? Или у вас есть обновления БД где-то еще, кроме вашего сервера WebSocket? Почему не выполняется обновление базы данных на сервере websocket, если они разные? - person eis; 01.11.2013
comment
Да, они работают на одном сервере. Преобразование системы для запуска всех запросов из файла веб-сокета было бы довольно сложным процессом, поскольку существует различное количество статических и динамически генерируемых запросов! - person Duncan McArdle; 04.11.2013
comment
если они уже на одном сервере, я не понимаю, какая конвертация потребуется :) Здесь не хватает чего-то важного, чего я не понимаю. ваш PHP работает на apache, это правильно? так ваш веб-сервер также работает на apache или это автономный сервер? - person eis; 04.11.2013
comment
Что ж, материал WebSocket эффективно работает на собственном сервере, хотя он просто написан на PHP, и поэтому я должен предполагать, что он проходит через Apache... - person Duncan McArdle; 04.11.2013
comment
@Redgie, это неверное предположение. Запуск его с PHP не означает, что он проходит через apache. Серверы Websocket обычно работают автономно, и я подозреваю, что вы используете здесь автономный сервер PHP Websocket, который никоим образом не знает Apache. - person eis; 04.11.2013
comment
Ах, извините, да, вы правы, тогда это автономный сервер PHP WebSocket, написанный мной на основе различных реализаций PHP, доступных в Интернете. - person Duncan McArdle; 04.11.2013
comment
Спасибо, это проясняет ситуацию. Я обновил свой ответ на основе этой информации. - person eis; 04.11.2013

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

User send content->Php script process content and save data according to true condition->check database is updated by checking return of mysql_query/other alternative->if true than use web-socket and send notification to all users

теперь это более просто/удобно/экономит пропускную способность.

person Ravinder Payal    schedule 21.04.2014
comment
Интересно, насколько это отличается от моего варианта № 2? - person Duncan McArdle; 29.04.2014
comment
Во многих отношениях это отличается, вы говорите, что когда клиент что-то обновляет, он также отправляет уведомление на сервер веб-сокетов, но в моем вопросе нет необходимости отправлять другой запрос на сервер, и если вы говорите, что что, если соединение прервано, чем я хочу сказать вы знаете, что в веб-сокетах js есть триггер, и вы можете снова вызвать функцию для подключения к серверу веб-сокетов, как это делает gtalk внутри gmail (обратный отсчет начинается, когда соединение разрывается, чтобы снова подключиться или попытаться снова подключиться). ладно, мне всего 15 лет, поэтому у меня нет большого опыта во всем этом, ладно - person Ravinder Payal; 29.04.2014