В настоящее время мы разрабатываем мобильное приложение для iOS и Android. Для этого нам нужны стабильные веб-сервисы.
Требования: – Основываясь на PHP и MySQL, должен быть быстрым, должен быть масштабируемым
Я создал настраиваемые простые веб-сервисы с несколькими конечными точками, позволяющие передавать данные из приложения в нашу базу данных, и наоборот.
Мой вопрос:
наше среднее время отклика с моим пользовательским кодированным решением составляет менее 100 мс (измеряется с использованием newrelic) для обычных запросов (скажем, обновление поля БД или выполнение INSERT INTO). Это без нагрузки (менее 100 пользователей в день). Когда мы создаем исходящие запросы (в частности, отправляя E-Mail с помощью SendGrid PHP-Framework), время ответа составляет> 1000 мс. Похоже, что запрос «ждет» ответа от Sendgrid. Можно ли сказать сценарию не «ждать ответа»? Это не идеальный вариант. Моя идея состояла в том, чтобы хранить все «ожидающие» запросы в отдельной таблице, а затем использовать cron для запуска всех «ожидающих» запросов и пометить их как «завершенные». Является ли это жизнеспособным решением? И будет ли один cron каждую минуту быть достаточным для обработки запросов (возможная задержка 1мин для каждой электронной почты)?
Как всегда, любые ответы или предложения очень приветствуются. Заранее спасибо!
Чтобы ответить на первую часть вашего вопроса: да, вы можете делать асинхронные запросы с PHP и даже игнорировать ответ службы. Однако, как вы правильно говорите, это не супер-великое решение.
Это отличное сообщение в блоге по асинхронным запросам PHP от Segment.io приводит к нескольким выводам:
Мы теперь входим в землю полупризнания , но очереди, которые вы описываете (например, mySQL с заданием cron или текстовый файл или что-то еще), как правило, очень масштабируемы, так как вы можете бросать работников в очередь, если вы нужно, чтобы он работал быстрее. Они могут находиться за пределами вашей системы, обращенной к пользователю (и, следовательно, не обмениваться ресурсами).
С очередью у вас будет отдельная служба , которая будет отвечать за отправку электронной почты с помощью SendGrid (например). Он вытащил задачи из очереди (например, «отправить письмо Нику»), а затем выполнить на нем.
Существует несколько способов реализации очередей, которые вы можете обрабатывать.
Что касается сообщений об очередности электронной почты (в частности), это распространено среди отправителей электронной почты. Как и во всем остальном, это означает, что у вас может быть более высокая надежность (потому что если служба на линии выходит из строя, вы можете сохранить ее в очереди и повторить попытку).
Вместе с электронной почтой для сообщений о очередях есть некоторые конкретные услуги. Это SMTP-серверы. Теоретически вы можете настроить сервер, например sendmail, а затем установить SendGrid в качестве «smarthost» или relay и отправить сервер SendGrid. Затем он ставит в очередь и обрабатывает прерывания обслуживания и отправляет почту с небольшим дополнительным кодом. Тем не менее , SMTP-серверы испытывают трудности, даже если они просто пересылают сообщения. Кроме того, SMTP еще медленнее, чем HTTP, чтобы установить соединение, а потому, вероятно, не то, что вы хотите, но это хорошо знать.
Другое возможное решение, если вы контролируете свою собственную серверную среду, которая ускорит отправку электронной почты, а ваше приложение должно установить почтовый сервер, такой как Postfix, на местном уровне. Затем вы настраиваете Postfix для использования учетных данных Sendgrid, поэтому любой отправленный вами адрес отправляется с вашего сервера на sendgrid.
Это не решение PHP, но устраняет необходимость в написании собственного решения для клиентов. Если вы установите Postfix в качестве почтового сервера по умолчанию. Затем вы можете использовать функцию php mail () для отправки электронной почты.
https://sendgrid.com/docs/Integrate/Mail_Servers/postfix.html