이벤트 기반 모델과 리액터 패턴의 차이점은 무엇입니까?
wikipedia Reactor Pattern 기사에서 :
리액터 설계 패턴은 하나 이상의 입력에 의해 서비스 핸들러에 동시에 전달되는 서비스 요청을 처리하기위한 이벤트 처리 패턴입니다.
그것은, 몇 가지 예를 이름 예를 들어 nodejs
, twisted
,eventmachine
하지만 위의 내용이 인기있는 이벤트 중심 프레임 워크라는 것을 이해하고 있으므로 리액터 패턴 프레임 워크로도 만드나요?
이 둘을 구별하는 방법은 무엇입니까? 아니면 동일합니까?
리액터 패턴은 "이벤트 기반 프로그래밍"보다 더 구체적입니다. 이벤트 기반 프로그래밍을 수행 할 때 사용되는 특정 구현 기술입니다. 그러나이 용어는 일반적인 대화에서 그다지 정확하게 사용되지 않으므로 사용에주의하고 청중이 당신을 이해하기를 기대해야하며, 용어를 사용할 때 용어를 해석하는 방법에주의해야합니다.
원자로 패턴을 보는 한 가지 방법은 "비 차단"작업의 개념과 밀접하게 관련되어 있다고 생각하는 것입니다. 리액터는 특정 작업이 차단없이 완료 될 수있을 때 알림을 보냅니다. 예를 들어, select(2)
읽는 표준 BSD 소켓 API를 (사용하여 소켓에 기록 원자로 패턴을 구현하는 데 사용할 수 있습니다 recv(2)
, send(2)
등). select
예를 들어 해당 소켓의 커널 수신기 버퍼에 바이트가 있기 때문에 소켓에서 즉시 바이트를 수신 할 수 있는지 알려줍니다.
이러한 아이디어에 대해 생각할 때 고려해야 할 또 다른 패턴은 프로 액터 패턴입니다. 리액터 패턴과 달리 프로 액터 패턴은 즉시 완료 가능 여부에 관계없이 작업을 시작 하고, 비동기 적으로 수행 한 다음 완료 알림을 전달하도록 배열합니다.
IOCP (Windows I / O Completion Ports) API는 proactor 패턴을 볼 수있는 한 가지 예 입니다. IOCP를 사용하여 소켓에서 전송을 수행 할 때 해당 소켓에 대한 커널 전송 버퍼에 공간이 있는지 여부에 관계없이 전송 작업이 시작됩니다. WSASend
호출이 즉시 완료 되는 동안 전송 작업은 계속됩니다 (다른 스레드, 아마도 커널의 스레드) . 전송이 실제로 완료되면 (전송중인 바이트가 해당 소켓의 커널 전송 버퍼에 복사되었음을 의미 함) WSASend
호출에 제공된 콜백 함수 가 호출됩니다 (애플리케이션의 새 스레드에서).
작업을 시작하고 완료되면 알림을받는 이러한 접근 방식은 비동기 작업 개념의 핵심 입니다. 작업을 수행하기 직전에 작업이 완료 될 때까지 기다리는 비 차단 작업 과 비교하십시오 .
이벤트 중심 프로그래밍에는 두 가지 방법 중 하나를 사용할 수 있습니다. 리액터 패턴을 사용하여 프로그램 은 (예를 들어) 소켓이 읽을 수 있는 이벤트 를 기다린 다음 읽습니다. proactor 패턴을 사용하여 프로그램 은 소켓 읽기 완료 이벤트 를 대신 기다립니다 .
엄밀히 말하면 Twisted는 원자로 라는 용어를 오용합니다 . select(2)
( twisted.internet.selectreactor
)를 기반으로하는 Twisted Reactor 는 매우 Reactor와 유사한 non-blocking I / O를 사용하여 구현됩니다. 그러나 응용 프로그램 코드에 노출되는 인터페이스는 비동기 적이므로 프로 액터와 비슷합니다. Twisted에는 IOCP를 기반으로 한 리액터도 있습니다. 반응기는 동일한 애플리케이션 비동기 향하는 API를 노출 하고 proactor 형상 IOCP API를 이용한다. 이 하이브리드 접근 방식은 플랫폼마다 세부 사항이 다르기 때문에 "반응기"나 "프로 액터"라는 용어가 특히 정확하지 않지만에 의해 노출 된 API twisted.internet.reactor
는 기본적으로 비 차단 대신 완전히 비동기식이므로 proactor 가 더 좋았을 것입니다. 이름 선택.
"비 차단"과 "비동기"의 분리는 잘못된 것 같습니다. "비동기"의 주요 의미가 "비 차단"이기 때문입니다. Reactor 패턴은 비동기 (비 차단) 호출에 관한 것이지만 해당 호출의 동기 (차단) 처리입니다. Proactor는 비동기 (비 차단) 호출과 해당 호출의 비동기 (비 차단) 처리에 관한 것입니다.
TCP 연결을 처리하기 위해 경쟁하는 두 가지 웹 아키텍처, 즉 스레드 기반 아키텍처와 이벤트 기반 아키텍처가 있습니다.
스레드 기반 아키텍처
다중 스레드 서버를 구현하는 가장 오래된 방법은 "연결 당 스레드"접근 방식을 따르는 것입니다. 실행중인 스레드 수를 제어하고 제한하기 위해 단일 디스패처 스레드를 제한된 차단 대기열 및 스레드 풀과 함께 사용할 수 있습니다.
디스패처는 새로운 연결을 위해 TCP 소켓에서 차단하고이를 제한된 차단 대기열에 제공합니다. 큐 경계를 초과하는 TCP 연결은 삭제되어 허용 된 연결이 바람직하고 예측 가능한 대기 시간으로 작동 할 수 있습니다.
이벤트 중심 아키텍처
연결에서 스레드를 분리하는 이벤트 기반 아키텍처는 스레드를 특정 처리기의 이벤트에만 사용할 수 있도록합니다.
이 창의적인 개념은 Reactor Pattern이 선반에서 나와서 뽐낼 수 있도록합니다. 이 아키텍처에 구축 된 시스템은 이벤트 생성자와 이벤트 소비자로 구성됩니다.
원자로 패턴
리액터 패턴은 TCP 연결 처리를위한 이벤트 기반 아키텍처의 가장 널리 사용되는 구현 기술입니다. 간단히 말해서 단일 스레드 이벤트 루프를 사용하여 이벤트를 차단하고 해당 이벤트를 해당 핸들러로 전달합니다.
이벤트 처리기가 등록되어있는 한 I / O에서 다른 스레드를 차단할 필요가 없습니다. TCP 연결을 고려하면 연결됨, 입력 준비, 출력 준비, 시간 초과 및 연결 끊김과 같은 인스턴스에 대한 이벤트를 쉽게 참조 할 수 있습니다.
리액터 패턴은 재사용 가능한 리액터 구현에서 모듈 식 애플리케이션 레벨 코드를 분리합니다. 이를 달성하기 위해 원자로 패턴의 아키텍처는 원자로와 핸들러라는 두 가지 중요한 참여자로 구성됩니다.
반응기
Reactor는 별도의 스레드에서 실행되며 작업을 등록 된 적절한 핸들러에 디스패치하여 연결됨, 입력 준비, 출력 준비, 시간 초과 및 연결 해제와 같은 I / O 이벤트에 반응합니다.
핸들러
핸들러는 I / O 이벤트로 수행해야하는 실제 작업 또는 응답을 수행합니다. Reactor는 적절한 핸들러를 전달하여 I / O 이벤트에 응답합니다.
1995 년에 출판 된 Jim Coplien과 Douglas C. Schmidt의“Pattern Languages of Program Design”은 Reactor 패턴을 자세히 설명하는 책 중 하나입니다.
'developer tip' 카테고리의 다른 글
ContentProvider에서 데이터베이스 닫기 (0) | 2020.10.24 |
---|---|
Eclipse IDE에서 변수 내용보기 (0) | 2020.10.24 |
Pylint는 파일에 대한 모든 경고를 비활성화합니다. (0) | 2020.10.24 |
"Uncaught (in promise) DOMException : 사용자가 문서와 먼저 상호 작용하지 않았기 때문에 play () 실패했습니다."를 처리하는 방법 (0) | 2020.10.24 |
파이썬에서 파일에 문자열을 어떻게 래핑합니까? (0) | 2020.10.24 |