Wzór reaktora
Wzorzec projektowy reaktora to wzorzec obsługi zdarzeń służący do obsługi żądań usług dostarczanych jednocześnie do obsługi usługi przez jedno lub więcej wejść. Następnie program obsługi usługi demultipleksuje przychodzące żądania i wysyła je synchronicznie do powiązanych programów obsługi żądań.
Struktura
- Zasoby
- Dowolny zasób, który może dostarczać dane wejściowe lub konsumować dane wyjściowe systemu.
- Synchroniczny demultiplekser zdarzeń
- Wykorzystuje pętlę zdarzeń do blokowania wszystkich zasobów. Demultiplekser wysyła zasób do dyspozytora, gdy możliwe jest rozpoczęcie synchronicznej operacji na zasobie bez blokowania ( Przykład: synchroniczne wywołanie funkcji
read()
zostanie zablokowane, jeśli nie ma danych do odczytania. Demultiplekser używa funkcjiselect()
na zasób, który blokuje się, dopóki zasób nie będzie dostępny do odczytu. W tym przypadku synchroniczne wywołanie funkcjiread()
nie zablokuje, a demultiplekser może wysłać zasób do dyspozytora.) - Dyspozytor
- Obsługuje rejestrowanie i wyrejestrowywanie programów obsługi żądań. Wysyła zasoby z demultipleksera do powiązanego programu obsługi żądań.
- Program obsługi żą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
Wzorzec 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
Wzór reaktora może być trudniejszy do debugowania niż wzór proceduralny ze względu na odwrócony przepływ sterowania. Ponadto, poprzez synchroniczne wywoływanie tylko programów obsługi żądań, wzorzec reaktora ogranicza maksymalną współbieżność, szczególnie w przypadku symetrycznego sprzętu wieloprocesorowego. 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 z C10k