Intereting Posts
Как использовать контейнер Symfony 2 в устаревшем приложении Как получить алгоритм подписи из сертификата? Как настроить php.ini для использования gmail в качестве почтового сервера хотите вставить загруженный файл csv в базу данных. он говорит «не выбрана база данных», что я пропустил? Как перенаправить форму после отправки на ту же страницу? Как отключить проверку синтаксиса Javascript в NetBeans 7.0 (версия Linux для PHP)? Как исправить предупреждение с даты () в PHP " Базовый php для установки ширины столбца в Joomla Кодировать / сжимать последовательность повторяющихся целых чисел Как удалить атрибуты с помощью PHP DOMDocument? Как отказаться от оплаты Paypal, если не из данного места проживания? лучшее видео ресурса для изучения php Как создать представление с помощью mysqli_multi_query? Метод очистки Doctrine EntityManager во вложенных объектах Как использовать аутентификацию для нескольких таблиц в Laravel 5

SendGrid для PHP работает медленно. Возможны ли неблокирующие запросы?

В настоящее время мы разрабатываем мобильное приложение для iOS и Android. Для этого нам нужны стабильные веб-сервисы.

Требования: – Основываясь на PHP и MySQL, должен быть быстрым, должен быть масштабируемым

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

Мой вопрос:

наше среднее время отклика с моим пользовательским кодированным решением составляет менее 100 мс (измеряется с использованием newrelic) для обычных запросов (скажем, обновление поля БД или выполнение INSERT INTO). Это без нагрузки (менее 100 пользователей в день). Когда мы создаем исходящие запросы (в частности, отправляя E-Mail с помощью SendGrid PHP-Framework), время ответа составляет> 1000 мс. Похоже, что запрос «ждет» ответа от Sendgrid. Можно ли сказать сценарию не «ждать ответа»? Это не идеальный вариант. Моя идея состояла в том, чтобы хранить все «ожидающие» запросы в отдельной таблице, а затем использовать cron для запуска всех «ожидающих» запросов и пометить их как «завершенные». Является ли это жизнеспособным решением? И будет ли один cron каждую минуту быть достаточным для обработки запросов (возможная задержка 1мин для каждой электронной почты)?

Как всегда, любые ответы или предложения очень приветствуются. Заранее спасибо!

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

Асинхронные запросы

Это отличное сообщение в блоге по асинхронным запросам PHP от Segment.io приводит к нескольким выводам:

  • Вы можете открыть сокет и написать ему , как описано в этой статье «Переполнение стека». Однако кажется, что это фактически блокирует и довольно медленно (300 мс в своих тестах).
  • Вы можете записать в файл журнала, а затем обработать его по-другому (по существу очередь, как вы описали). Однако для этого требуется другой процесс для чтения журнала и его обработки. Использование файловой системы может быть медленным, а общие файлы могут вызывать всевозможные проблемы.
  • Вы можете разблокировать запрос cURL. Однако это означает, что вы не ожидаете ответа, поэтому, если SendGrid (или какой-либо другой сервис) отвечает на ошибку, вы не можете его поймать и отреагировать.

Земельный участок

Мы теперь входим в землю полупризнания , но очереди, которые вы описываете (например, mySQL с заданием cron или текстовый файл или что-то еще), как правило, очень масштабируемы, так как вы можете бросать работников в очередь, если вы нужно, чтобы он работал быстрее. Они могут находиться за пределами вашей системы, обращенной к пользователю (и, следовательно, не обмениваться ресурсами).

Очереди

С очередью у вас будет отдельная служба , которая будет отвечать за отправку электронной почты с помощью SendGrid (например). Он вытащил задачи из очереди (например, «отправить письмо Нику»), а затем выполнить на нем.

Существует несколько способов реализации очередей, которые вы можете обрабатывать.

  • Вы можете написать свой собственный. Как вы, кажется, хотите остаться на PHP / mySQL, если вы это сделаете, вам нужно будет учесть проблемы с очередью и странные краевые случаи. Тем не менее, у вас будет абсолютный контроль, и для простого приложения, возможно, это сработает.
  • Вы можете реализовать собственную очередь задач – Celery предназначен для очереди распределенных задач, øMQ (ZeroMQ) и RabbitMQ также могут использоваться как очереди задач. Они должны быть быстрыми и распределенными, и в них было много мысли. Вам нужно будет сравнить их в своей системе, чтобы узнать, ускорят ли они это. Это также означало бы, что вы должны принимать дополнительные части самостоятельно. Однако это, скорее всего, будет самым быстрым решением с точки зрения коммуникации.
  • Вы можете передать вещи в очередь размещенных задач – IronMQ и Amazon SQS – это классные хостинговые решения, которые означают, что вам не нужно выделять ресурсы для них, кроме того, IronWorkers (например, вы могли бы получить другую службу, о которой позаботились). Однако, поскольку вы пытаетесь оптимизировать запрос к внешней службе, это, вероятно, не является решением в этом сценарии.

Почтовые рассылки

Что касается сообщений об очередности электронной почты (в частности), это распространено среди отправителей электронной почты. Как и во всем остальном, это означает, что у вас может быть более высокая надежность (потому что если служба на линии выходит из строя, вы можете сохранить ее в очереди и повторить попытку).

Вместе с электронной почтой для сообщений о очередях есть некоторые конкретные услуги. Это 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