什么是Kafka
kafka是一个分布式、高吞吐量、高扩展性的消息队列系统。kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了一个开源项目。主要应用在日志收集系统和消息系统,相信大家之前也听说过其他的消息队列中间件,比如RabbitMQ、AcitveMQ,其实kafka就是这么一个东西,也可以叫做KafkaMQ。总之,Kafka比其他消息队列要好一点,优点也比较多,稳定性和效率都比较高。
相关概念
上图中包含了2个Producer(生产者),一个Topic(主题),3个Partition(分区),3个Replica(副本),3个Broker(Kafka实例或节点),一个Consumer Group(消费者组),其中包含3个Consumer(消费者)。
Producer
生产者每发送一条消息必须有一个Topic,也可以说是消息的类别,生产者源源不断的向Kafka服务器发送消息。
Topic
每一个发送到Kafka的消息都有一个主题,也可叫做一个类别,类似我们传统数据库中的表名一样,比如说发送一个主题为order的消息,那么这个order下边就会有多条关于订单的消息,只不过kafka称之为主题,都是一样的道理。
Partition
生产者发送的消息数据Topic会被存储在分区中,把数据分成多个块,达到负载均衡,合理的把消息分布在不同的分区上,分区是被分在不同的Broker上也就是服务器上,这样我们大量的消息就实现了负载均衡。每个Topic可以指定多个分区,但是至少指定一个分区。每个分区存储的数据都是有序的,不同分区间的数据不保证有序性。因为如果有了多个分区,消费数据的时候肯定是各个分区独立开始的,有的消费得慢,有的消费得快肯定就不能保证顺序了。那么当需要保证消息的顺序消费时,我们可以设置为一个分区,只要一个分区的时候就只能消费这个一个分区,那自然就保证有序了。
Replica
副本就是分区中数据的备份,是Kafka为了防止数据丢失或者服务器宕机采取的保护数据完整性的措施,一般的数据存储软件都应该会有这个功能。Kafka做了副本之后同样的会把副本分区放到不同的服务器上,保证负载均衡。类似传统数据库中的主从复制的功能,没错,Kafka会找一个分区作为主分区(leader)来控制消息的读写,其他的(副本)都是从分区(follower),这样的话读写可以通过leader来控制,然后同步到副本上去,保证的数据的完整性。如果有某些服务器宕机,我们可以通过副本恢复数据,也可以暂时用副本中的数据来使用。
Broker
就是Kafka的实例,启动一个Kafka就是一个Broker,多个Brokder构成一个Kafka集群,这就是分布式的体现。
Consumer和Consumer Group
Consume消费者来读取Kafka中的消息,可以消费任何Topic的数据,多个Consume组成一个消费者组,一般的一个消费者必须有一个组(Group)名,如果没有的话会被分一个默认的组名。
使用方法
- 首先需要创建一个Kafka集群
- 在这个集群中创建一个Topic,并且设置好分片数量
- 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Seed方法,将消息发送出去
- 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Poll方法,接收消息
应用场景
-
应用耦合 多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
-
异步处理
多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
- 限流削峰
广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
- 消息驱动的系统
系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理