消息中间件Kafka

流程图:

在这里插入图片描述

关键字解释:

  1. Kafka Cluster:由多个Kafka服务组成,每个kafka可以叫做一个broker,其中的一个broker会被选组为控制器(Kafka Controller)。
  2. Topic:topic顾名思义是主题的意思,我们会将不同的消息类型发往到不同的topic下。
  3. partition:分区,topic下的一个单位,topic的内部可以划分出多个partition用来分片存储我们的消息数据。用于存储海量数据,和提高并发能力。
bin/kafka‐topics.sh ‐‐create ‐‐zookeeper 127.0.0.1:2181 ‐‐replication‐factor 3 ‐‐partitions 2 ‐‐topic  my‐replicated‐topic

我们现在在kafka集群中创建一个名为my‐replicated‐topic的主题,其中有2个分区,3个副本。
在这里插入图片描述

  • 我们可以查询topic的情况,名为my‐replicated‐topic的topic下确实出现了两个partition分区分别我0和1
  • Replicas:表示但前的partition有三个副本,分别为位于broker0,broker1,broker2上。
  • Leader:表示当前的分区partition0的主节点为于broker1这个机器上。
  • Isr:表示当前存货的broker。如果我们现在将kafka集群中的broker1服务给关闭掉。那么只Isr就只有两个值为0,2。
    在多副本的情况下,只有Leader主的partition才提供读写的请求,followers从分区只负责同步数据,不提供读写,除非在leader挂掉进行重新选举之后才能提供读写能力。

produce生产者

生产者发送消息message到我们的topic主题当中去,同事也能指定发送到哪一个partition中。发送的具体方式根据自己的业务去进行判断。

Consumer消费者

consumer group消费组:一个消费组下可以有多个消费者,当消费组接收到消息message后,这条消息会由我们消费组中的一个消费者来进行消费。所以项目中如果由多个微服务需要监听这个消息执行业务的时候,我们一般会创建两个消费组来监听这个topic,从而分别执行自己的业务逻辑,一个消费组中可以有多个消费者用来提高我们微服务的消费能力。

消费者顺序问题

最简单的方式就是每个topic下只创建一个partition来进行接收消息,然后消费组中只创建一个消费者进行消费消息,那么他肯定就是有序的了,但是我们的消费的并发能力就会下降很多。

发送端 消息的持久化机制acks 及优化

ProducerConfig.ACKS_CONFIG acks等级

  • acks = 0 表示produce发送完消息后不需要等待broker确认消息的回复,就可以继续发送下一条消息,这种是性能最高的。会出现丢失消息的情况。
  • acks = 1默认值 表示produce发送完消息后leader已经将消息持久化到本地log文件,但是从节点未同步完成。网络抖动会出现丢失消息情况
  • acks = 0或all 表示主从节点已经将message持久化到本地log文件中,可以最大的保证消息的不丢失,但是会丢失性能。

ProducerConfig.RETRY_BACKOFF_MS_CONFIG 重复发送的时间间隔 默认值为100ms

  • 消息的重试机制,在发送失败后消息会重新进行发送,所以我们一般要做好消费的幂等性。

ProducerConfig.BUFFER_MEMORY_CONFIG 本地的缓冲区默认小大是32M

  • 配置了本地缓冲区,消息会先到达本地缓冲区,从而发送端提高性能

ProducerConfig.BATCH_SIZE_CONFIG 批量发送大小 默认值为16kb 设置值为0表示立即发送
ProducerConfig.LINGER_MS_CONFIG 批量发送间隔 默认值为0 可以设置为10ms

  • 我们可以设置批量发送的大小为32kb,当消息的大小到达32kb时就会批量发送这些消息,或者在消息大小没有到达32kb时,时间过了10ms这些消息也会批量被发送出去。主要是为了提高性能。

发送消息的模式中也有两种

  1. 同步发送:等待消息发送成功返回发送结果 producer.send(producerRecord).get();
  2. 异步回调发送 producer.send(producerRecord, new Callback() { }
  3. 同步阻塞主要就是因为.get()方法,send()方式本身就是异步发送的。

发送端 及优化

一个消费组中可以有多个消费者,但是该条message消息只会被其中的一个消费者进行消费。消费端会记录partition中的消费偏移量offset。用于知道消费到具体哪个位置。
当一个新的消费者启动时,是没有记录当前消费的偏移量offset的,但他只会去消费启动之后发送到该主题下的消息。
consumer也会不断的向broker发送心跳去保证自己的可用性,如果一直感知不到consumer的心跳就会被踢出该消费组。
consumer不仅可以根据offset来进行消费消息,也可以配置根据时间段来poll消费消息。
consumer在每次poll完消息后进行消费,在所有消息消费完成后会需要提交偏移量offset,我们也能配置同步提交或者是异步提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值