/ / Najlepszy sposób na komunikację pomiędzy aplikacją ASP.NET a rolą robotnika - asp.net-mvc, wcf, azure, azure-worker-role, azure-web-role

Najlepszy sposób na komunikację między aplikacją ASP.NET a rolą robotniczą - asp.net-mvc, wcf, azure, role-lure-worker, role-lazurowe-web

Mam obie ASP.Aplikacja NET and Worker Role została skonfigurowana i teraz zastanawiam się, jak mogę się między nimi komunikować? Myślę, że chodzi o to, że rozwiązanie będzie dystrybuowane w różnych lokalizacjach geograficznych. Jak więc połączyć rozproszoną robotę i role sieciowe w prosty i skuteczny sposób? Zacząłem zaglądać do WCF, ale wydaje mi się, że jestem przesadny i zbyt skomplikowany. Inną myślą, którą miałem, było użycie klienta SignalR wewnątrz ról Worker, aby porozmawiać z serwerem w rolach sieciowych.

EDYTOWAĆ:

Dokładny kontekst:

1) Użytkownik przesyła plik na serwer

2) Serwer wysyła plik do Azure Storage i dodaje nazwę pliku do CloudQueue

3) Pracownik otrzymuje nazwę pliku z CloudQueue

4) Pracownik rozpoczyna nowy wątek, który pobiera plik z magazynu Azure i rozpoczyna jego przetwarzanie

5) Pracownik / wątek raportuje z powrotem do aplikacji na każdym etapie przetwarzania pliku

6) Aplikacja odbiera raporty i używa SignalR do przekazywania kroków przetwarzania do przeglądarki klienta w czasie rzeczywistym.

To, czego mi brakuje, to kroki 2> 3, Jak to zrobićnatychmiast powiadomić pracownika, że ​​przybył nowy plik? Nie chcę odpytywać CloudQueue, ponieważ spowoduje to opóźnienia. Również w krokach 5> 6, Pracownik musi powiadomić aplikację o krokach i to powinno być niezwłocznie, ale znowu nie widzę, jak można zastosować rozwiązanie ankietowe w takim przypadku.

Odpowiedzi:

1 dla odpowiedzi № 1

Jak wspomniano powyżej, jest trochę więcej kontekstupotrzebne. Zasadniczo masz dwie główne opcje, Kolejki systemu Windows Azure i Kolejki / tematy magistrali usług systemu Windows Azure. Moja osobista rada będzie polegać na korzystaniu z Kolejki Azure, jeśli role Sieci i Pracowników są kolokowane w tym samym regionie i Kolejkach Magistrali Usług, jeśli nie są. Musiałbym zapytać, dlaczego nie łączysz swoich ról w sieci i pracowników, jeśli masz geograficzne wdrożenie swojej aplikacji, spójrz na wdrażanie wszystkich ról sieciowych i ról roboczych w każdym regionie, np. USA, Europa i Azja, a następnie użyj aplikacji Traffic Manager, aby skierować użytkownika do optymalnego regionu.

Istnieje dobry wpis na blogu, kiedy należy użyć kolejki "Kolejki systemu Windows Azure i Kolejki usług Windows Azure - Porównanie i Kontrast": http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

HTH

EDYTOWAĆ

Dobre podejście do komunikacji w roli Web i Worker Role jest poniżej (ukradłem to z niedawnego wątku, na który @smarx odpowiedział)

1 Rola sieci Web zapisuje komunikat w kolejce zawierającej identyfikator zadania.

2 Rola pracownika wykonuje pracę i zapisuje wynik w tabeli z kluczem partycji.

3 Rola sieci Web polega na odpytaniu tego wiersza tabeli. Gdy już istnieje, odpowiedź wraca.

W twoim przypadku możesz mieć aktualizację roli pracownika magazynu tabel z aktualizacjami statusu, a następnie ustawić swoją rolę internetową i wyświetlić je użytkownikowi. na przykład 20%, 50%, pełne itp. ...

Naprawdę nie widzę opóźnień w tego rodzaju komunikacji, o ile wystarczająco odpytujesz z roli internetowej (* koszty transakcji notatek)

Zakładam, że w tym miejscu można przeprowadzić komunikację w Inter Role, ale może to być przesadne IMO:

http://msdn.microsoft.com/en-us/library/windowsazure/hh180158.aspx


0 dla odpowiedzi nr 2

Polecam rzucić okiem na CQRS, co oznacza Segregację Odpowiedzialności Poleceń Zapytania.

Celem tej architektury jest stworzenie systemów luźno powiązanych, rozszerzalnych i skalowalnych.

http://cqrsjourney.github.com/

Greg Young wymyślił ten system i istniejeliczba dostępnych implementacji open source w celu przyspieszenia budowy rozproszonych, skalowalnych systemów. Przed nim był Bertrand Meyer, który położył podwaliny.

Uproszczony pomysł jest taki, że seriakolejki osobne role sieciowe i role pracowników. Tak więc, gdy użytkownicy przesyłają pracę z roli internetowej, praca ta staje się w kolejce, a później jest wybierana przez rolę pracownika. Kompromisem jest to, że istnieje ostateczna spójność danych, a nie natychmiastowa spójność. Zaletą jest to, że jest luźno sprzężony i skalowalny. Jeśli kolejka zaczyna się zwiększać, dodatkowe role robocze można dodać, aby obsłużyć dodatkową skalę.

Podejście to wykorzystuje pojęcia takie jak polecenia, zapytania, obiekty domeny. CQRS staje się niezwykle skutecznym sposobem na osiągnięcie celów, o których myślę, że szukasz.

Wyszukiwarka może zapewnić Ci wiele dobrych zasobów. Oto kilka przydatnych filmów: Greg Young http://www.youtube.com/watch?v=KXqrBySgX-s Mój przyjaciel Rinat http://www.youtube.com/watch?v=CnvO_nlvrps

Powodzenia!


0 dla odpowiedzi № 3

Użyłem pamięci lazurowej jako miejsca nakomunikować się między rolą pracownika a rolą sieci. Zasadniczo, rola Pracownik będzie przechowywać komunikat / powiadomienie w tabeli lazuru, a rola internetowa będzie miała zegar do okresowego sprawdzania zmian w lazurowym stole. Po tym rola internetowa będzie używać SignalR do wysyłania wiadomości do stron klienta w czasie rzeczywistym, aby zgłosić postęp.

Plik Global.asax.cs:

private static System.Timers.Timer _timer;

protected void Application_Start()
{
//Start the timer job
_timer = new System.Timers.Timer(3000);
_timer.Elapsed += new ElapsedEventHandler(WebRoleTimerJob);
_timer.Start();
}


/// <summary>
/// This event will be fired intervally every 3 seconds to broadcast messsage to all registered client pages using SignalR
/// </summary>
public static void WebRoleTimerJob(object sender, ElapsedEventArgs e)
{
// Here, you can read Azure table storage to detect any changes
// or notification from Worker role
// ....

//If there is any changes, then broadcast message
// to all relevant client pages using SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<Hub>();
context.Clients.All.addNewMessageToPage("your_message_name", "message_content");
}