1. Zookeeper对Kafka的作用是什么
- Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。
- Zookeeper主要用于在集群中不同节点之间进行通信。
- 在Kafka中,他被用于提交偏移量,因此,如果节点在任何情况下失败了,他都可以从之前提交的偏移量中获取。
- 除此之外,还执行其他活动:如 Leader检测、分布式同步、配置管理、感知节点变化等。
2. 什么确保了Kafka中服务器的负载平衡
由于领导者的角色是执行分区的所有读写请求任务,而追随者被动的复制领导者。因此,在领导者失败时,其中一个追随者接管了领导者的角色。基本上,整个过程可确保服务器的负载平衡。
3. Kafka为什么那么快
- Cache FileSystem Cache PageCache缓存
- 顺序写由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快
- Zero-copy 零拷贝技术减少拷贝次数
- Batching Of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。
- Pull 拉模式,使用拉模式进行消息的获取消费,与消费端处理能力相符。
4. 什么情况会导致Kafka运行变慢
- CPU性能瓶颈.
- 磁盘读写瓶颈.
- 网络瓶颈.
5. 在生产者中,何时发送QueueFullException?
在生产者中,QueueFullException的发送通常与Kafka生产者的内部缓冲队列的状态有关。这种异常主要发生在以下情况:
- 生产者发送速度过快
- 当生产者尝试将消息发送到Kafka主题时,如果其发送消息的速度超过了Kafka Broker处理消息的速度,那么生产者的内部缓冲队列可能会迅速填满。
- Kafka生产者有一个配置参数buffer.memory,用于设置生产者缓冲区的大小,默认值为32M。当生产者的待发送消息占用了所有缓冲区空间。并且没有足够的空间来容纳新的消息时,会触发QueueFullException.
- Kafka Broker处理能力不足
- 如果Kafka Broker处于高负载状态,处理消息的速度变慢,那么生产者的缓冲队列也可能因为消息积压而堆积,最终导致缓冲区满。
- 网络延迟
- 高网络延迟可能导致生产者无法及时将消息发送到Broker,从而加剧了缓冲区的堆积情况,最终触发QueueFullException。
6. RabbitMQ有哪些重要的组件
- ConnectionFactory(连接管理器):应用程序和Rabbit之间建立连接的管理器,程序代码中使用
- Channel (信道): 消息推送使用的通道
- Exchange(交换器) 用于接收、分配消息
- Queue(队列): 用于存储生产者的消息
- RoutingKey(路由键):用于把生产者的数据分配到交换器上
- BindingKey(绑定键):用于把交换器的消息绑定到队列上
7. RabbitMQ中vhost的作用是什么
vhost可以理解为虚拟的broker,其内部含有独立的queue、exchange和binding,但
最重要的是,其拥有独立的权限系统,可以做到vhost范围的用户控制。
当然,从RabbitMQ的全局角度,vhost可以作为不同权限隔离的手段。
8. RabbitMQ的消息是怎么发送的
首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,
客户端和Rabbit server之间会创建一个tcp连接,一旦tcp打开并通过了认证(认证就是发送给rabbit服务器的用户名和密码),客户端和RabbitMQ就会创建一条amqp通道, 信道是创建在【真实】tcp上的虚拟连接,amqp命令都是通过信道发送出去的。
9. RabbitMQ要保证消息持久化成功的条件有哪些
- 声明队列必须设置持久化durable为true
- 消息推送投递模式必须设置持久化,deliverymode设置为2(持久)
- 消息已经到达持久化交换器
- 消息已经到达持久化队列
以上四个条件都满足才能保证消息持久化成功
10. RabbitMQ持久化有什么缺点
持久化的缺点就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。可尽量使用ssd硬盘来缓解吞吐量的问题。
11. RabbitMQ有几种类型
三种广播模式:
- fanout:所有绑定到此exchange的queue都可以接收信息(纯广播,绑定到RabbitMQ的接受者都能收到信息)。
- direct: 通过routingKey和exchange决定的那个唯一的queue可以接收信息。
- topic:所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息。
12. RabbitMQ节点的类型有哪些
磁盘节点:消息会存储到磁盘
内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。
13. RabbitMQ每个节点是其他节点的完整拷贝吗?为什么?
不是,原因有两个
存储空间的考虑
:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据。性能的考虑
:如果每条消息都需要完整拷贝到每一个集群节点,那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能。
14. RabbitMQ对集群节点停止顺序有要求吗
RabbitMQ对集群的停止顺序是有要求的,应该先关闭内存节点,在关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。