2

이벤트 이미 터를 사용하여 데이터를 처리하는 데이터 스트림이있는 EC2 인스턴스가 있습니다. 예 :데이터 스트림 로깅 처리

stream.on('new event', function doSomething(event){ do more stuff...}) 

이 데이터 스트림은 잠재적으로 초당 수천 개의 이벤트가 발생할 수 있으므로 이러한 이벤트의 처리를 효율적으로 기록하고 싶습니다. 즉, 새로운 이벤트가 들어올 때마다 로그 항목을 보내지 않으려 고합니다.

따라서 로그를 일괄 적으로 보내고 싶습니다. 예 :

그러나 너무 많은 사건이 동시에 발생하면 위의 코드가 비정상적인 행동으로 이어질 수 있습니다. 로컬 로깅에서이 것을 보았습니다.이 배열의 길이는 매우 극적으로 뛰어 났으며 동시에 여러 이벤트에 대해 동일한 값을 가질 수 있습니다.

또한 cloudwatch 로그를 사용하려면 로깅 기능에 대한 다른 호출간에 'sequenceTokens'를 전달해야합니다. 두 개의 이벤트가 로깅 조건을 동시에 트리거하는 경우 상황이 이상 할 수 있습니다. (이 문제는 각 이벤트를 별도로 기록한 경우에도 존재합니다.)

이러한 종류의 데이터 스트림에 대한 로깅은 어떻게 처리해야합니까?

답변

1

로깅을 하나 이상의 개별 프로세스로 구분합니다. 주요 응용 프로그램은 "화재 및 잊어"유형의 논리를 사용하여 SQS 대기열에 로깅 메시지를 넣습니다. 로깅 응용 프로그램은 대기열을 읽고 원하는 로그에 기록합니다. 이점은 활동의 폭발이 대기열에 흡수된다는 것입니다. 대기열 길이에 직접 제한이 없으므로 처리 할 수 ​​있어야합니다. 사실상 더 이상 메시지를 대기 행렬에 넣지 않습니다. SQS가 있습니다.

또한 큐가 커지면로드를 처리 할 여러 로깅 응용 프로그램을 가질 수 있습니다.

단점은 다음과 같습니다

  1. 당신은 CloudWatch를 어디서 이제까지 로깅을 처리하기 위해이 별도의 프로세스를 작성해야합니다.
  2. 로그가 실시간으로 표시되지 않습니다. 메인 애플리케이션이 로그 할 때와 로그 메시지가 CloudWatch에 저장 될 때 사이에 적어도 약간의 대기 시간이 있습니다. 추가 로깅 프로세스를 사용하면 가까이 있어야하지만 이는 보장 할 수 없습니다.
+0

SQS가 확실히 작동 할 수 있습니다. 실시간 동작에 가까운 것이 필요하다면 람다 함수가 또 다른 옵션이 될 수 있습니다. 화재 및 잊어 버린 프로세스가 람다에게 위임 한 경우 람다가 필요한 로깅 프로세스 수에 따라 동적으로 확장되는 "팬 아웃 (fan out)"패턴으로 끝날 것입니다. –