我目前正在向aws kinesis流发送一系列xml消息,我一直在不同的项目中使用它,所以我非常有信心这一点有效。然后我写了一个lambda来处理从kinesis流到kinesis firehose的事件:
import os
import boto3
import base64
firehose = boto3.client('firehose')
def lambda_handler(event, context):
deliveryStreamName = os.environ['FIREHOSE_STREAM_NAME']
# Send record directly to firehose
for record in event['Records']:
data = record['kinesis']['data']
response = firehose.put_record(
DeliveryStreamName=deliveryStreamName,
Record={'Data': data}
)
print(response)
我已将kinesis流设置为lamdba触发器,并将批量大小设置为1,并将起始位置设置为LATEST。
对于kinesis firehose,我有以下配置:
Data transformation*: Disabled
Source record backup*: Disabled
S3 buffer size (MB)*: 10
S3 buffer interval (sec)*: 60
S3 Compression: UNCOMPRESSED
S3 Encryption: No Encryption
Status: ACTIVE
Error logging: Enabled
我发送了162个事件,我从s3读取它们,并且我已经设法得到它160,通常它更少。我甚至试图等待几个小时,因为重试时发生了一些奇怪的事情。
任何人都有使用kinesis的经验 - > lamdba - > firehose,并看到丢失数据的问题?
答案 0 :(得分:0)
根据我在这里看到的情况,当您将数据发布到Kinesis Stream(不是FireHose)时,很可能丢失了项目。
由于在写入FireHose时使用put_record
,因此它将引发异常,并且在这种情况下将重试lambda。 (检查该级别是否有故障是有意义的。)
因此,考虑到我可能认为记录在到达Kinesis流之前已经丢失。
如果您使用put_records
方法将项目发送到Kinesis流,这不能保证所有记录都将被发送到流(由于超出了写入吞吐量或内部错误),某些记录可能会失败已发送。在那种情况下,失败的记录子集应该由您的代码重新发送(这是Java example,很抱歉,我找不到Python)。