Amazon web services 是否可以在连接到API网关的Lambda上使用AWS KPL

Amazon web services 是否可以在连接到API网关的Lambda上使用AWS KPL,amazon-web-services,aws-lambda,aws-api-gateway,amazon-kinesis,Amazon Web Services,Aws Lambda,Aws Api Gateway,Amazon Kinesis,我正在尝试在AWS服务之上构建一条数据收集管线。总体架构如下所示 总之,系统应该从API网关(1)获取事件(每个事件一个请求),并且数据应该写入到Kinesis(2) 我预计每秒约10万个事件。我的问题与Lambda函数的KPL用法有关。在第2步中,我计划使用KPL编写一个Lambda方法,以高吞吐量在Kinesis上编写事件。但我不确定这是否可能,因为API网关分别为每个事件调用lambda函数 在这样的体系结构中使用KPL是否可能/合理,或者我应该使用Kinesis-Put API来代替

我正在尝试在AWS服务之上构建一条数据收集管线。总体架构如下所示

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

我预计每秒约10万个事件。我的问题与Lambda函数的KPL用法有关。在第2步中,我计划使用KPL编写一个Lambda方法,以高吞吐量在Kinesis上编写事件。但我不确定这是否可能,因为API网关分别为每个事件调用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  |
                                                                         |                |                    |                |
                                                                         |                |                    |                |
                                                                         |                |                    |                |
                                                                         +----------------+                    +----------------+

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

我认为您应该看看下面的AWS文章,它解释了如何将API网关直接连接到Kinesis。这样,您就可以避免额外的Lambda,它只是转发您的请求


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

我认为您应该看看下面的AWS文章,它解释了如何将API网关直接连接到Kinesis。这样,您就可以避免额外的Lambda,它只是转发您的请求


显然,如果通过AWS API网关的数据对应于一条Kinesis数据流记录,那么使用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网关的数据包含多个单独的记录,这些记录将被发送到一个或多个流。在这种情况下,KPL的好处(请参阅)仍然有效,但您必须了解使用Lambda所给出的具体细节,具体地说,这里指出了一个“问题”并使用了它


在插入的最后,这对我也很有效

显然,如果通过AWS API网关的数据对应于一条Kinesis数据流记录,那么使用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网关的数据包含多个单独的记录,这些记录将被发送到一个或多个流。在这种情况下,KPL的好处(请参阅)仍然有效,但您必须了解使用Lambda所给出的具体细节,具体地说,这里指出了一个“问题”并使用了它


在插入的最后,这对我也很有效

你觉得第二种架构怎么样。我不想在rest端点上遇到任何延迟(步骤1)。如果我直接将api网关与kinesis端点一起使用,步骤2将成为一个不必要的同步写入。第二个架构是我在kinesis选项出现之前实现的。这是可行的,但对S3调用的数量有很大的限制。S3将在某个时候限制您,您的API将不得不拒绝新的传入请求。因此,如果您不想将节流传播到客户端,那么将数据放入Kinesis进行聚合是更好的选择。对于每秒100k的调用,我不确定S3是否会接受这么多的put调用。您如何看待第二种体系结构。我不想在rest端点上遇到任何延迟(步骤1)。如果我直接将api网关与kinesis端点一起使用,步骤2将成为一个不必要的同步写入。第二个架构是我在kinesis选项出现之前实现的。这是可行的,但对S3调用的数量有很大的限制。S3将在某个时候限制您,您的API将不得不拒绝新的传入请求。因此,如果您不想将节流传播到客户端,那么将数据放入Kinesis进行聚合是更好的选择。每秒10万次呼叫,我不确定S3是否会接受这么多put呼叫。
kinesisProducer.flushSync()