Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Асинхронный режим на сервере / 15 сообщений из 15, страница 1 из 1
14.02.2020, 14:52
    #39926741
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Есть самописный сайт на PHP.
В некоторых случаях сайт обращается ко внешней системе для получения данных (REST-сервис), а затем отображает полученные данные пользователю.
Для некоторых запросов время их выполнения может быть довольно заметным (3-5 секунд, может быть даже до 10 секунд).
Как следует обрабатывать такие запросы? Ждать ответа (и соответственно пользователь тоже будет ждать), а затем вернуть результат?
Или вернуть пользователю страницу "Ждите", а затем через несколько секунд ее обновить? Можно ли это сделать без внешнего MQ, ведь если пользовательский запрос будет обработан, то веб-сервер завершит поток и возвращать ответ от внешней системы будет некуда.
...
Рейтинг: 0 / 0
14.02.2020, 19:50
    #39926903
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Alibek B.
Ждать ответа (и соответственно пользователь тоже будет ждать), а затем вернуть результат?
Или вернуть пользователю страницу "Ждите", а затем через несколько секунд ее обновить?
В идеале хорошо бы получить данные со стороны заранее и закешировать их локально, тогда никаких "ожидалок" не требуется. Конечно, если по бизнес-логике это возможно в принципе.
Вариант, когда внешний сервис недоступен и возвращать в ответе нечего, вообще не рассматривается?
...
Рейтинг: 0 / 0
14.02.2020, 20:31
    #39926917
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Что можно кешировать, разумеется кешируется.
Но не все получится.
Если внешний сервис не ответил за определенное время, сайт покажет сообщение о недоступности данных.
...
Рейтинг: 0 / 0
18.02.2020, 21:38
    #39928197
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Ну ставите задачу в очередь, воркеры ее решают и записывают результат по завершению. А пока идут расчеты клиентская часть либо с небольшим интервалом ведет опрос пока не будет готов результат, либо подписывается на уведомления и ожидает результат какой-то.
...
Рейтинг: 0 / 0
18.02.2020, 22:18
    #39928208
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Это и есть «внешние MQ».
Других способов нет?
...
Рейтинг: 0 / 0
18.02.2020, 22:35
    #39928213
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Других... Ну, если только попробовть сбагрить работу с внешкой непосредственно на клиента. Вроде, этот вариант пока не упоминали. :)
...
Рейтинг: 0 / 0
18.02.2020, 22:41
    #39928214
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Ну тогда по сути и веб-сервер не нужен, достаточно статичных html.
Но это сильно все осложнит, REST-сервер не рассчитывался на работу с непосредственно посетителями. Там и авторизацию нужно пересматривать, и код пересматривать.
...
Рейтинг: 0 / 0
19.02.2020, 00:02
    #39928230
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Alibek B.,

Так и смотрите, какой вариант более оптимальный, какой более подходящий.

По сути, вебсервер, который обращается к внешке, является прокси. Допускаю, конечно, что на нем какая-то обработка данных происходит. Однако, в описываемом контексте его задача состоит в том, чтобы получить данные с внешки и отдать их клиенту. Притом, из-за тормозов внешки возникла дилемма - то ли долго ждать ответа от внешки, то ли нагрузить вебсервер дополнительными запросами от клиента "ну что, готово уже?" или замутить ответы на PUSH технологии. Вот я даже не знаю, что проще. По мне так ни тот, ни другой вариант не нравятся в первом приближении.

Пересматривать и переделывать, конечно, тоже некузяво. Однако, может статься, что оно окажется соизмеримо по трудозатратам, а может и проще. В случае переделки попутно избавляетесь от прокладки в виде прокси. Разумеется, если это возможно в принципе.

Третий вариант, с предварительным запросом данных от внешки и их локальным кешированием на вебсервере, который в роли прокси, так понимаю, невозможен в принципе.


Alibek B.
достаточно статичных html
Уж звиняте, отсюда не видно, что и как там работает. :)
...
Рейтинг: 0 / 0
19.02.2020, 08:06
    #39928262
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Ну я собственно и спросил, может быть есть другие способы или наработки.
Сайт это не просто прокси, на нем еще и авторизация посетителей, а еще у него есть доступ к внутренним сервисам, которые я бы очень не хотел публиковать в интернете. Ну и еще некоторые мелочи.
То есть по сути, либо всю логику переносить на клиентский JS (с соответствующими изменениями REST-сервиса), либо использовать очередь сообщений. Либо не возвращать клиенту ответ, пока не будут получены данные. Так?
MQ мне кажется перебором, наверное сделаю, чтобы клиент ждал.
А чтобы ждать было не так скучно, видимо буду использовать полноэкранный фрейм (на основной странице скрипт-диспетчер, во фрейме ответ сервера), либо клиентский js будет целиком подменять body самого себя ответом сервера. Тогда можно будет показать клиенту сообщение "Ждите", пока не поступит ответ от сервера.
...
Рейтинг: 0 / 0
19.02.2020, 09:00
    #39928273
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Alibek B.
Либо не возвращать клиенту ответ, пока не будут получены данные. Так?
Сюда еще добавить вариант "вернуть ответ о невозможности получения данных" для случая, когда не устанавливается связь или нет ответа, так скажем, за приемлемые 20 секунд.
...
Рейтинг: 0 / 0
19.02.2020, 09:04
    #39928276
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Ну на сайте сам веб-сервер прибьет поток через некоторое время, и клиент получит 504 от браузера, разве нет?
...
Рейтинг: 0 / 0
19.02.2020, 09:35
    #39928290
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Затрудняюсь сказать. Может и 200 с набором пхпшных ошибок, если они включены. Или с пустотой.
...
Рейтинг: 0 / 0
20.02.2020, 01:12
    #39928697
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Alibek B.
может быть есть другие способы
заменить php на что-либо штатно поддерживающее асинхронную работу

Либо продолжать костыли городить
...
Рейтинг: 0 / 0
20.02.2020, 12:33
    #39928840
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Alibek B.
Ну на сайте сам веб-сервер прибьет поток через некоторое время, и клиент получит 504 от браузера, разве нет?

В зависимости от настроек.
...
Рейтинг: 0 / 0
20.02.2020, 12:35
    #39928843
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный режим на сервере
Изопропил
Alibek B.
может быть есть другие способы
заменить php на что-либо штатно поддерживающее асинхронную работу

Либо продолжать костыли городить


А причем тут пхп, если у него клиент на одной стороне, а задача на сервере. Любой язык возьми и там будут те же проблемы. Либо клиент будет "висеть на проводе" и ждать. Либо он будет обращаться периодически и спрашивать "ну что там?". Так же и задача, либо будет выполняться в процессе вебсервера и недалек тот час когда веб-сервер скажет новому пользователю "у меня нет для тебя ресурсов, тут какой-то вася 250 раз скрипт запустил", либо он нормальную очередь сделает и пулл обработчиков.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Асинхронный режим на сервере / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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