Ответьте на сообщение HTTP MailGun и затем обработайте сообщение - PullRequest
0 голосов
/ 28 октября 2019

При получении почты через MailGun им требуется ответ в течение ограниченного времени. У меня есть две проблемы с этим:

1) После получения сообщения мне нужно обработать и записать его в CRM, что занимает некоторое время. Это приводит к истечению времени ожидания MailGun, прежде чем я получу ответ. Затем MailGun отправляет сообщение снова и снова, поскольку время ожидания истекает.

2) Сообщение MailGun не асинхронное, но вызовы API для моего CRM являются асинхронными.

Итак, мне нужно отправить MailGun ответ 200, а затем продолжить обработку сообщения. И этот процесс должен быть в асинхронном режиме.

В приведенном ниже коде показано, что я хочу, чтобы произошло. Я пытался использовать задачи и не мог заставить его работать. Бывают случаи, когда за один раз может приходить много электронных писем (например, при инициализации чьей-либо учетной записи), если для решения требуются какие-то параллельные задачи или потоки, ему нужно будет обрабатывать многие из них.

    public class HomeController : Controller
    {
        [HttpPost]
        [Route("mail1")]
        public ActionResult Mail()
        {
            var emailObj = MailGun.Receive(Request);

            return Content("ok");

            _ = await CRM.SendToEmailApp(emailObj);
        }
    }

Спасибо запомощь!

1 Ответ

0 голосов
/ 28 октября 2019

Самый простой способ сделать то, что вы описываете (что не рекомендуется, потому что вы можете потерять некоторые результаты в случае сбоя вашего приложения), это использовать задачу «забей и забудь»:

var emailObj = MailGun.Receive(Request);
Task.Run(async () => await CRM.SendToEmailApp(emailObj));
return Content("ok");

Но яПодумайте, что вам действительно нужно, это что-то вроде очереди сообщений. Используя очередь сообщений, вы помещаете сообщение в очередь (что достаточно быстро) и сразу же возвращаете его, в то же время процессор обрабатывает очередь сообщений и сохраняет результат вCRM.
Вот как это будет выглядеть, если вы используете брокер очереди сообщений.

simple architecture

...