在单个 Java 进程中处理多个 Kinesis 流
Process multiple Kinesis streams within single Java process
我想在同一个 Java 进程中使用 KCL 处理多个 Kinesis 流。
想法很简单:为每个流创建一个新的 KCL 实例,然后 运行 workers 并发。
我的问题是在这种情况下是否所有 KCL 实例都使用相同的线程池,以及这种想法是否是处理流处理时的 good/common 实践。
谢谢
当然,您可以这样做 - 只需启动多个 KCL Worker 实例,每个实例都指向不同的流(具有自己的配置等)。每个 Worker 实例应该独立于其他 Worker 管理自己的 ShardConsumer 线程。
但是,更 common/recommended 的做法是让每个 Worker 运行 在自己的进程中 - 这提供了更多的划分,这将改进:
- 故障案例 - 防止一次故障影响所有 Worker
- deployments/updates - 更好地控制同时停止更新的 Worker 数量
- 硬件管理 - 每个进程一个 Worker 更容易分布在多个小型主机上,尤其是当您的处理需求增长时
- 开发复杂性 - 虽然 KCL 在一个进程中支持多个 Worker,但为每个 Worker 作为自己的进程进行开发要容易得多
我想在同一个 Java 进程中使用 KCL 处理多个 Kinesis 流。
想法很简单:为每个流创建一个新的 KCL 实例,然后 运行 workers 并发。
我的问题是在这种情况下是否所有 KCL 实例都使用相同的线程池,以及这种想法是否是处理流处理时的 good/common 实践。
谢谢
当然,您可以这样做 - 只需启动多个 KCL Worker 实例,每个实例都指向不同的流(具有自己的配置等)。每个 Worker 实例应该独立于其他 Worker 管理自己的 ShardConsumer 线程。
但是,更 common/recommended 的做法是让每个 Worker 运行 在自己的进程中 - 这提供了更多的划分,这将改进:
- 故障案例 - 防止一次故障影响所有 Worker
- deployments/updates - 更好地控制同时停止更新的 Worker 数量
- 硬件管理 - 每个进程一个 Worker 更容易分布在多个小型主机上,尤其是当您的处理需求增长时
- 开发复杂性 - 虽然 KCL 在一个进程中支持多个 Worker,但为每个 Worker 作为自己的进程进行开发要容易得多