Czekanie z wywołaniem/wykonaniem requestu na inny request

0

Cześć mam taką zagwozdkę.

Mam 4 endpointy które wszystkie mogą zostać wywołane w tym samym czasie. Ale sam endpoint może być wywołany dopiero wtedy gdy zakończyło się wcześniejsze wywołanie. Dodatkowo endpointy robią jedną rzecz wywołują jedną metodę która jest wywoływana w tych 4 endpointach. Jak wykorzystać tutaj asynchroniczność ??

2

Możesz trochę więcej coś powiedzieć. Jakoś nie potrafię sobie w głowie żadnego use-case wymyślić, aby musieć czekać, aż się skończy wykonywać endpoint.

2

Opisz to lepiej bo ciężko zrozumieć o co ci chodzi.

2
var napisał(a):

Opisz to lepiej bo ciężko zrozumieć o co ci chodzi.

Prawda.
Da się odczytać tak rozbieżnie, że nawet nie jest oczywiste client czy server
Jak łyknę kawy z lewej wydaje mi sie że klient, jak soku z prawej, że d/d zaprojektowany czarny sen "jak nie robić mikroserwisów"

0
var napisał(a):

Opisz to lepiej bo ciężko zrozumieć o co ci chodzi.

Jasne :)

To tak mam 4 endpointy:

        [HttpPut("")]
        [ProducesResponseType(typeof(CommandResponse), 200)]
        public async Task<IActionResult> DoSomething3([FromBody] Model<TESTOWY1> model)
        {
            return await Handle(async () => HandleServiceResult(await _missionService.DoSomething(model, ZoneType.TEST4)));
        }

        [HttpPut("")]
        [ProducesResponseType(typeof(CommandResponse), 200)]
        public async Task<IActionResult> DoSomething2([FromBody] Model<TESTOWY2> model)
        {
            return await Handle(async () => HandleServiceResult(await _missionService.DoSomething(model, ZoneType.TEST3)));
        }

        [HttpPut("")]
        [ProducesResponseType(typeof(CommandResponse), 200)]
        public async Task<IActionResult> DoSomething1([FromBody] Model<TESTOWY3> model)
        {
            return await Handle(async () => HandleServiceResult(await _missionService.DoSomething(model, ZoneType.TEST2)));
        }

        [HttpPut("")]
        [ProducesResponseType(typeof(CommandResponse), 200)]
        public async Task<IActionResult> DoSomething([FromBody] Model<TESTTOWY4> model)
        {
            return await Handle(async () => HandleServiceResult(await _missionService.DoSomething(model, ZoneType.TEST1)));
        }

Te endpointy wykonują tą samą metodę DoSomething wykonanie jej zajmuję około 3 minut.

Te 4 endpointy mogą zostać wywołane w tym samy czasie.

Ale sam jeden endpoint może zostać wywołany dopiero wtedy gdy zakończy się działanie wcześniejszego wywołania.

Jak z takimi założeniami mam je zaprojektować jak no to wszystko mam patrzeć pod kątem wielowątkowym ? :)

0

Chyba dalej nie kumam 😅

Klient 1 => pyta endpoint DoSomething3() => czeka 3 minuty na response
Klient 2 => pyta endpoint DoSomething3() => czeka 3 minuty, czy czeka ~6 minut, bo klient 1 jeszcze nie skończył?

Ogólnie rzecz biorąc, na tę chwilę, oba klienty czekają 3 minuty, aż się zadanie nie skończy. Ba, każdy (nowy) klient ma swój wątek i swoje "3 minuty". Co mam rozumieć jako "kąt wielowątkowy"? Chcesz zablokować endpoint jeśli jest w użyciu? Co jeśli klientów na endpoint będzie 20? Ten 21 będzie czekał godzinę? Obawiam się, że webapi tak nie działa 🤔

0
AdamWox napisał(a):

Chyba dalej nie kumam 😅

Klient 1 => pyta endpoint DoSomething3() => czeka 3 minuty na response
Klient 2 => pyta endpoint DoSomething3() => czeka 3 minuty, czy czeka ~6 minut, bo klient 1 jeszcze nie skończył?

Ogólnie rzecz biorąc, na tę chwilę, oba klienty czekają 3 minuty, aż się zadanie nie skończy. Ba, każdy (nowy) klient ma swój wątek i swoje "3 minuty". Co mam rozumieć jako "kąt wielowątkowy"? Chcesz zablokować endpoint jeśli jest w użyciu? Co jeśli klientów na endpoint będzie 20? Ten 21 będzie czekał godzinę? Obawiam się, że webapi tak nie działa 🤔

Własnie chodzi o to że mamy jednego klienta, chcę klientowi umożliwić wywołanie 4 endpointów w tym samym momencie ale endpoint może zostać wywołany dopiero wtedy gdy zakończy się wykonywanie wcześniejszego wywołania.

0

No to znaczy, że po stronie klienta musisz to kolejkować. Nie wywołuj kolejnego endpointa póki poprzedni nie zwróci response 🤔 Chyba, że nie masz możliwości tego zrobić po stronie klienta

0
AdamWox napisał(a):

No to znaczy, że po stronie klienta musisz to kolejkować. Nie wywołuj kolejnego endpointa póki poprzedni nie zwróci response 🤔 Chyba, że nie masz możliwości tego zrobić po stronie klienta

Wiesz co problem jest w tym właśnie że ja w ogóle nie mam dostępu do klienta. I po swojej stronie chciałem to jakoś zabezpieczyć

0

Mam przeczucie, że nie ma szans. Po stronie klienta można zrobić wszystko. Nawet jakbyś postawił jakiegoś "ifa", który zablokuje endpoint na czas zakończenia poprzedniego, to po stronie klienta odpytanie odbywa się tylko raz - zapytanie => odpowiedź. Może jakaś pętla, np while, ale obawiam się, że trzeba będzie robić jakieś chore obejścia z "nasłuchiwaniem" wartości w pętli 🤔 W tej kwestii trzeba kogoś mądrzejszego ode mnie.

2

Hej,

Może dla Ciebie będzie rozwiązanie użycie locka i wykonywanie tylko jednego request w czasie:

referencja:
https://stackoverflow.com/questions/53703483/how-to-to-make-sure-that-the-api-only-processes-one-request-at-a-time

Miałem kiedyś podobny problem z API Comarcha i to mi rozwiązało problem, bo tam oni nie umieli kiedyś w wielowątkowość ;-)

Milego dnia!

2
Michal-Warmuz napisał(a):

Te endpointy wykonują tą samą metodę DoSomething wykonanie jej zajmuję około 3 minut.

Te 4 endpointy mogą zostać wywołane w tym samy czasie.

Ale sam jeden endpoint może zostać wywołany dopiero wtedy gdy zakończy się działanie wcześniejszego wywołania.

Jak z takimi założeniami mam je zaprojektować jak no to wszystko mam patrzeć pod kątem wielowątkowym ? :)

Weż flaszkę, zapij, zapomnij.

Skąd pomysł by jakieś funkcjonalności włożyć AKURAT w filozofię endpointów? Bo modne? Obawiam się twórca nie zrozumiał NIC z istoty, o co w tym chodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1