同步通信存在性能问题:
- 造成系统得开销、响应时间比较大。
- 在同步得过程中要保证每个服务都顺利完成,整个链路才会执行完。因为网络等其他问题,整个链路执行完得成功率回受到影响,导致用户体验较差。
异步通信得优势:
- 明显提高系统得吞吐量。
- 即使服务失败,也能通过分布式事务来保障最终是成功得。
针对于同步通信来说,异步通信得方式,可以让上游快速成功,极大得提高了吞吐量。而且在分布式系统中,通过下游多个服务得分布式事务得保障,也能保障事务执行得最终一致性。
二、kafka得基本知识Kafka是最初由linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展
(1) 安装 zookeeper 及配置
dataDir=D:\Program Files\zookeeper-3.6.3\tmp clientPort=2181 admin.serverPort=8090
(2)配置环境变量
ZOOKEEPER_HOME = D:Program Fileszookeeper-3.6.3 PATH=%ZOOKEEPER_HOME%bin
(3)启动 zookeeper, 打开命令提示符,输入
zkserver
(4)启动kafka 进入kafka安装目录,打开命令提示符输入
.binwindowskafka-server-start.bat .configserver.properties2、kafka基本概念
| 名称 | 解释 |
|---|---|
| Broker | 消息中间件处理节点,一个kafka节点就是一个Broker,一个或多个Broker可组成一个kafka集群 |
| Topic | kafka根据topic对消息进行归类,发布到kafka集群得每条消息都需要指定一个topic |
| Producer | 消息生产者,向Broker发送消息得客户端。 |
| Consumer | 消息消费者,从Broker读取消息得客户端。 |
创建topic
binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic "test"
查看topic
binwindowskafka-topics.bat --list --bootstrap-server localhost:90924、发送消息
把消息发送给broker中某个topic,打开kafka发送消息得客户端,然后开始向客户端发送消息。
binwindowskafka-console-producer.bat --broker-list localhost:9092 --topic test5、消费消息
消费broker中某个topic中得消息,打开kafka消费消息得客户端,然后在客户端中消费消息。
- 方式一:从当前主题中得最后一条消息得偏移量(offset)+1开始消费
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test
- 方式二:从当前主题第一条消息开始消费
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning6、关于消息得细节
- 生产者将消息发送给broker,broker会将消息保存在本地日志文件中
D:kafkakafka_2.12-2.8.0logstest-000000000000000000000.log
- 消息得保存是有序得,通过offset偏移量来描述消息得有序性。
- 消费者消费消息时也是通过offset偏移量来描述当前消费得那条消息得位置。
binwindowskafka-topics.bat --zookeeper localhost:2181 --delete --topic test三、单播消息与多播消息 1、单播消息
在一个kafka得topic中,启动两个消费者,一个生产者,生产者发送消息是否同时被两个消费者消费?
如果多个消费者在同一个消费组,只有一个消费者可以收到订阅得topic中得消息。换言之,同一个消费组中只能有一个消费者收到topic中得消息。
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic test2、多播消息
不同得消费者组订阅同一个topic,那么不同得消费者组中只有一个消费者收到消息。实际上也是多个消费者组中得多个消费者收到消息。
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup1 --topic test binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup2 --topic test3、查看消费组详细信息
# 查看当前主题下有哪些消费者组 binwindowskafka-consumer-groups --list --bootstrap-server localhost:9092 # 查看消费者组中具体信息:比如偏移量、最后一条消息得偏移量、堆积得消息数量 binwindowskafka-consumer-groups --bootstrap-server localhost:9092 --describe --group testGroup
重点关注得信息:
- current-offset:最后被消费得信息得偏移量。
- Log-end-offset:消费总量(最后一条消息得偏移量)
- Lag:积压了多少条消息
主题-topic在kafka中是一个逻辑概念,kafka通过topic将消息进行分类。不同得topic会被订阅该topic得消费者消费。
如果说topic中得消息非常非常多,多到需要几T来进行存储,因为消息是会被保存到 log 日志文件中得。为了解决这个问题,kafka提出了Partition(分区)得概念。
2、分区Partiton通过partition将一个topic中得消息分区存储。这样得好处有:
- 分区存储可以解决文件过大得问题
- 提高了读写得吞吐量:读和写可以同时在多个分区上进行
创建多分区主题
binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "test"3、kafka中消息日志文件保存得内容
-
00000.log: 这个文件中保存得就是消息
-
_consumer_offsets_49:
kafka内部自己创建了_consumer_offsets主题包含了50个分区。这个主题用来存放消费者消费某个主题得偏移量。因为每个消费者都会自己维护消费主题得偏移量,也就是说每个消费者会把消费主题得偏移量自主上报给kafka中默认的主题:consumer_offsets。因此kafka为了提升这个主题得并发性,默认设置了50个分区。
- 至于提交到哪个分区,通过hash函数:hash(consumerGroupId)%_consumer_offsets主题得分区数。
- 提交到该主题的内容是:key是consumerGroupId+topic+分区号,value就是当前offset得值。
-
文件中保存得消息,默认保存7天,7天后消息会被删除。
- 创建三个server.properties文件
# 0 1 2 broker.id=0 #9092 9093 9094 listeners=PLAINTEXT://192.168.111.1:9092 #logs logs1 logs2 log.dirs=D:kafkakafka_2.12-2.8.0logs
- 通过命令来启动三台broker
binwindowskafka-server-start.bat .configserver.properties binwindowskafka-server-start.bat .configserver1.properties binwindowskafka-server-start.bat .configserver2.properties
- 校验是否启动成功
进入到zk中查看/brokers/ids中是否有三个znode(0,1,2)
2、副本的概念在创建主题时,除了指明主题得分区数以外,还指明了副本数。
副本是为了主题中区分创建多个备份,多个副本在kafka集群的多个broker中,会有一个服务作为leader,其他是follower。
# 创建多副本 多分区的 topic binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic my-relicated-topic
# 查看副本以及分区信息 binwindowskafka-topics.bat --describe --zookeeper localhost:2181 --topic my-replicated-topic
- learder
kafka的写和读的操作,都发生在leader上。learder负责把数据同步给follower。当leader挂了,经过主从选举,从多个follower中选举产生新的leader。
- follower
接收leader的同步的数据。
- isr
可以同步和已同步的节点会被存入到isr集合中。这里有一个细节:如果isr中的节点性能较差,会被踢出isr集合。
broker、主题、分区、副本概念梳理:
集群中有多个broker,创建主题时可以指明主题有多个分区(把消息拆分到不同的分区中存储),可以为分区创建多个副本,不同的副本存放在不同的broker里。
3、关于kafka集群消费- 向集群发送消息
# 创建集群生产者 binwindowskafka-console-producer.bat --broker-list 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --topic my-relicated-topic
- 从集群中消费消息
# 创建集群消费者 binwindowskafka-console-consumer.bat --bootstrap-server 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --topic my-relicated-topic --from-beginning
- 指定消费者组消费
# 创建消费者组 binwindowskafka-console-consumer.bat --bootstrap-server 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --consumer-property group.id=testGroup1 --topic my-relicated-topic --from-beginning
- 分区中消费者组的消费细节
- 一个partition只能被消费者组中的一个消费者消费,目的是保证消费的顺序性,但是多个partition的多个消费者消费的总的顺序性是得不到保证的
- partition的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要多于partition的数量,否则多出来的消费者不会进行消费。
- 如果消费则挂了,那么会触发rebanlance机制,会让其他消费者来消费该分区。
icated-topic --from-beginning
- 分区中消费者组的消费细节 [外链图片转存中...(img-JCXFUjvJ-1634782051832)] - 一个partition只能被消费者组中的一个消费者消费,目的是保证消费的顺序性,但是多个partition的多个消费者消费的总的顺序性是得不到保证的 - partition的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要多于partition的数量,否则多出来的消费者不会进行消费。 - 如果消费则挂了,那么会触发rebanlance机制,会让其他消费者来消费该分区。



