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日志级别置于调试状态的。你能把你做的步骤/样品贴出来吗?