170 похожих чатов

Привет! Вопрос простой, прошу сильно не пинать. :) Если что, интересует

в общих словах :)

Если нужно записать что-то тяжёлое в базу (или выполнить ещё какую-то такую тяжкую операцию) и отпустить клиента, не заставляя ждать, есть ли способы сделать это в монолите?

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

А есть ли вариант в едином монолите такого, или это априори невозможно?

13 ответов

18 просмотров

Ну то есть тебе нужен просто fire-and-forget? Task.Run и всего делов, ха-ха :)

Ap6ye-Ap6ye Автор вопроса
Ap6ye Ap6ye
Спасибо. :)

Ну, по уму такое обычно делают отдельным сервисом, жизненный цикл которого отвязан от обработки запроса клиента. А реализуют уже как угодно: простой отдельный шедулер а-ля cron, или же какая-то очередь (in-proc, out-of-proc), или уже отдельный микросервис. Я видал такое и в рамках условно монолитного деплоймента.

Ap6ye-Ap6ye Автор вопроса
Dr. Friedrich von Never
Ну, по уму такое обычно делают отдельным сервисом,...

Ну вот микросервисом я дало такое, да. :) Стало интересно именно как такое можно сделать без отдельного сервиса.

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

Ap6ye-Ap6ye Автор вопроса
Dr. Friedrich von Never
Как-то отвязаться от жизненного цикла запроса тебе...

Ну я и делал отдельным сервисом, который общался с монолитом по gRPC, но просто утром проснулся и подумал: «Хм, а вот если хочу сделать в монолите? 🤔», и понеслось. 🙂

Разобрались уже? Описанная задача может тривиально решаться, например, введением отдельной таблички в базе, в которую пишутся "запросы на выполнение задач". Затем фоновый сервис, реализованный, например, как IHostedService (см. https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice) раз в N секунд заглядывает в табличку и выбирает записи с IsProcessed = false, и затем по очереди (или параллельно) выполняет задачи, если они есть. В любой момент пользователь может узнать состояние любой задачи, заглянув в эту табличку. В микросервисных архитектурах чудо-табличка может быть заменена очередью сообщений, например, RabbitMQ.

Ap6ye-Ap6ye Автор вопроса

Не назвал бы такое решение тривиальным, ибо (как и я делал, и как @fvnever писал) чаще всего просто мутится сервис/микросервис, который сам этим занимается. :) Но за идею спасибо.

ιπταμενο ψαρι
Разобрались уже? Описанная задача может тривиально...

слышь, вы, рыба, куда делась rss читалка с гитхаба?

Ap6ye Ap6ye
Не назвал бы такое решение тривиальным, ибо (как и...

Тривиальное скорее в том контексте, что задача решается в пределах одной программы (и даже одного процесса). Сильнее связность, но меньше сервисов, которые надо поднимать для отладки системы в сборе.

Nyan
слышь, вы, рыба, куда делась rss читалка с гитхаба...

Салют! Планировалось её полностью переписать, но руки так и не дошли, к сожалению. Обнаружилось, что ReactiveUI плохо работает с AOT-компиляцией (приходятся сохранять огромные куски сборок через .rd.xml). Сейчас делается reflection-free ReactiveUI, но пока неизвестно, когда доделается: https://github.com/reactivemarbles/ObservableEvents Ещё делают WhenAny на сорсгенераторах.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта