Kinesis消费者返回空记录(boto,python)

时间:2018-05-09 19:36:57

标签: python amazon-web-services boto3 amazon-kinesis

我无法检查我写给Kinesis的数据。看起来以下示例应该可以工作,但我得到一个从get_records返回的空列表(在Records字段中)。可能会发生什么想法?

import uuid
import boto3
import time


streamname = 'mytestStream'
session = boto3.session.Session() 
kinesis_client = session.client('kinesis', region_name='us-east-1')


##### WRITE TO KINESIS

partitionkey = str(uuid.uuid4())[:8]
put_response = kinesis_client.put_record(StreamName=streamname,Data='mytestdata',PartitionKey=partitionkey)

time.sleep(5)


##### READ FROM KINESIS

shard_id = kinesis_client.describe_stream(StreamName=streamname)['StreamDescription']['Shards'][0]['ShardId']
shard_iterator = kinesis_client.get_shard_iterator(StreamName=streamname, ShardId=shard_id, ShardIteratorType="LATEST")["ShardIterator"]
data_from_kinesis = kinesis_client.get_records(ShardIterator=shard_iterator)

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您要使用LATEST checkpoint,则应首先开始阅读流,然后放置记录。在您的示例中,时间轴如下;

  • at t0:​​流中的最新检查点为101。
  • at t1(主线程):您将记录放入流中,记录位于检查点102.
  • at t2(主线程):您开始在最后一点(即103)处尾随流。

要解决此问题,您应该在不同的线程中运行生产者和使用者。正确的流程应该是这样的;

  • at t0(消费者主题):开始在最晚的位置(即201)开始追踪蒸汽。
  • at t1(生产者线程):您将记录放入流中,记录放在检查点202上。
  • at t2(使用者线程):随着服务器端的分片向前移动(因为您刚刚添加了数据)并且自从检查点201以来您已经将分片拖尾,您将迭代新的检查点202并显示您的数据。