03-02-02 kafka

入门篇

使用场景

MQ基本功能

  • 生产者发送消息,消费者接收消息。(本质上是一个消息的传递)
  • 存储海量消息
  • 写多读少,应对高并发写

根据这些功能,可以实现的使用场景

  • 解耦:生产消息,其他服务根据需要进行消费,生产者无需关心消费者
  • 异步:生产消息,无需关心消费者具体的处理时间
  • 削峰填谷:设置消费者1s消费N条消息

引入MQ带来的问题

  • 系统可用性降低,MQ高可用问题
  • 系统复杂度提高
  • 数据一致性问题:数据丢失、数据重复、数据乱序

基本命令

# 基本命令:kafka-topics.sh、kafka-console-producer.sh、kafka-console-consumer.sh

# 创建Topic
kafka-topics.sh --create \
--zookeeper zoo1:2181 \ # 连接zookeeper
--partitions 3 \ # 分区数量
--replication-factor 3 \ # 副本数量
--topic test

# 列表所以Topic
kafka-topics.sh --list --zookeeper zoo1:2181

# 展示某个Topic的详细信息
kafka-topics.sh --describe --zookeeper zoo1:2181 --topic test

# 修改某个Topic的信息
kafka-topics.sh --zookeeper zoo1:2181 --alter --topic test --partitions 3

# 删除某个Topic
kafka-topics.sh --zookeeper zoo1:2181 --delete --topic test

#生产者
## https://blog.csdn.net/qq_29116427/article/details/105912397
kafka-console-producer.sh --broker-list kaf1:9092 --topic test
kafka-console-producer.sh --broker-list kaf1:9092 --property parse.key=true --property key.separator=: --topic test

# 消费者
## 新版关联zk这种方式已经删除
kafka-console-consumer.sh --bootstrap-server kaf1:9092 --topic test --from-beginning

基本概念
参考链接:https://www.jianshu.com/p/a036405f989c

来自:网络资源

高级篇

基本原理

问题解决

高可用

kafka天然高可用。对每个topic设置分区,分散存储在集群的不同节点上,应对某个topic的高并发。同时每个分区设置备份,避免单点故障。每个分区选举主节点,应对读写请求。

数据一致性

数据丢失

服务集群:设置Topic有N大于1个副本

生产者:设置acks=all, retries=max,表示只有当所有节点数据都同步了就确定提交,否则不断尝试

消费者:每一个都会有自己的offset,表示当前消费的位置,当且仅当消费万一条消息,采取提交offset。(kafka会自动提交一组消息的offset)

数据重复、幂等性

原因:

  1. 生产者自己提交了重复消息
  2. kafka消费者有个offset,会隔一段时间同步到zookeeper。如果还没有同步消费者宕机了,重启后会拉取zookeeper中的offset,继续读取。

解决幂等性问题,根据业务场景实际处理,比如:数据库唯一索引、根据主键等约束先查询下。

数据有序性

原因:

  1. 生产者:高并发发送消息,自己把顺序搞乱掉。这种情况解决不了,一定要避免
  2. 消费者:N个实例M个线程一起消费,导致没有根据消息顺序进行消费

解决:

  1. 首先从业务场景考虑,到底要不要有序,大部分都不关心有序。
  2. N个实例,采用消费者数量小于N的方案对消息进行Key存入分区,这样一个消费者获取相同的Key消息是有序的;每个服务有M个线程进行消费,采用内存队列quene,对于消息再细分,存入不同的消费队列中,每个消费队列是有序的。

你可能感兴趣的:(03-02-02 kafka)