是否可以在连接到 API 网关的 Lambda 上使用 AWS KPL
Is it possible to use AWS KPL on Lambda connected to API Gateway
我正在尝试在 AWS 服务之上构建数据收集管道。总体架构如下;
总而言之,系统应该从 API 网关 (1) 获取事件(每个事件一个请求)并且数据应该写入 Kinesis (2)。
我预计每秒约有 10 万个事件。我的问题与 KPL 在 Lambda 函数上的使用有关。在第 2 步,我计划使用 KPL 编写一个 Lambda 方法,以在 Kinesis 上以高吞吐量编写事件。但我不确定这是否可能,因为 API 网关分别为每个事件调用 lambda 函数。
是 possible/reasonable 在这样的架构中使用 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
+----------------+ | | +----------------+
| | | | | |
| | | | | |
我不认为在这里使用 KPL 是正确的选择。 KPL 的关键概念是,记录在客户端收集,然后作为批处理操作发送到 Kinesis。由于 Lambda 每次调用都是无状态的,因此很难存储聚合记录(在将其发送到 Kinesis 之前)。
我认为您应该查看以下 AWS 文章,其中解释了如何将 API-Gateway 直接连接到 Kinesis。这样,您就可以避免额外的 Lambda 只是转发您的请求。
显然,如果您的数据来自 AWS API 网关对应于一个 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 网关的数据包含多个单独的记录,这些记录将被发送到一个或多个流。在这种情况下,好处(参见 https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html) of KPL are still valid, but you have to be aware of specifics given by using of Lambda concretely an "issue" pointed out here https://github.com/awslabs/amazon-kinesis-producer/issues/143 并使用
kinesisProducer.flushSync()
在插入结束时也对我有用。
我正在尝试在 AWS 服务之上构建数据收集管道。总体架构如下;
总而言之,系统应该从 API 网关 (1) 获取事件(每个事件一个请求)并且数据应该写入 Kinesis (2)。
我预计每秒约有 10 万个事件。我的问题与 KPL 在 Lambda 函数上的使用有关。在第 2 步,我计划使用 KPL 编写一个 Lambda 方法,以在 Kinesis 上以高吞吐量编写事件。但我不确定这是否可能,因为 API 网关分别为每个事件调用 lambda 函数。
是 possible/reasonable 在这样的架构中使用 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
+----------------+ | | +----------------+
| | | | | |
| | | | | |
我不认为在这里使用 KPL 是正确的选择。 KPL 的关键概念是,记录在客户端收集,然后作为批处理操作发送到 Kinesis。由于 Lambda 每次调用都是无状态的,因此很难存储聚合记录(在将其发送到 Kinesis 之前)。
我认为您应该查看以下 AWS 文章,其中解释了如何将 API-Gateway 直接连接到 Kinesis。这样,您就可以避免额外的 Lambda 只是转发您的请求。
显然,如果您的数据来自 AWS API 网关对应于一个 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 网关的数据包含多个单独的记录,这些记录将被发送到一个或多个流。在这种情况下,好处(参见 https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html) of KPL are still valid, but you have to be aware of specifics given by using of Lambda concretely an "issue" pointed out here https://github.com/awslabs/amazon-kinesis-producer/issues/143 并使用
kinesisProducer.flushSync()
在插入结束时也对我有用。