Kinesis - 消费者集群

Kinesis - cluster of consumers

我有一个运动流,用于对任务进行排队,比如发送电子邮件。我有一群消费者应该阅读队列,然后发送电子邮件。

在这种情况下,如果一个消费者从队列中读取一个项目,其他消费者不应该读取同一个项目;其他我会发送重复的电子邮件。

如何实现?

首先,将 KCL 用于 Kinesis 消费者应用程序。如您所知,放置在流中的记录将位于特定的分片中,并且通过使用 KCL,您可以保证只有一个使用者节点(在应用程序中)轮询该分片。所以不会有双重侦听同一个分片的风险(因此处理同一个记录)。

其次,Kinesis 可能是发送事务性内容(如电子邮件)的错误架构。它可能被复制,甚至没有被处理。它不是一个可靠的队列系统。

例如,流中的每条记录都包含一封电子邮件,但假设在发送其中一封邮件时出现错误。你会怎么做?你会把那条记录再次流式传输,以便重试吗?你会重试多少次? 此外,Kinesis 消费者会批量轮询流中的记录,因此如果在一批记录 (ProcessRecordsInput.getRecords) 中有一条记录被破坏,则该批次 (ProcessRecordsInput.getCheckpointer) 的检查点可能包含多个项目,包括那个破纪录。因此,应用程序重新启动会给您带来双重处理的风险。

我建议在您的用例中使用基于队列的系统(HornetQ、ActiveMQ 等)会更好。