kafka是基于发布与订阅模型的分布式消息引擎。
什么是发布与订阅(引用维基百科)
在软件架构中,发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。
简单的来说,消息的生产者只需要通过发布,将消息按照分类发送到不同的地方,消息的消费者订阅指定的分类,消费该分类下的消息。
这种分类在kafka中就称为主题。
主题就是生产者发布、消费者订阅的对象。
在kafka中,消息的分类就是主题topic,比如某个业务中,有一种创建单据从而产生的消息给下游使用,那么就可以申请一个称为创建单据的topic,该业务中的所有创建单据产生的消息都发送到这个topic中,消费者订阅这个topic来消费创建单据的消息。
向主题发布消息的应用称为生产者,向主题订阅消息消费的应用称为消费者,生产者和消费者统称为客户端。
每个主题可以配置多个分区,而每个分区又可以配置多个副本。
分区和主题一样,都是一个逻辑上的概念,主题下的一条消息过来,只能发送到众多分区中的其中一个分区中。
比如某个主题有三个分区(kafa的分区编号是从0开始的,所以会存在编号为0,1,2三个分区),生产者发送来一条消息,那么这条消息,要不就存在编号0的分区中,要不就存在编号1的分区中,要么就存在编号2的分区中。
而每个分区,又有多个副本,这些副本中分为两类,一类为领导者副本,另一类为追随者副本。追随者副本是不对外提供服务的。
副本的工作机制就是生产者永远都是向领导者副本写消息,消费者永远是从领导者副本读消息。追随者副本,只做一件事,就是向领导者副本发出请求,将消息荣冗余到追随者副本中。
而kafka的服务端则称为broker。一台物理机器上,是可以部署多个broker的。但通常,都是一台机器部署一个broker,多台机器构成一个集群。
举个实际生产环境中的例子,现在kafka集群部署了3台机器,分别为node1,node2,node3,每台机器上部署了一个broker,现在要创建名为交易成功tradeSuccess的主题,这个交易成功的主题有4个分区,副本因子是2,那么最终部署的结果会如下:
node1
topic-tradeSuccess-0
topic-tradeSuccess-1node2
topic-tradeSuccess-1
topic-tradeSuccess-2
topic-tradeSuccess-3node3
topic-tradeSuccess-0
topic-tradeSuccess-2
topic-tradeSuccess-3
分区为topic-tradeSuccess-0,topic-tradeSuccess-1,topic-tradeSuccess-2,topic-tradeSuccess-3四个分区,每个分区都有两个副本,这两个副本分别部署在不同的broker上。