Является ли диспетчер событий подходящим решением?
Я работаю над проектом API, который должен отправлять электронные письма и хранить статистику после (или до, в зависимости от реализации), когда ответ был возвращен клиенту. В обоих случаях я рассматриваю компонент Symfony EventDispatcher (я не использую Symfony в качестве платформы), поэтому каждое действие контроллера будет отправлять событие, чтобы добавить электронное письмо в очередь или вставить данные в таблицу базы данных статистики.
Таким образом, эта штука будет выглядеть примерно так это
Controller
=> Send Response to client
=> Dispatch Event email => EmailEventListener => Mail queue
=> Dispatch Event stats => StatsEventLister => Database
Я рассматриваю это, потому что хочу, чтобы эти внутренние действия были настолько асинхронными, насколько это возможно. Является ли это подходящим решением для данного случая?
РЕДАКТИРОВАТЬ: Как Йован Перович предложил, я добавляю дополнительную информацию. API - это REST API, с которым пользователи общаются с помощью веб-приложений или мобильных приложений, и я хочу регистрировать, хранить статистику и отправлять уведомления (в первую очередь электронные письма) без ущерба для производительности API, первой идеей было использовать что-то, что запускается после возвращаю ответ клиенту, но я не знаю, возможно ли это с помощью EventDispatcher. Даже если использовать очередь для обработки статистики или уведомлений, мне нужно централизованное место, где все контроллеры могут отправлять информацию, чтобы записывать журналы и хранить статистику.
Я надеюсь, что моя цель теперь более ясна. Извините.
1 answers
Я думаю, вы могли бы использовать Фильтры запросов (After
было бы подходящим для вас), хотя я никогда не пытался использовать их вне рамок Symfony2
.
Что касается асинхронных операций, в общем, сокеты - ваш друг. Вы можете вывести логику наружу, отправив данные в какой-нибудь сокет, который, в свою очередь, соответствующим образом обработает данные. Если эта обработка несущественна (например, электронная почта и статистика), ваш запрос может быть завершен, даже если ваш внешний механизм выйдет из строя.
Некоторое время назад я читал о Gearman
вот (просто пример), который может помочь воплотить это в жизнь, создав отдельные рабочие места.
Надеюсь, это прольет здесь немного света:)