2

我有一个 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”。如果两个事件同时触发记录条件,事情可能会变得很奇怪。(即使我分别记录每个事件,这个问题也会存在。)

我应该如何处理这种数据流的日志记录?

4

1 回答 1

1

我会将日志记录分离到一个或多个单独的进程中。您的主应用程序将使用“即发即弃”类型的逻辑将日志消息放在 SQS 队列中。然后,您的日志记录应用程序将读取队列并写入您选择的日志。优点是活动的爆发将被队列吸收。队列的长度没有直接限制,因此应该能够处理。实际上,您不再排队消息,SQS 是。

此外,如果队列增长超出您的预期,您可以使用多个日志记录应用程序来处理负载。

缺点是:

  1. 您需要编写这个单独的过程来处理记录到 CloudWatch 或其他任何地方。
  2. 您的日志将不是实时的。在您的主应用程序记录日志和将日志消息放入 CloudWatch 之间至少会有一些延迟。使用额外的日志记录过程,您应该很接近,但这不是保证。
于 2017-01-08T23:26:39.230 回答