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

我正在尝试在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)

2 years ago

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

我想你应该看看下面的AWS文章,它解释了如何直接将API-Gateway连接到Kinesis . 通过这种方式,您可以避免仅转发您的请求的额外Lambda .

Create an API Gateway API as an Kinesis Proxy