我正在尝试在AWS服务之上构建数据收集管道 . 下面给出了总体架构;
总之,系统应该从API网关(1)获取事件(每个事件一个请求),并且数据应写入Kinesis(2) .
我期待每秒约100k事件 . 我的问题与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 |
| | | |
| | | |
| | | |
+----------------+ +----------------+
我也在考虑直接写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
+----------------+ | | +----------------+
| | | | | |
| | | | | |
1 回答
我不认为使用KPL是正确的选择 . KPL的关键概念是,记录在客户端收集,然后作为批处理操作发送给Kinesis . 由于Lambdas每次调用都是无状态的,因此存储聚合记录(在将其发送到Kinesis之前)相当困难 .
我想你应该看看下面的AWS文章,它解释了如何直接将API-Gateway连接到Kinesis . 通过这种方式,您可以避免仅转发您的请求的额外Lambda .
Create an API Gateway API as an Kinesis Proxy