【问题标题】:Handling logging over data stream处理数据流上的日志记录
【发布时间】:2017-05-23 03:30:22
【问题描述】:

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

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

【问题讨论】:

    标签: javascript amazon-web-services logging stream amazon-cloudwatchlogs


    【解决方案1】:

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

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

    缺点是:

    1. 您需要编写这个单独的进程来处理日志记录到 CloudWatch 或其他任何地方。
    2. 您的日志将不是实时的。在您的主应用程序记录日志和将日志消息放入 CloudWatch 之间至少会有一些延迟。使用额外的日志记录进程应该是关闭的,但这不是保证。

    【讨论】:

    • SQS 绝对可以工作。如果需要更接近实时的行为,Lambda 函数将是另一种选择。如果“即发即弃”过程只是委托给 lambda,那么您最终会得到一个“扇出”模式,其中 lambda 将动态扩展为所需的日志记录进程的数量。
    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2019-06-09
    • 2014-08-22
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多