Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин
202 Accepted.
Приложение также должно возвращать информацию, которая позволит клиенту опрашивать статус завершения. Обычно это какой-то URI «статуса». Стандарт требует либо ссылку на монитор статуса, либо примерное время, когда запрос будет выполнен. Это очень нечёткое требование, и именно здесь реализации начинают расходиться. Один из вариантов - вернуть URI статуса в теле 202 Accepted (например, в JSON). Другой вариант - вернуть URI статуса в заголовке ответа Location.
Как только клиент получит URI статуса, он может начать периодически вызывать этот URI для получения статуса асинхронной операции. Опять же, реализации расходятся в деталях. Пока операция не завершена, некоторые реализации возвращают 200 OK с каким-то индикатором «незавершённого статуса» в теле. Другие снова возвращают 202 Accepted. Сервер также может дополнительно включать «процент завершения» в тело ответа и/или заголовок Retry-After, если он имеет предполагаемое время завершения (для предотвращения чрезмерно частых вызовов).
Если операция завершается с ошибкой, то URI статуса может либо вернуть 200 OK с «ошибкой» в теле ответа, либо вернуть соответствующий код ошибки (4xx/5xx) с дополнительными сведениями об ошибке в теле ответа. В случае успеха URI статуса может возвращать 303 See Other с заголовком Location для ресурса, который был обновлён/изменён через асинхронное сообщение. Либо вернуть 200 OK, 201 Created или 204 No Content, чтобы указать на успешное завершение.
Как видите, реализуется асинхронный обмен сообщениями с точки зрения REST API по-разному. Нет никаких стандартов или общепринятого образца. Не тратьте время на поиск «правильного» варианта, просто чётко задокументируйте, какой подход вы используете.
И последнее замечание: промежуточные результаты, вроде статуса операции, прогресса или URI обновлённого ресурса не обязательно должны быть долговечными. Их можно хранить в памяти, например в общем кэше.
Уведомление
В некоторых случаях клиентам необходимо немедленно знать, когда сообщение было обработано. В этом случае можно использовать систему уведомлений, инициированную сервером. В наши дни это почти всегда WebSockets (или SignalR), хотя старые решения, такие как длинный опрос или даже серверные события (SSE), тоже всё ещё существуют. Все эти решения позволяют приложению отправлять сообщение уже подключённому клиенту. Смысл в том, что бэкенд-сервис подключается к HTTP-приложению через какую-то шину (например, через хаб SignalR), а затем отправляет сообщение по этой шине непосредственно в HTTP-приложение, которое уведомляет клиентов. Есть только одно предостережение: шина должна быть готова к масштабированию. Некоторые системы (например, SignalR) по умолчанию не настроены на масштабирование.
Окончание следует…
Источник: blog.stephencleary.com/2021/01…lts.htmlIHostedService или IHostApplicationLifetime для обнаружения и блокировки завершения работы приложения HTTP. BackgroundService также можно использовать, но имейте в виду, что работа может быть потеряна, если время завершения работы хоста истечёт.
В ASP.NET Framework используйте HostingEnvironment.QueueBackgroundWorkItem или IRegisteredObject.
Продолжение следует…
Источник: blog.stephencleary.com/2021/01…sor.htmlQueue<T>, BlockingCollection<T> или ChannelWriter<T> не являются «перманентными очередями».
2) Бэкенд-сервис
Это независимый сервис, который читает из этой перманентной очереди и обрабатывает элементы в ней (т.е. выполняет длительную операцию).
3) (необязательно) Какой-либо метод получения результатов.
Если клиенту необходимо знать результат длительной операции, то это та часть, которая предоставляет этот результат клиенту.
Один из распространённых примеров - отправка e-mail. Если API хочет отправить письмо, но не хочет ждать окончания отправки перед возвратом клиенту, то API должен добавить сообщение в перманентную очередь с описанием отправляемого письма, а затем вернуться. Поскольку это перманентная очередь, сообщение очереди сохраняется на диск перед отправкой HTTP-ответа клиенту. Затем отдельный сервис, читающий из этой очереди, извлекает сообщение и фактически отправляет e-mail.
Другой распространённый пример - запись в базу данных. Иногда возникают ситуации, когда API знает, что писать в БД, но не хочет заставлять клиента ждать. В этом случае API должен записать информацию в перманентную очередь, а затем выдать ответ клиенту. Затем отдельный бэкенд-сервис, читающий из этой очереди, извлекает информацию и выполняет фактическое обновление БД.
Получения результатов часто не требуется. Например, собственно письмо обычно является результатом отправки e-mail, а записи в базе данных в итоге будут отображаться, когда пользователь обновит страницу. Но иногда вам нужно, чтобы клиент был уведомлён о результатах. Это возможно либо с помощью опроса, либо с помощью упреждающего уведомления с использованием технологии обмена сообщениями, такой как WebSockets.
Далее мы подробно остановимся на каждой части решения и рассмотрим конкретные подходы.
Продолжение следует…
Источник: blog.stephencleary.com/2021/01…ure.html