【问题标题】:Is it possible to use AWS KPL on Lambda connected to API Gateway是否可以在连接到 API Gateway 的 Lambda 上使用 AWS KPL
【发布时间】:2017-07-03 09:11:13
【问题描述】:

我正在尝试在 AWS 服务之上构建数据收集管道。下面给出了总体架构;

总之,系统应该从 API 网关 (1) 获取事件(每个事件一个请求),并且数据应该写入 Kinesis (2)。

我预计每秒约 100k 个事件。我的问题与 Lambda 函数上的 KPL 使用有关。在第 2 步中,我计划使用 KPL 编写一个 Lambda 方法,以便在 Kinesis 上以高吞吐量编写事件。但我不确定是否有可能,因为 API Gateway 分别为每个事件调用 lambda 函数。

在这样的架构中使用 KPL 是否可能/合理,或者我应该使用 Kinesis Put API 来代替?

        1                              2                              3                             4
+----------------+             +----------------+             +----------------+            +----------------+
|                |             |                |             |                |            |                |
|                |             |                |             |                |            |                |
|  AWS API GW    +-----------> |  AWS Lambda    +-----------> |  AWS Kinesis   +----------> |  AWS Lambda    |
|                |             |  Function with |             |  Streams       |            |                |
|                |             |  KPL           |             |                |            |                |
|                |             |                |             |                |            |                |
+----------------+             +----------------+             +----------------+            +-----+-----+----+
                                                                                                  |     |
                                                                                                  |     |
                                                                                                  |     |
                                                                                                  |     |
                                                                                                  |     |
                                                                                5                 |     |              6
                                                                         +----------------+       |     |      +----------------+
                                                                         |                |       |     |      |                |
                                                                         |                |       |     |      |                |
                                                                         |  AWS S3        <-------+     +----> |  AWS Redshift  |
                                                                         |                |                    |                |
                                                                         |                |                    |                |
                                                                         |                |                    |                |
                                                                         +----------------+                    +----------------+

我也在考虑直接写入 S3,而不是从 api-gw 调用 lambda 函数。如果第一个架构不合理,这可能是一个解决方案,但在这种情况下,我将延迟将数据写入 kinesis

        1                                2                         3                              4                             5
+----------------+               +----------------+        +----------------+             +----------------+            +----------------+
|                |               |                |        |                |             |                |            |                |
|                |               |                |        |                |             |                |            |                |
|  AWS API GW    +----------->   |  AWS Lambda    +------> |  AWS Lambda    +-----------> |  AWS Kinesis   +----------> |  AWS Lambda    |
|                |               |  to write data |        |  Function with |             |  Streams       |            |                |
|                |               |  to S3         |        |  KPL           |             |                |            |                |
|                |               |                |        |                |             |                |            |                |
+----------------+               +----------------+        +----------------+             +----------------+            +-----+-----+----+
                                                                                                                              |     |
                                                                                                                              |     |
                                                                                                                              |     |
                                                                                                                              |     |
                                                                                                                              |     |
                                                                                                            6                 |     |              7
                                                                                                     +----------------+       |     |      +----------------+
                                                                                                     |                |       |     |      |                |
                                                                                                     |                |       |     |      |                |

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway amazon-kinesis


    【解决方案1】:

    我不认为在这里使用 KPL 是正确的选择。 KPL 的关键概念是,记录在客户端收集,然后作为批处理操作发送到 Kinesis。由于 Lambda 在每次调用时都是无状态的,因此很难存储记录以进行聚合(在将其发送到 Kinesis 之前)。

    我认为您应该看看以下 AWS 文章,该文章解释了如何将 API-Gateway 直接连接到 Kinesis。这样,您可以避免额外的 Lambda 仅转发您的请求。

    Create an API Gateway API as an Kinesis Proxy

    【讨论】:

    • 您如何看待第二种架构。我不想在休息端点上遇到任何延迟(第 1 步)。如果我直接将 api 网关与 kinesis 端点一起使用,则 step2 将变为不需要的同步写入。
    • 第二种架构是我在 Kinesis 选项出现之前实现的。它有效,但严重限制了 S3 调用的数量。 S3 会在某个时候限制你,你的 API 将不得不拒绝新的传入请求。因此,如果您不想将限制传播到客户端,则将数据放入 Kinesis 进行聚合是更好的选择。每秒有 10 万次调用,我不确定 S3 是否会接受这么多的 put 调用。
    【解决方案2】:

    显然,如果您通过 AWS API Gateway 传来的数据对应于一条 Kinesis Data Streams 记录,那么使用 Jens 指出的 KPL 是没有意义的。在这种情况下,您可以直接调用 Kinesis API,而无需使用 Lambda。最终,您可能会在 Lambda 中使用一些额外的处理并通过 PutRecord(不是 KPL 使用的 PutRecords)发送数据。您在 JAVA 中的代码将如下所示

    AmazonKinesisClientBuilder clientBuilder = AmazonKinesisClientBuilder.standard();
    clientBuilder.setRegion(REGION);
    clientBuilder.setCredentials(new DefaultAWSCredentialsProviderChain());
    clientBuilder.setClientConfiguration(new ClientConfiguration());
    AmazonKinesis kinesisClient = clientBuilder.build();
    ...
    //then later on each record
    PutRecordRequest putRecordRequest = new PutRecordRequest();
    putRecordRequest.setStreamName(STREAM_NAME);
    putRecordRequest.setData(data);
    putRecordRequest.setPartitionKey(daasEvent.getAnonymizedId());
    putRecordRequest.setExplicitHashKey(Utils.randomExplicitHashKey());
    putRecordRequest.setSequenceNumberForOrdering(sequenceNumberOfPreviousRecord);
    PutRecordResult putRecordResult = kinesisClient.putRecord(putRecordRequest);
    sequenceNumberOfPreviousRecord = putRecordResult.getSequenceNumber();
    

    但是,在某些情况下使用 lambda 中的 KPL 是有意义的。例如,发送到 AWS API Gateway 的数据包含多个单独的记录,这些记录将被发送到一个或多个流。在这种情况下,KPL 的好处(请参阅https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html)仍然有效,但您必须了解使用 Lambda 给出的具体细节,这里指出了 https://github.com/awslabs/amazon-kinesis-producer/issues/143 并使用

    kinesisProducer.flushSync() 
    

    在插入的末尾也对我有用。

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2015-11-09
      • 1970-01-01
      • 2015-10-23
      • 2017-12-07
      • 2016-04-30
      • 1970-01-01
      • 2019-07-08
      • 2019-07-19
      相关资源
      最近更新 更多