Witam Buduję usługę chmurową, która ma (na razie) jedną sieć i jedną rolę pracownika. Pożądany przepływ pracy będzie następujący: przeglądarka wywołuje kontroler webApi w roli internetowej, która wysyła wiadomość do kolejki (lub magistrali usług), która jest następnie przetwarzana przez rolę robota. Jak na razie dobrze. Teraz, gdy rola robocza zakończy przetwarzanie wiadomości, chciałbym wywołać metodę w roli sieci, która następnie zasygnalizuje przeglądarce, że przetwarzanie zostało zakończone (przez SignalR). Proszę mi wybaczyć, jeśli nie jest to właściwe miejsce do zadawania pytań, ponieważ jest to raczej pytanie "najlepsza praktyka", a raczej prawdziwy problem. I do tej pory uważane 2 podejścia:Komunikacja między Azure między rolą pracownika a rolą sieciową
Rola pracownika aktualizuje wiersz tabeli (w przechowywaniu stół) z przebiegu i zakończenia zadania. Brak sygnalizacji dla roli internetowej. Przeglądarka odczytuje ankietę bezpośrednio w pamięci tabeli (poprzez REST api) i dlatego wie, kiedy zadanie zostało zakończone. To działa dobrze (już to przetestowałem), chociaż nie podoba mi się podejście ciągłego odpytywania i chciałbym mieć rozwiązanie oparte na zdarzeniach. Ponadto, gdy klient otrzyma informację, że proces się zakończył, musi wykonać dodatkowe wywołanie metody internetowej api, aby nadać innym klientom (za pośrednictwem SignalR), że operacja została zakończona.
Korzystanie Interrole communication wraz z SignalR (patrz przykładowy kod poniżej) działa również (już przetestowany również)
przykładowy kod:
var protocol = "http";
var ipAddress = RoleEnvironment.Roles["XXX.YYY.Web"]
.Instances[0]
.InstanceEndpoints.ToArray()
.Where(ep => ep.Value.Protocol == protocol)
.First()
.Value.IPEndpoint.ToString();
var stringEndpoint = string.Format("{0}://{1}", protocol, ipAddress.ToString());
Trace.WriteLine("Retrieved endpoint address: " + stringEndpoint, "Information");
HubConnection connection = new HubConnection(stringEndpoint);
IHubProxy proxy = connection.CreateHubProxy("MyWebHub");
connection.Start().Wait();
//later...
proxy.Invoke("ProgressUpdated", clientId, progress);
Moje pytanie brzmi: czy istnieją inne (lepsze) sposoby komunikowania się w kierunku Rola pracownika -> Rola sieci? Oznacza to, że uruchamia metodę w roli sieciowej, gdy rola robocza zakończy przetwarzanie? Metoda na roli internetowej będzie wtedy nadawać aktualizację wszystkim klientom za pośrednictwem SignalR. Przyjrzałem się także Event Hubs, ale według mnie konsumenci wydarzenia nadal działaliby w roli pracownika.
Podoba mi się ta implementacja! Nigdy wcześniej nie myślałem o tym wzorze i jest całkiem sprytne. Dobra robota! – Rogala