AMQP模型
模型结构
- 队列
- 信箱
- 绑定
特点
支持事务、一致性高
代表
RabbitMQ
kafka模型
功能
消息队列、存储、流处理
优势
吞吐量高、支持水平拓展、容错性和可靠性、和大数据生态好
topic
存储消息类似于数据库中的表,topic是半结构的,某些时刻可以存储不同的消息
分区
topic可以包含多个分区,不同的分区可以存储到不同的服务器,实现分布式,消息一旦存入分区不可更改
record消息记录
record以key-value的形式存在,当key为nil是,会遍历存入各个分区, 相同的key存入相同的分区
数据备份
replication-factor的值就是包含leader和follower的数量,数据的读写都是从leader中,kafka维护一个ISR集合,其中包含了分区的编号,如果某个分区跟不上其他分区的更新会被从ISR中清除,跟上后再让其加入
broker消息代理
只负责处理读写请求,每个服务器启动一个broker实例
本地伪集群搭建
- 安装zookeepr
linux centos7安装zookeeper,yum安装_yum安装zookeeper_开始即是结束的博客-CSDN博客
- 安装kafka
下载安装包,解压就行了
- 启动三个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,失败读不到