offer直通车(十)之消息中间件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013234928/article/details/89430897

消息中间件有很多种,如:ActiveMQ、RabbitMQ,Kafka,RocketMQ

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

笔者也只在项目中使用到了Kafka ,所以面试时也只总结了一下Kafka,本篇就主讲Kakfa了



1、kafka的特点

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统。

​ 具有以下特性:高吞吐、持久可靠、扩展性与容错性好

  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;
  • 可扩展性:kafka集群支持热扩展
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)

如果有日志采集功能,肯定是首选kafka了


扩展:

高吞吐原因:顺序读写、零拷贝、分区分配


2、kafka基本元素

  • topic: 主题,每个topic有多个分区,则需要对多个消费者做负载均衡,但请注意,相同的消费者组中不能有比分区更多的消费者,否则多出的消费者一直处于空等待,不会收到消息
  • producer: 生产者:发布消息的对象
  • consumenr: 消费者:订阅并处理消息的种子对象
  • broker: 代理:保存消息的服务器,一个Borker就是Kafka集群中的一个实例

3、文件存储机制

  • 每一个topic都有多个partition,多个partition,好处在于他对broker进行的分片,每个分片存储合理的消息数,提升了io性能

  • 每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始

  • 每个partition又分为多个段segment,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力

  • parition(分区)内的每条消息都有一个有序的id号(偏移offset);offset表示partiion的第多少message

segment file组成:

  • 由2大部分组成。分别为index file和data file,成对出现,

  • 后缀”.index”和“.log”分别表示为segment索引文件、数据文件

Kafka使用顺序写入磁盘,将数据顺序插入到文件末尾

消费者端通过控制偏移量来读取消息


4、消息发送方式

同步(sync)和异步(async):默认是同步方式,可通过producer.type属性进行配置

同步模式:生产者写一条消息的时候,它就立马发送到某个分区去
(a)生产者等待10S,如果broker没有给出ack响应,就认为失败。
(b)生产者重试3次,如果还没有响应,就报错。

在异步模式:先缓存一段时间再发送;时间和发送数量都可配置;

异步模式,还有4个配套的参数,如下:


Property Default Description
queue.buffering.max.ms 5000 异步模式时,producer缓存队列消息的时间(毫秒)。
queue.buffering.max.messages 10000 异步模式时,最大缓存的消息数量,超过则阻塞或者丢弃。
queue.enqueue.timeout.ms -1 如果设置为0,丢掉;-1,阻塞
batch.num.messages 200 异步模式时,每次批量发送的数量,达到才会发送

**消息发送的应答机制 **

request.required.acks

  • 0—不进行消息接收是否成功的确认;
  • 1—表示当Leader接收成功时确认;
  • -1—表示Leader和Follower都接收成功时确认;

5、消息分发策略

1、分区分配

范围分区轮询分区,随意分配

范围分区:Range 策略是对每个主题而言的,首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后将 partitions 的个数除于消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

轮询分区:轮询分区策略是把所有 partition 和所有 consumer 线程都列出来,然后按照hashcode 进行排序。按照hashcode排序通过轮询分配 partition 给消费线程

默认情况下, kafka 采用的是 hash 取模的分区算法。如果Key 为 null,则会随机分配一个分区。

kafka提供了2种策略来删除数据:基于时间删除和基于partition文件的大小删除。


2、重平衡

当消费者离开消费组(比如重启、宕机等)时,它所消费的分区会分配给其他分区。这种现象称为重平衡

reblance触发条件

1.当消费者group内部有新的消费者加入时。
2.当有消费者离开消费者group时
3.topic新增分区时
以上三种情况触发reblance策略,重新制定消费者消费分区。时;


6、数据丢失问题

生产者丢失场景:

  • 不进行消息接收确认情况下(acks=0),当网络异常、缓冲区满了等情况时,消息可能丢失;
  • 当Leader接收成功时确认(acks=1)、同步模式下,Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
  • 解决方案: ack配置(0:不确认;1:leader确认;-1:主从都确认)

消费者消息丢失的场景

  • 如果设置了自动提交,可能当消费者把消息取出来、并提交了offset后,还没来得及消费就挂掉了

解决方案:关闭自动提交


7、重复消费问题

底层根本原因:已经消费了数据,但是offset没提交

场景:

  • 强制kill线程,导致消费者的数据没有offset提交
  • 消费后的数据,当offset还没有提交时,partition就断开连接。比如:超过了Kafka的session timeout时间,导致重平衡

解决方案:

  • 关闭自动提交
  • 每次都判断消息是否重复消费过了

8、ZooKeeper和kafka关系

kafka使用ZooKeeper用于管理、协调代理。每个Kafka代理通过Zookeeper协调其他Kafka代理。

猜你喜欢

转载自blog.csdn.net/u013234928/article/details/89430897