docs(project): update config, fix typo

Add .gitignore and .gitattribute
Fix typo
Update offer page
This commit is contained in:
yanglbme
2018-12-21 19:53:45 +08:00
parent 488cb742ed
commit a3ab26dca2
21 changed files with 87 additions and 43 deletions

View File

@@ -66,7 +66,7 @@ RabbitMQ 如果丢失了数据,主要是因为你消费的时候,**刚消费
### Kafka
#### 消费端弄丢了数据
唯一可能导致消费者弄丢数据的情况,就是说,你那个消费到了这个消息,然后消费者那边**自动提交了 offset**,让 Kafka 以为你已经消费好了这个消息,其实你刚准备处理这个消息,你还没处理,你自己就挂了,此时这条消息就丢咯。
唯一可能导致消费者弄丢数据的情况,就是说,你消费到了这个消息,然后消费者那边**自动提交了 offset**,让 Kafka 以为你已经消费好了这个消息,其实你刚准备处理这个消息,你还没处理,你自己就挂了,此时这条消息就丢咯。
这不是跟 RabbitMQ 差不多吗,大家都知道 Kafka 会自动提交 offset那么只要**关闭自动提交** offset在处理完之后自己手动提交 offset就可以保证数据不会丢。但是此时确实还是**可能会有重复消费**比如你刚处理完还没提交offset结果自己挂了此时肯定会重复消费一次自己保证幂等性就好了。
@@ -74,13 +74,13 @@ RabbitMQ 如果丢失了数据,主要是因为你消费的时候,**刚消费
#### Kafka 弄丢了数据
这块比较常见的一个场景,就是 Kafka 某个 broker 宕机,然后重新选举 partiton 的 leader。大家想想要是此时其他的 follower 刚好还有些数据没有同步,结果此时 leader 挂了,然后选举某个 follower 成 leader 之后,不就少了一些数据?这就丢了一些数据啊。
这块比较常见的一个场景,就是 Kafka 某个 broker 宕机,然后重新选举 partition 的 leader。大家想想要是此时其他的 follower 刚好还有些数据没有同步,结果此时 leader 挂了,然后选举某个 follower 成 leader 之后,不就少了一些数据?这就丢了一些数据啊。
生产环境也遇到过,我们也是,之前 Kafka 的 leader 机器宕机了,将 follower 切换为 leader 之后,就会发现说这个数据就丢了。
所以此时一般是要求起码设置如下 4 个参数:
- 给 topic 设置 `replication.factor` 参数:这个值必须大于 1要求每个 partition 必须有至少2个副本。
- 给 topic 设置 `replication.factor` 参数:这个值必须大于 1要求每个 partition 必须有至少 2 个副本。
- 在 Kafka 服务端设置 `min.insync.replicas` 参数:这个值必须大于 1这个是要求一个 leader 至少感知到有至少一个 follower 还跟自己保持联系,没掉队,这样才能确保 leader 挂了还有一个 follower 吧。
- 在 producer 端设置 `acks=all`:这个是要求每条数据,必须是**写入所有 replica 之后,才能认为是写成功了**。
- 在 producer 端设置 `retries=MAX`(很大很大很大的一个值,无限次重试的意思):这个是**要求一旦写入失败,就无限重试**,卡在这里了。
@@ -88,4 +88,4 @@ RabbitMQ 如果丢失了数据,主要是因为你消费的时候,**刚消费
我们生产环境就是按照上述要求配置的,这样配置之后,至少在 Kafka broker 端就可以保证在 leader 所在 broker 发生故障,进行 leader 切换时,数据不会丢失。
#### 生产者会不会弄丢数据?
如果按照上述的思路设置了 `ack=all`,一定不会丢,要求是,你的 leader 接收到消息,所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条件,生产者会自动不断的重试,重试无限次。
如果按照上述的思路设置了 `acks=all`,一定不会丢,要求是,你的 leader 接收到消息,所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条件,生产者会自动不断的重试,重试无限次。