我有一个Kinesis生产者,它将一种类型的消息写入流。我想在多个完全不同的消费者应用程序中处理此流。因此,pub / sub具有针对给定主题/流的单个发布者。我还想利用检查点来确保每个消费者处理写入流的每条消息。
最初,我为所有消费者和制作人使用相同的App Name。但是,一旦我启动了多个消费者,我就开始收到以下错误:
com.amazonaws.services.kinesis.model.InvalidArgumentException:GetShardIterator中使用的启动序列号49564236296344566565977952725717230439257668853369405442 shard shardId-000000000000 in stream PackageCreated in account ************无效,因为它不是来自这个流。 (服务:AmazonKinesis;状态代码:400;错误代码:InvalidArgumentException;请求ID:..)
这似乎是因为消费者正在使用相同的应用名称与他们的检查点发生冲突。
通过阅读文档,似乎使用检查点进行发布/订阅的唯一方法是为每个消费者应用程序创建一个流,这需要每个生产者了解所有可能的消费者。这比我想要的更紧密耦合;它真的只是一个队列。
似乎Kafka支持我想要的东西:任意消费给定的主题/分区,因为消费者完全控制自己的检查点。如果我想要使用检查点的pub / sub,我是唯一选择转移到Kafka或其他替代方案的选择吗?
我的RecordProcessor代码,在每个消费者中都是相同的:
override def processRecords(processRecordsInput: ProcessRecordsInput): Unit = {
log.trace("Received record(s) from kinesis")
for {
record <- processRecordsInput.getRecords
json <- jawn.parseByteBuffer(record.getData).toOption
msg <- decode[T](json.toString).toOption
} yield subscriber ! msg
processRecordsInput.getCheckpointer.checkpoint()
}
代码解析消息并将其发送给订阅者。现在,我只是将所有消息标记为已成功接收。我可以看到在AWS Kinesis仪表板上发送的消息,但没有发生读取,可能是因为每个应用程序都有自己的AppName,并且没有看到任何其他消息。
答案 0 :(得分:5)
您想要的模式,一个发布者的模式和&amp;支持来自一个Kinesis流的多个消费者。每个消费者不需要单独的流。
你是怎么做到的?您需要为每个消费者提供不同的应用程序名称。这样,一个消费者的检查点信息不会与另一个消费者的信息相冲突。
检查对此的第一个回复:https://forums.aws.amazon.com/message.jspa?messageID=554375