Kinesis发送的记录不等于消费记录

时间:2014-12-11 06:29:17

标签: amazon-web-services amazon-kinesis

我们正在评估Kinesis,我发现了以下行为。我使用Kinesis进行简单测试,以测试准确性和基本功能。

测试按如下方式将项目生成流:

    PutRecordRequest putRecordRequest = new PutRecordRequest();
    putRecordRequest.setStreamName( streamName );
    putRecordRequest.setData(ByteBuffer.wrap(event.getBytes()));
    putRecordRequest.setPartitionKey( message.getEventList().getEvents().get(0).getLicenseKey());

    UsageServiceStatistics.instance().getKinesisSent().increase();
    PutRecordResult putRecordResult = kinesisManager.getConnection().putRecord( putRecordRequest );

然后我使用Amazon Kinesis客户端库(KCL),如下所示:

@Override
public void processRecords(List<Record> records, IRecordProcessorCheckpointer iRecordProcessorCheckpointer)
{
    logger.debug("Received a list of records for processing with size:" + records.size());

    for (Record record : records)
    {
        UsageServiceStatistics.instance().getKinesisConsumed().increase();
        logger.debug("Kinesis consumed:" + UsageServiceStatistics.instance().getKinesisConsumed());
        if (!processRecord(record))
        {
            logger.error("Couldn't process record " + record + ". Skipping the record.");
        }
    }

    checkpointManager.checkpoint(iRecordProcessorCheckpointer);
}

我发现生产数量与消费记录数量之间存在差异。 例如,当连续3次发送2000个项目的系列时,我看到以下内容:

Kinesis sent:counter=2000
Kinesis consumed:1999

Kinesis sent:counter=4000
Kinesis consumed:counter=3994

Kinesis sent:counter=6000
Kinesis consumed:counter=5999

为什么我没有看到生产与消费完全相同的数量? 为什么在第二次运行后丢失了6个项目,并且我在运行3中获得了2006年消耗的记录,尽管我在第2次运行和第3次运行之间至少等待了2个月。

最后,我在检查点频率较高之前做了一套测试,然后差异更大了?亚马逊KCL用于触发向conumer发送记录的规则是什么?为什么它会停止发送并保留队列中的项目(例如从第2到第3步)?发送的6000的最后一项在哪里?

提前谢谢

1 个答案:

答案 0 :(得分:2)

我找到了根本原因。

这是我的代码中的一个错误。

KCL创建了许多记录处理器,它们等于特定流中的分片数。

但是,我通过让他们在多线程环境中使用相同的Checkpointer实体来介绍一个错误。 当我修复它以使每个记录处理器具有自己的检查指针时,它完美地工作并且计数是一致的。