У меня есть экземпляр EC2 с потоком данных, который использует событие-эмиттер для обработки данных. Например.Обработка регистрации по потоку данных
stream.on('new event', function doSomething(event){ do more stuff...})
Этот поток данных имеет потенциально десятки тысяч событий в секунду, и я хотел бы, чтобы войти в обработку этих событий эффективным образом. Другими словами, я не хочу посылать запись в журнале каждый раз, когда приходит новое событие.
Следовательно, я решил, что отправлю журналы в пакетном режиме. Например.
let logArray = [];
function sendToLogs(logs) {\** send stuff *\}
stream.on('new event', function doSomething(event){
\\do some stuff
logArray.push({newLog: event})
if (logArray.length >= 500) {
sendToLogs(logArray)
logArray = [];
}
})
Однако я боюсь, что с таким количеством событий в ближайших одновременно, что приведенный выше код может привести к непредсказуемому поведению. Я видел это в локальном протоколировании: длина этого массива довольно резко меняется и может иметь одинаковое значение для разных событий одновременно.
Кроме того, использование журналов cloudwatch требует от меня передать «sequenceTokens» между различными вызовами функции ведения журнала. Если два события одновременно запускают условие регистрации, все может стать странным. (Эта проблема будет существовать, даже если я зарегистрировал каждое событие отдельно.)
Как я должен обрабатывать ведение журнала через этот поток данных?
SQS определенно может работать. Лямбда-функции были бы еще одним вариантом, если бы было необходимо приблизиться к действию в реальном времени. Если процесс «огонь» и «забыть» просто делегирует лямбда, вы попадаете в шаблон «fan out», где лямбда будет динамически масштабироваться до количества требуемых процессов ведения журнала. –