http://www.sohu.com/a/1442257...
看了kafka原理的很多篇文章,但对于kafka仍然存在一些疑问。
如果A实例和B实例都是同一个group,A连followerA,B连followerB,它们各自拉消息时,不可能拉到同样的数据?另一个问题是,follower从leader拉数据时,是不是拉到的消息都不一样,还是一样的?由于kafka有备份的机制,很可能会有一样的,那么是不是说仍然可以被实例A和B消费到同样的消息?
另外,拉数据时,follower不太可能通过分布式锁的方式确保消息只有一个同一group的实例被消费,因为这样太慢。
http://blog.csdn.net/lizhitao...
2.Partition Replica同步机制
1.Partition的多个replica中一个为Leader,其余为follower
2.Producer只与Leader交互,把数据写入到Leader中
3.Followers从Leader中拉取数据进行数据同步
4.Consumer只从Leader拉取数据
上面这篇文章提到kafka其实所有实例都只会跟leader打交道,只有leader挂了的时候才切换到最新的leader,那么,其实follower平时并不处理push和pull请求,只是备份?只有成为新的leader时才处理push pull请求?
Kafka使用分区策略来确保一个消息只能被同一个group中的一个实例消费。分区策略是Kafka如何组织和存储消息的机制。分区策略使得消息可以在多个服务器上被处理。
在Kafka中,消息被分成了多个分区,每个分区都有一个特定的范围。每个分区都有一个唯一的分区ID,这是由消息发送者在消息中指定的。Kafka使用这些分区ID来决定消息应该被发送到哪个服务器。
每个服务器都有一个主题,这个主题是Kafka存储消息的地方。每个主题都有一个特定的ID,这个ID是由消息发送者在消息中指定的。Kafka使用这些主题ID来决定消息应该被发送到哪个服务器。
在Kafka中,一个消费者实例会收到一个消息分区,并尝试从这个分区中消费消息。如果消息分区没有消息,那么消费者实例将等待一段时间,然后再次尝试从同一个分区中消费消息。
这种分发机制使得Kafka能够确保消息只能被同一个group中的一个实例消费。例如,如果在一个消息分区中有一条消息,那么这个消息分区的所有消费者实例都将看到这条消息。如果在另一个消息分区中有一条消息,那么这个消息分区的所有消费者实例都将看不到这条消息。
总的来说,Kafka的分区策略确保了消息只能被同一个group中的一个实例消费。