赞
踩
总得来讲
高可用
Kafka的部署架构
图中,除了包含前面说到的生产者Producer、Kafka集群以及消费者Consumer三个角色之外,还包含了用于存储信息的注册中心-Zookeeper
1)生产者:用于发送消息的客户端
2)消费者:用于消费消息的客户端
消费者组:kafka的消费者角色,还有消费者组的概念,也就是说每个消费者组中可以包含多个consumer。其中,Kafka规
3)broker:即Kafka集群的一台机器,可包含多个Topic
broker集群:用于消息的存储、转发。负责接收从生产者发送来的消息并存储,供消费者来获取消息。定,消费者组中的消费者不能同时消费topic中的同一分区
4)Zookeeper:用于存储信息,因此在部署的过程中,Broker就需要配置Zookeeper的地址信息,并作为客户端与Zookeeper保持心跳
broker信息:各个broker的服务器信息和Topic信息
消费者信息:主要存储每个消费者消费的Topic的offset的值
需要注意的是,Kafka在0.9版本之前,Consumer默认将Offset保存在 Zookeeper 中,从0.9版本开始,Consumer默认将Offset 保存在Kafka一个内置的Topic(__consumer_offsets)中。
那么,为什么要这样做呢?这样消费者就不用每次去broker读消息之前,还要先去Zookeeper拿到自己当前消费的位置,再去broker进行继续读取,而是直接去broker去取这个offset值,然后消费即可。减少了一次通讯,性能也多少会有点改善~
5)Topic : 主题,可以理解为一个队列
6)Partation: 队列Topic的分区,一个Topic可以分为多个分区,用于高并发场景的负载功能;实际上Topic只是一个逻辑概念,真正存在的是分区。
分区将会平均分布在broker上,存在leader与follower两种角色,而生产者和消费者都是直接面向leader分区进行发送消息和获取消息,follower则会去leader中拉取消息,进行消息的备份,这样保证了一定的可靠性。假如leader节点所在的broker挂了,就会进行重新选举一个leader分区出来
RocketMq的部署架构
这个是rocketMq的集群架构图,里面也包含了四个主要部分:NameServer集群,Producer集群,Cosumer集群以及Broker集群
1)NameServer 担任路由消息的提供者。生产者或消费者能够通过NameServer查找各Topic相应的Broker IP列表分别进行发送消息和消费消息。nameServer由多个无状态的节点构成,节点之间无任何信息同步
broker会定期向NameServer以发送心跳包的方式,轮询向所有NameServer注册以下元数据信息:
也就是说,每个NameServer注册的信息都是一样的,而且是当前系统中的所有broker的元数据信息
2)Producer负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要
3)Broker,消息中转角色,负责存储消息、转发消息。在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备
4)Consumer负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。同时,与Kafka类似,RocketMq也同样有消费者组的概念
此外,RocketMq同样存在Broker、Topic以及Partation概念,且概念基本一致
总结
1、Kafka和RocketMq部署架构大致类似,均包含生产者、消费者、broker集群以及注册中心四个部分。
2、故障迁移不同
3、此外,broker集群部署方式上还有一些差别。
RocketMq 支持四种部署方式:
1)单Master:
2)多Master模式:
3)多Master多Slave模式,异步复制
4)多Master多Slave模式,同步双写
实际部署中,一般会根据业务场景的所需要的性能和消息可靠性等方面来选择后两种
RocketMq分别支持同步异步复制和同步异步刷盘两种机制的配置
1)同步异步复制
同步异步复制区别在于消息发送到master节点,是否会等待向slave节点复制结束再返回
a 同步复制:当生产者将消息发送到broker的master节点时,master会首先将消息复制到slave节点,等待复制动作完成之后,才会给客户端返回“发送成功”的响应,消息可靠性得到保证
b 异步复制:当生产者将消息发送到broker的master节点时,会直接返回一个发送成功的状态响应,并不会等待复制动作的结束,消息可靠性不够高,因为可能会出现网络抖动,导致复制不成功,消费者消费消息不及时的情况
2)同步异步刷盘
同步异步刷盘的区别在于,消息存储在内存(memory)中以后,是否会等待执行完刷盘动作再返回,即是否会等待将消息中的消息写入磁盘中
a 异步刷盘:在返回写成功状态时,消息可能只是被写入了内存,并不会等待消息从内存中写入磁盘就返回。所以写操作的返回快,吞吐量大;当内存里的消息量积累到一定程度时,统一触发写磁盘操作,快速写入
b 同步刷盘:在返回写成功状态时,消息已经被写入磁盘。具体流程是,消息写入内存之后,会立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态
实际生产中,该如何选择这两种机制的配置呢?权衡性能和可靠性两方面,建议使用异步刷盘,同步复制的形式进行配置,这样即使有一台机器出故障,仍然可以保证数据不丢
Kafka则只支持同步/异步复制,异步刷盘的机制
RocketMq的工作流程如下:
1)首先启动NameServer。
NameServer启动后监听端口,等待Broker、Producer以及Consumer连上来
2)启动Broker。
启动之后,会跟所有的NameServer建立并保持一个长连接,定时发送心跳包。心跳包中包含当前Broker信息(ip、port等)、Topic信息以及Borker与Topic的映射关系
3)创建Topic。
创建时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic
4)Producer发送消息。
启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic所在的Broker;然后从队列列表中轮询选择一个队列,与队列所在的Broker建立长连接,进行消息的发送
5)消息到达Broker的master节点。
当配置为同步复制时,master需要先将消息复制到slave节点,然后再返回“写成功状态”响应给生产者;当配置为同步刷盘时,则还需要将消息写入磁盘中,再返回“写成功状态”;要是配置的是异步刷盘和异步复制,则消息只要发送到master节点,就直接返回“写成功”状态
6)Consumer消费消息。
跟其中一台NameServer建立长连接,获取当前订阅的Topic存在哪些Broker上,然后直接跟Broker建立连接通道,进行消息的消费
Kafka与RocketMq基本类似,有两点不太一样的地方:发送过程和消息到达broker的处理
a 发送过程
生产者调用了Kafka发送消息的方法,并不会立即将消息发送到broker,而是会先将消息缓存到producer,缓存到一定大小之后,再统一发送到broker,这点也是Kafka性能比较高的一大原因
b 消息到达Broker的master节点
kafka使用异步刷盘,同步/异步复制,当消息到达Broker的master节点,便会立即返回“写成功”的状态给生产者客户端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。