我们有 2 个生产者和 1 个消费者,我们使用 KCL 处理来自 kinesis 的数据滞后 24 小时。我们如何提高性能。
1 回答
很明显,您在消费者中做错了什么。24 小时延迟对 Kinesis 来说是个杀手,因为在该时间间隔之后数据将从 Amazon 服务器中删除。
为了改善您的体验,您必须在管道中做一些事情。
如果生产者端2条记录的延迟为7秒,消费者应用处理1条记录的时间超过7秒;您不能使用 Kinesis。这是显而易见的。但是,如果您的业务需要这种方法,您可能需要考虑其他策略。也许在远程服务器上处理(计算密集型)任务,而不是消费者应用程序可以帮助你。也许将消费的记录发送到消息传递平台以在其他地方处理?但这似乎是一种反模式(即“如果你必须使用另一个消息传递系统,你为什么要使用 Kinesis?”)。
在消费者身上少做事。如果您真的需要花费大量时间处理记录,请尝试并行化消费过程。我将再次使用前面的示例,如果 1 条记录需要 15 秒来处理,并且您在该时间间隔内收到 3 个请求;在消费者端使用或更多 3 个工作线程。如果您使用 KCL,则可以使用更多分片来提高并行化。据我所知,每个 IEmitter 类(实现)都在自己的线程上运行。对于每个分片,都会调用一个新的 IEmitter。另外,检查您的哈希(分区)键;这有助于您的记录在分片之间均匀分布。
对消费者进行批处理也是一种选择。例如,假设您有包含“id:1、name:John、surname:Doe”、“2, Jason, Will”、“3, Mary, Poppin”等的记录。假设您需要将所有这些写成信息作为插入到 MySQL。每次插入都是昂贵的(每次打开连接、写入、提交、关闭连接。)。但是,如果您将这些记录写入临时占位符文件以进行批量处理,则可以向 MySQL 发出 1 个插入请求,其中包含 3 个值集。这将为您节省网络开销。
如果您解释您的业务案例、数据模型等,也许我们可以提供更多帮助。
谢谢。