kafka入门

AMQP模型

模型结构

  • 队列
  • 信箱
  • 绑定

特点

支持事务、一致性高

代表

RabbitMQ

kafka模型

功能

消息队列、存储、流处理

优势

吞吐量高、支持水平拓展、容错性和可靠性、和大数据生态好

topic

存储消息类似于数据库中的表,topic是半结构的,某些时刻可以存储不同的消息

分区

topic可以包含多个分区,不同的分区可以存储到不同的服务器,实现分布式,消息一旦存入分区不可更改

record消息记录

record以key-value的形式存在,当key为nil是,会遍历存入各个分区, 相同的key存入相同的分区

数据备份

replication-factor的值就是包含leader和follower的数量,数据的读写都是从leader中,kafka维护一个ISR集合,其中包含了分区的编号,如果某个分区跟不上其他分区的更新会被从ISR中清除,跟上后再让其加入

broker消息代理

只负责处理读写请求,每个服务器启动一个broker实例

本地伪集群搭建

  1. 安装zookeepr

linux centos7安装zookeeper,yum安装_yum安装zookeeper_开始即是结束的博客-CSDN博客

  1. 安装kafka

下载安装包,解压就行了

  1. 启动三个kafka服务

启动服务前要确保zk服务正在运行

要给每个服务写运行时相应的配置文件,配置文件从kafka的config/server.properties文件中拷贝,修改其中的broker、监听端口、日志输出文件

// kafka/config/config/server.properties
broker.id=0
listeners=PLAINTEXT://:9090
log.dirs=/tmp/kafka-logs-0

新建etc目录用于保存新建的三个配置文件

// kafka/etc
server-0.properties
server-1.properties
server-2.properties

开启终端启动服务·,每个服务对应不同的配置文件,每个服务对应一个broker

//启动第一个
./kafka-server-start.sh ../etc/server-0.properties

创建topic

./kafka-topics.sh --zookeeper localhost:2181 --create test  --partitions 3 --replication-factor 2

查看分区情况

[manubu@192 bin]$ ./kafka-topics.sh --zookeeper localhost:2181 --describe --topic test
Topic: test	TopicId: 0kYjzFOGRYKl90QP3LMpDw	PartitionCount: 3	ReplicationFactor: 2	Configs: 
	Topic: test	Partition: 0	Leader: 2	Replicas: 2,0	Isr: 2,0
	Topic: test	Partition: 1	Leader: 0	Replicas: 0,1	Isr: 0,1
	Topic: test	Partition: 2	Leader: 1	Replicas: 1,2	Isr: 1,2

创建生产者

./kafka-console-producer.sh --bootstrap-server localhost:localhost:9090,localhost:9091,localhost:9092 --topic test

创建消费者

./kafka-console-consumer.sh --bootstrap-server localhost:9090,localhost:9091,localhost:9092 --topic test

kafka的消息模型

分区消费原则

分区是最小的并行单位,一个分区可以被不同组的消费者消费,一个消费者可以消费不同的分区,但一个分区不可被相同组的消费者消费

发布订阅模式

每个消费者属于不同的组

点对点模式

所有消费者属于同一个组,可以实现负载均衡

消息顺序

同一生产者到同一partiton,先到的offset小,如果到不同的partiton中无法保证顺序,要保证顺序性可以设置一个分区,或者使用相同的key分配到同一patition原则

消息传递语义

生产者:

  • 最多一次,生产者传递消息给代理,如果消息丢失也不会重传
  • 至少一次,代理接收到消息后,反馈给生产者失败,生产者会重新发送

消费者:

  • 至少一次,先读取topic,在提交offset
  • 最多一次,先提交offset,在读

生产者API

send()异步发送

在生产者和broker之间创建缓冲区,生产者将消息送入缓冲区就返回,不等broker

可以设置Batch.size、linger.ms可以批量发送,两者满足其中之一就可以再发送

参数acts:

  • 0,当消息放入缓冲区,就认为成功发送
  • 1,当消息存入lead本地,不必考虑follower是否同步,就认为成功
  • all或-1,follower也同步成功

至多一次:acks=0或1

至少一次:acks=-1并且retries>0

消费者API

参数enable.auto.commit:

  • true,至多一次
  • false,至少一次

消费者与消费位置

kafka中有一个名为_consumer_offset的topic,用于存放消费者在那个主题、那个分区中的offset,快速恢复

如何实现精确一次

消费者

启用幂等并且acts=all

生产者

定义ID

事务消息

默认为read uncommit,如果事务失败也可以读到,可修改为read commit,失败读不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值