2016-01-19 30 views
2

我有一个Amazon Kinesis流,包含多个分片。碎片的数量以及消费者的数量并不是一个常数。Amazon-Kinesis:将记录放到每个分片

我想在广告流上向每个消费者广播一个不常见类型的事件。

制作人是否有办法广播一个记录,即发现碎片并在每个记录上放置记录?

+0

您的问题中的“消费者”一词含糊不清。你的意思是“每个消费者应用程序”或“每个工作者线程在一个应用程序中聆听分片”? – az3

回答

1

记录在输入kinesis(即Kinesis API端点)时进入单个入口点。然后将数据放置在流中关于其分区键的分片上。

您无法确定数据直接进入哪个确切的分片;但是如果您选择相同的分区键(只要不调整流的大小),则可以将不同的记录放在同一分片中。由于分片算法,提供的partition_key被散列,然后拾取所有可用碎片中的一个。

例如;

  • 假设您将记录#1插入带有partition_key“asd”的流中。
  • 如果使用相同的partition_key(“asd”)插入另一条记录#2,#3等,则可以确保所有值放置在流的同一分片中。
  • 但是,如果您在将第4条记录放入时选择partition_key作为“qwe”,那么可能与其他片段位于同一分片中。

相关文档页面:http://docs.aws.amazon.com/kinesis/latest/dev/developing-producers-with-sdk.html#kinesis-using-sdk-java-add-data-to-stream

但如果你真的坚持做“1个复用记录每一个碎片”,有一种方法;

  1. 尝试生成一些随机的partition_keys,并将不同的值与它们发送到流。
  2. 运行消费者应用程序并查看哪个碎片已交付了哪个值。
  3. 然后映射您用来发送每个记录的分区键和相应的分片。

所以,现在你知道在发送数据到一个特定的碎片要使用的分区键,你可以在发送这些特殊的“要复用”的记载使用该地图...

这是哈克和蛮力,但它会奏效。

也看到有关分区键和碎片以前的答案:https://stackoverflow.com/a/31377477/1622134

希望这有助于。 PS:如果您使用低级Kinesis API并创建自定义PutRecord请求,则在响应中您可以找到数据放置在哪个分片上。 PutRecordResponse包含shardId信息;

http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html