Amazon web services 已发送的记录不等于已消耗的记录

Amazon web services 已发送的记录不等于已消耗的记录,amazon-web-services,amazon-kinesis,Amazon Web Services,Amazon Kinesis,我们正在评估运动,我发现了以下行为。我有一个简单的测试,使用动觉来测试准确性和基本功能 测试将项生成为流,如下所示: PutRecordRequest putRecordRequest = new PutRecordRequest(); putRecordRequest.setStreamName( streamName ); putRecordRequest.setData(ByteBuffer.wrap(event.getBytes())); putRecor

我们正在评估运动,我发现了以下行为。我有一个简单的测试,使用动觉来测试准确性和基本功能

测试将项生成为流,如下所示:

    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 );
@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);
}
然后我使用Amazon Kinesis客户端库(KCL),如下所示:

    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 );
@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);
}
为什么我看不到完全相同的生产和消费数量? 为什么在第二次运行之后,6个项目丢失了,尽管我在运行2和运行3之间等待了至少2 mn,但我在运行3时只获得了2006个消费记录

最后,在这之前,我做了一组检查点频率更高的测试,然后差异更大?亚马逊KCL使用什么规则触发向消费者发送记录?为什么它会停止发送并将项目保留在队列中(比如从运行2到运行3)?发送的6000件中的最后一件在哪里


我提前找到了根本原因

这是我代码中的一个bug

KCL创建的记录处理器数量等于特定流中的碎片数量

然而,我引入了一个bug,让它们在多线程环境中使用相同的检查点实体。
当我将其修复为每个记录处理器都有自己的检查点时,它工作得非常好,计数也一致。

您是否检查了写入Kinesis的事件的异常情况。您可能已被某些put_record调用限制。我进行了检查,即使将kinesis日志级别置于调试状态,也没有异常。您是如何将kinesis日志级别置于调试状态的。你能把你做的步骤/样品贴出来吗?