이벤트는 최근 과거의 발생을 설명하는 통지입니다.
이벤트 중심 시스템의 일반적인 구현은 이벤트 디스패처 및 핸들러 기능 (또는 가입자 )을 사용합니다. 디스패처는 핸들러를 이벤트 (jQuery 's bind
) 까지 연결하는 API 와 구독자 ( trigger
jQuery)에 이벤트를 공개하는 메소드를 제공 합니다. IO 또는 UI 이벤트에 대해 이야기 할 때 일반적 으로 마우스 클릭과 같은 새로운 이벤트를 감지하여 디스패처에 전달 하는 이벤트 루프 도 있습니다 . JS-land에서는 디스패처 및 이벤트 루프가 브라우저에서 제공됩니다.
키 누르기 및 클릭에 응답하여 사용자와 직접 상호 작용하는 코드의 경우 이벤트 중심 프로그래밍 (또는 기능적 반응성 프로그래밍 과 같은 변형 )은 거의 피할 수 없습니다. 프로그래머는 사용자가 언제 어디에서 클릭을할지 알지 못하므로 GUI 프레임 워크 또는 브라우저를 사용하여 이벤트 루프에서 사용자의 조치를 감지하고 코드에 알립니다. 이 유형의 인프라는 네트워킹 응용 프로그램 (cf NodeJS)에도 사용됩니다.
함수를 직접 호출하는 대신 코드에서 이벤트 를 발생 시키는 예제 에는 더 흥미로운 트레이드 오프가 있습니다. 이는 아래에서 설명합니다. 주요 차이점은 이벤트 게시자 ( makeItSnow
)가 통화 수신자를 지정하지 않는다는 것입니다. 그것은 다른 곳에서 연결되어 있습니다 ( bind
예제 호출 ). 이것을 불을 잊어 버리는 것입니다 . makeItSnow
눈이 내리고 있다는 사실을 세상에 알리지 만, 누가 듣고 있는지, 다음에 어떻게되는지, 언제 일어날지를 신경 쓰지 않습니다. 단순히 메시지를 방송하고 손에서 먼지를 털어냅니다.
따라서 이벤트 중심 접근 방식은 메시지 발신자를 수신자와 분리합니다. 이것이 제공하는 한 가지 장점은 주어진 이벤트에 여러 핸들러가있을 수 있다는 것입니다. gritRoads
기존 shovelSnow
핸들러에 영향을주지 않고 스노우 이벤트에 함수를 바인딩 할 수 있습니다. 응용 프로그램을 연결하는 방식에 유연성이 있습니다. 비헤이비어를 끄 bind
려면 코드를 탐색하지 않고 호출 을 제거 하면 동작의 모든 인스턴스를 찾을 수 있습니다.
이벤트 중심 프로그래밍의 또 다른 장점은 크로스 커팅 문제를 해결할 수 있다는 것입니다. 이벤트 디스패처는 Mediator 의 역할을 하며 Brighter 와 같은 일부 라이브러리 는 파이프 라인을 사용하므로 로깅 또는 서비스 품질과 같은 일반 요구 사항을 쉽게 플러그인 할 수 있습니다.
전체 공개 : 더 밝게 Huddle에서 개발되었습니다.
수신자와 이벤트 송신자를 분리하는 세 번째 장점은 이벤트 를 처리 할 때 유연성을 제공한다는 것 입니다. 각 유형의 이벤트를 자체 스레드에서 처리하거나 (이벤트 디스패처가 지원하는 경우) RabbitMQ 와 같은 메시지 브로커에 발생한 이벤트를 배치 하고 비동기 프로세스로 처리하거나 밤새 대량으로 처리 할 수 있습니다. 이벤트 수신자는 별도의 프로세스 또는 별도의 시스템에있을 수 있습니다. 이를 위해 이벤트를 발생시키는 코드를 변경할 필요가 없습니다! 이것은 "마이크로 서비스"아키텍처의 기본 아이디어입니다. 자율 서비스는 메시징 미들웨어를 애플리케이션의 중추로하여 이벤트를 사용하여 통신합니다.
이벤트 중심 스타일의 다소 다른 예를 보려면 도메인 기반 디자인 을 사용하여 도메인 이벤트 를 사용하여 집계를 개별적으로 유지하십시오. 예를 들어 구매 내역에 따라 제품을 추천하는 온라인 상점을 생각해보십시오. 에 대한 비용을 지불 Customer
하면 구매 내역을 업데이트 ShoppingCart
해야합니다. ShoppingCart
집계는 통지 할 수 Customer
일으키기에 의해 CheckoutCompleted
이벤트를; 는 Customer
이벤트에 대한 응답으로 별도의 트랜잭션으로 업데이트받을 것입니다.
이 이벤트 중심 모델의 주요 단점은 간접적 인 것입니다. IDE를 사용하여 이벤트를 탐색 할 수 없기 때문에 이벤트를 처리하는 코드를 찾기가 더 어려워졌습니다. 구성에서 이벤트가 바운드되는 위치를 파악하고 모든 핸들러를 찾았 으면합니다. 한 번에 더 많은 것들을 머릿속에 보관해야합니다. 코드 스타일 규칙이 여기에 도움이 될 수 있습니다 (예 : 모든 호출을 bind
하나의 파일에 저장). 정신 건강을 위해 하나의 이벤트 디스패처 만 사용하고 일관되게 사용해야합니다.
또 다른 단점은 이벤트를 리팩토링하기 어렵다는 것입니다. 이벤트 형식을 변경해야하는 경우 모든 수신자를 변경해야합니다. 이제 소프트웨어 릴리스를 동기화해야하므로 이벤트 구독자가 다른 시스템에있을 때 더욱 악화됩니다.
특정 상황에서는 성능이 문제가 될 수 있습니다. 메시지를 처리 할 때 디스패처는 다음을 수행해야합니다.
- 일부 데이터 구조에서 올바른 핸들러를 찾으십시오.
- 각 핸들러에 대한 메시지 처리 파이프 라인을 빌드하십시오. 이것은 많은 메모리 할당을 포함 할 수 있습니다.
- 핸들러를 동적으로 호출하십시오 (언어가 요구하는 경우 리플렉션 사용).
이것은 스택에서 새 프레임을 푸시하는 것과 관련된 일반 함수 호출보다 확실히 느립니다. 그러나 이벤트 중심 아키텍처가 제공하는 유연성 덕분에 느린 코드를보다 쉽게 분리하고 최적화 할 수 있습니다. 백그라운드에서 어려운 작업을 처리하는 동안 즉시 요청을 처리 할 수 있기 때문에 비동기 프로세서에 작업을 제출할 수있는 기능이 큰 도움이됩니다. 어쨌든 DB와 상호 작용하거나 화면에 물건을 그리는 경우 IO 비용은 메시지 처리 비용을 완전히 깎아냅니다. 조기 최적화를 피하는 경우입니다.
요약하면, 이벤트는 느슨하게 결합 된 소프트웨어를 빌드하는 좋은 방법이지만 비용이없는 것은 아닙니다. 예를 들어 응용 프로그램의 모든 함수 호출을 이벤트 로 바꾸는 것은 실수 입니다. 의미있는 건축 부문을 만들기 위해 이벤트를 사용하십시오.
$(document).bind('snow', shovelShow)
. 익명 함수로 감싸지 않아도됩니다.