基于 RocksDB 的可靠 Kafka producer

https://github.com/artiship/rocks-kafka-producer

为什么 Kafka producer 需要持久化队列?

Kafka 客户端需要注意两种情况:

  • 当 Kafka 集群或 brokers 不可用时,客户端仍然不停地发送消息,由于 Kafka 客户端的内存模型设计,数据会一直堆积在内存中而得到释放,一方面过多的内存消耗影响了应用的主要业务,另一方面过多的消费可以存在丢失,为了解决这个问题,一般会人为重启,内存中缓存的消息也随即丢失。
  • 另一种情况是程序意外崩溃,留在 Kafka 客户端内存模型中的数据也会丢失。

这两种情况可以由另一篇文章 基于 RocksDB 的持久化队列 中提到的持久化队列来解决。使用这个持久化队列,数据将先同步写到队列,即 RocksDB, RocksDB 的 WAL 保证了数据不会丢失,然后 producer 中有一个异步线程会消费这个队列,再将消息投递到 Kafka。试想再遇到上述客户会遇到的两种情况,数据因为存储在基于本地文件系统的 RocksDB 中,当 Kafka 集群恢复时,数据会从 RocksDB 中消费然后再发送到 Kafka,同时当程序被动崩溃重新启动时,数据也不会丢失,从而做了可靠且有序。

你可能感兴趣的:(基于 RocksDB 的可靠 Kafka producer)