2012-10-24 29 views
20

Oprócz czytania kodu w github, czy istnieje dokumentacja typu białego papieru na temat działania pakietu SignalR.Redis? W szczególności zastanawiam się, jakie klucze dodaje on do Redis, strategii aktualizacji/usuwania itp. Kiedy patrzę w Redisa wszystko, co widzę, to klucz określony w poniższym wywołaniu (np. "SignalR.Redis.Sample"):Jak działa SignalR.Redis pod maską?

GlobalHost.DependencyResolver.UseRedis(server, Int32.Parse(port), password, "SignalR.Redis.Sample"); 

Ten klucz wydaje się być kontuarem w Redis. Zakładam, że inne klucze są tworzone i szybko usuwane, aby ułatwić komunikaty między każdym serwerem aplikacji połączonym z Redis.

Odpowiedz

48

Nie, nie ma białej księgi i to jest jak 200 linii kodu, więc nie za dużo do przełknięcia.

W SignalR każda wiadomość przechodzi przez coś zwanego komunikatem. Aby skalować na wszystkich węzłach (lub procesach lub domenach aplikacji), implementacja tej magistrali musi umożliwiać rozmowę z każdą instancją aplikacji. Aby to zrobić, możesz użyć RedisMessageBus. Redis ma mechanizm pub sub, a także możliwość przechowywania par wartości klucza, a my używamy tylko tego pierwszego dla SignalR.

OffTopic: To jest BARDZO ważne! SignalR NIE jest niezawodnym przesyłaniem wiadomości, jest abstrakcją połączenia. Możemy buforować wiadomości do longpollingu, ale ** nie możesz polegać na wiadomościach, które są tam na zawsze. Jeśli masz ważne wiadomości, które musisz trwać, to je utrzymuj.

Każdy serwer WWW łączy się z jednym (lub więcej w nowej implementacji) zdarzeniami redis, aby wysyłać wiadomości między nimi. Gdy przychodzi wiadomość dla jednego lub większej liczby klientów, jest wysyłana do płyty montażowej (redis) i dociera do wszystkich serwerów WWW. Każdy serwer pobiera wiadomość od redis i przechowuje ją w lokalnej pamięci podręcznej. Ta lokalna pamięć podręczna jest obsługiwana przez klientów SignalR (przeglądarki itp.).

Jedną ważną częścią projektu skalowania są kursory. Kursor wskazuje miejsce, w którym dany klient znajduje się w nieskończonym strumieniu wiadomości. Gdy klienci ponownie łączą się po zrzuceniu połączenia lub połączenie longpolling wraca po otrzymaniu wiadomości, prosi autobus, aby uzyskać ode mnie wszystko od pewnego kursora. Kursory są definiowane przez implementację magistrali komunikatów i znormalizowaliśmy to w najnowszych źródłach (jeszcze nie opublikowanych w momencie pisania, ale nie będę tutaj omawiał szczegółów). Kursor w bieżącej implementacji redis to po prostu liczba, która jest inkrementowana, nic zbyt skomplikowanego.

Mam nadzieję, że daje to pewne pojęcie o tym, jak to działa.

+2

Dziękuję bardzo. Świetne wyjaśnienie. – user1574808

+1

Dzięki za wspaniałe wyjaśnienie. Rozważmy następujący scenariusz: Mam ** zbalansowaną pod względem obciążenia ** farmę internetową, w której każdy serwer jest hostem koncentratora. Załóżmy, że wszyscy klienci wracają do długiego głosowania. _Client X_ łączy się za pomocą load-balancera, a jego żądanie jest wysyłane do _serwera 1_. Jednak w następnej sondzie load-balancer kieruje swoją prośbę do _serwera 2_. Moje pytanie brzmi: czy płyta montażowa zapewnia, że ​​wszystkie koncentratory są świadome wszystkich podłączonych klientów, niezależnie od tego, z którym koncentratorem początkowo się łączyli? – demius

+1

Na płycie głównej są znane wszystkie serwery, więc wszystko będzie działać. Nie musi wiedzieć, z jakim serwerem pierwotnie był podłączony. – davidfowl

Powiązane problemy