Products
GG网络技术分享 2026-01-21 19:08 0
哎呀,说起 Kafka 那叫一个让人又爱又恨——它到底怎么保证那可怕的“数据不丢失”呢?先别急, 我这篇文章要把各种套路、坑爹的细节全dou掰开揉碎, 蚌埠住了! 像老妈子炒菜一样把每一味配料撒进去,让你kan完后脑袋嗡嗡作响,却还Neng记住点儿真材实料。
Kafka 本身是个分布式日志系统,它把消息写进磁盘,磁盘嘛——永远是硬盘,不是内存。磁盘持久化是它防止数据在机器宕机时“啪”一下就消失的第一层保险。可是光靠磁盘也不行, 还得靠、ISR以及这些小技巧来双保险。

每个 Partition dou会有 N 个副本, 其中一个是 Leader,其他的是 Follower。只要 Leader 挂了 只要还有足够多的 Follower 在 ISR 队列里Kafka 就会选出新的 Leader,继续提供服务。 关键点:如guo你把 min.insync.replicas=2 配成两条, 那么即使只有两条副本同步成功,生产者仍然可yi写入,否则就会抛异常,我晕...。
生产者端配置 acks=all意思是必须等suo有 ISR 中的副本dou确认写入成功后才算成功返回。这样即便 Leader 瞎了眼, 有啥用呢? 也不会导致消息丢失——主要原因是 Follower Yi经把数据刷到磁盘了。
我emo了。 幂等生产者从 0.11 起就来了它会给每条消息分配一个唯一的 producer.id 和递增的 sequence numberBroker 会检测重复并抛弃,从而避免因网络抖动导致的“重复投递”。如guo你不想手动搞这些参数, 可yi直接在配置里打开 enable.idempotence=true
重试和 backoff:
backoff.ms: 两次重试之间稍微歇一歇,防止瞬间打爆 Broker。干就完了! 我第一次kan到 “acks=all” 真是心跳加速,好像发现了新大陆!后来啊第二天集群节点挂掉, 我才发现原来 ISR 少于 2 条,这下子报错一堆,我泪流满面…于是赶紧调高 min.insync.replicas,那种从绝望中爬起来的感觉,你懂吗?🤯🤯🤯
# 手动提交 offset 才是真爱#
自动提交 offset虽然省事,但极易造成 “消费了但未处理完毕就标记Yi消费”,you其在业务逻辑复杂、处理时间长的时候, 我CPU干烧了。 一旦消费者崩溃,那些未完成处理的数据就真的消失啦!suo以建议使用手动提交huo者事务性消费。
Kafka 从 0.11 开始支持事务, 只要在 Consumer 配置里打开 "isolation.level":"read_committed", bing且配合 Producer 的事务 API,就Neng实现"一次消费,一次提交"。这玩意儿实在太高级,简直像给你的数据套上了一层防弹衣。
| # 排名 | 客户端名称 | 语言支持 | 事务? | 活跃度⭐️数 |
|---|---|---|---|---|
| 1️⃣ | Kafka‑Java Client | Java ✅ / Scala ✅ / Kotlin ✅ | ✅ | 💎💎💎💎💎💎💎💎💎💎 |
| 2️⃣ | Sarama | Go ✅ / Golang ✅ | ✅ | 💎💎💎💎💎💎💎 |
| 3️⃣ | Pykafka | Python ✅ | ❌ | 💎💎💎💎 |
| 4️⃣ | Confluent Kafka‑Python | Python ✅ / Cython ✅ | ✅ | 💎💎💎💎💎 |
Demand feedback