我有一個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肯定可以工作。如果需要更接近實時行爲,則Lambda函數將是另一種選擇。如果fire和forget進程只是委託給lambda,那麼你會得到一個「fan out」模式,lambda可以動態擴展到所需的日誌進程數。 –