C# - Выдать с огнем и забыть звонки - PullRequest
0 голосов
/ 20 июня 2020

У меня есть. NET Основная служба. Мы хотим реализовать вызов «огонь и забыть» для одной из его конечных точек. Когда запрос доходит до этой конечной точки, он должен запустить метод и немедленно вернуть ответ как Ok. Затем метод обрабатывает эти запросы, вызывая другие службы и некоторые операции с БД.

Вышеупомянутое работает нормально. Но когда я попытался провести тестирование производительности с тысячами запросов, отправленных друг за другом, мы заметили, что некоторые запросы вообще не обрабатываются. Он отлично работает до 4000 запросов, но более того, он не обрабатывает некоторые (около 20+) запросов. В журналах нет исключений

Как определить проблему?

await Task.Factory.StartNew(() => FireAndForgetMethod());
return Ok();

1 Ответ

2 голосов
/ 23 июня 2020

«Сожгли и забыли» буквально означает, что вам все равно, завершится ли выполнение, и вы совершенно нормально игнорируете исключения. Поскольку вы делаете заботитесь о его завершении, а вы делаете хотите видеть исключения, вы не имеете ситуацию, подходящую для «выстрелил и забыл».

Когда запрос доходит до этой конечной точки, он должен запустить метод и немедленно вернуть ответ как Ok. Затем метод обрабатывает эти запросы, вызывая другие службы и некоторые операции с БД.

Конечная точка API должна сериализовать работу, которая должна быть выполнена, в сообщение и поместить ее в надежную очередь сообщений (например, Azure Queue, Amazon Simple Queue и др. c), после чего он может вернуть результат HTTP своему вызывающему. Затем эта очередь должна быть прочитана, и каждое сообщение выполнено фоновым процессором (например, ASP. NET Core Worker Service).

...