Wzór reaktora - Reactor pattern
Wzorzec projektowy reaktora to wzorzec obsługi zdarzeń służący do obsługi żądań usług dostarczanych współbieżnie do programu obsługi usług przez co najmniej jedno wejście. Następnie program obsługi usług demultipleksuje przychodzące żądania i przesyła je synchronicznie do powiązanych programów obsługi żądań.
Struktura
- Zasoby
- Każdy zasób, który może dostarczać dane wejściowe do systemu lub wykorzystywać dane wyjściowe z systemu.
- Demultiplekser zdarzeń synchronicznych
- Używa pętli zdarzeń do blokowania wszystkich zasobów. Demultiplekser wysyła zasób do dyspozytora, gdy możliwe jest rozpoczęcie operacji synchronicznej na zasobie bez blokowania ( przykład: wywołanie synchroniczne do
read()
zostanie zablokowane, jeśli nie ma danych do odczytania. Demultiplekser używaselect()
zasobu, który blokuje do czasu zasób jest dostępny do odczytu. W takim przypadku wywołanie synchroniczneread()
nie zostanie zablokowane, a demultiplekser może wysłać zasób do dyspozytora). - Dyspozytor
- Obsługuje rejestrację i wyrejestrowanie osób obsługujących wnioski. Wysyła zasoby z demultipleksera do skojarzonej obsługi żądań.
- Obsługa żądań
- Program obsługi żądań zdefiniowany przez aplikację i powiązany z nim zasób.
Nieruchomości
Wszystkie systemy reaktorów są z definicji jednowątkowe, ale mogą istnieć w środowisku wielowątkowym .
Korzyści
Wzór reaktora całkowicie oddziela kod specyficzny dla aplikacji od implementacji reaktora, co oznacza, że komponenty aplikacji można podzielić na modułowe części wielokrotnego użytku.
Ograniczenia
Wzorzec reaktora może być trudniejszy do debugowania niż wzorzec proceduralny z powodu odwróconego przepływu sterowania. Ponadto, przez synchroniczne wywoływanie programów obsługi żądań, wzorzec reaktora ogranicza maksymalną współbieżność, szczególnie w przypadku symetrycznego sprzętu obsługującego wiele procesów. Skalowalność wzorca reaktora jest ograniczona nie tylko przez synchroniczne wywoływanie procedur obsługi żądań, ale także przez demultiplekser.
Zobacz też
- Wzorzec Proactor (wzorzec, który również demultipleksuje i wysyła zdarzenia, ale asynchronicznie)
- Serwer aplikacji
- Problem C10k