角色
topic:每一类的消息为一个主题
partition:一个topic可以分多个partition
producer:发布消息 主题生产者
consumer:订阅消息 主题消费者
broker :服务区
kafka
1.什么是kafka
kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,主要用于处理流式数据.
2.kafka的作用
缓冲和削峰: 当数据高并发时kafka可以在中间起到一个缓冲作用,把消息暂存在kafka中,服务器可以慢慢处理
解耦和扩展性: 当不确定具体需求,消息队列可以作为一个接口层,解耦重要的业务流程.只要遵守约定,针对数据变成即可获取扩展能力.
冗余: 可以采用一对多的方式,一个生产者发送消息,可以被多个订阅的topic的服务消费到,供多个毫无关系的业务使用.
健壮性: 消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行
异步通信: 处理一些不是必要的数据,缩减用户请求响应时间
3.kafka中的特性?
1.高吞吐量,低延迟,每个topic可以分多个partition,consumer group 对 partition进行consume操作
2.可扩展性: kafka集群支持热扩展
3持久性,可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
4.容错性:允许集群中节点失败
5.高并发
6.支持实时在线处理和离线处理
4.kafka如何保证消息有序
kafka在发送消息的时候可以指定partition,那么所有的消息都是发往同一个partition,就是有序的
5.kafka如何保证数据不丢失
同步模式下:ack确认机制设置为-1 在发送消息时,需要leader向fllow同步数据完成后,也就时ISR队列中所有的broker全部保存完这条消息后才会像ack发送完成信息
异步模式下:为防止缓冲区慢,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态
6.kafka如何保证数据的不重复消费
消息可以使用唯一id,消费过后可以把主键存储到redis中,先查询是否纯在,存在则不处理
RabbitMQ
角色
nameServer 注册中心
broker 存放消息
producer 生产消息
consumer 消费消息
topic:每一类的消息为一个主题
执行流程
broder在启动的时候会像nameserver注册中心组测并定时发送心跳
producer在启动的时候会到nameserver上拉取topic所属的broker具体地址,然后像broker上发送消息
1.rabbitmq的作用
异步 削峰 解耦
2.rabbitmq的使用场景
1.服务间异步通讯
2.拥有持久化的机制,进程消息,队列中的信息也可以保存下来.
3.实现消费者和生产者之间的解耦
4.对于高并发场景下利用消息队列可以使得同步访问变为串行访问达到一定量的限流
5.异步通信: 处理一些不是必要的数据,缩减用户请求响应时间
3.RabbitMQ如何保证消息的不重复消费
1.在消息生产时MQ内部每条生产者发送的消息生成一个inner-masg-id,作为去重的依据,避免重复的消息进入队列
2.在消息消费时,要求消息中必须有bizid作为去重的依据,避免一条消息被重复消费
4.RabbitMQ如何保证消息不丢失
丢失分为:生产者丢失,消费者丢失,消息队列数据丢失
生产者丢失:
RabbitMQ提供transaction和confirm模式来确保生产者不丢失消息
transaction机制就是开启事务,出现异常就回滚
config模式用的居多:每条消息都被指派唯一的id,如果消息出现异常则会收到nack消息,之后可以重试
消息队列丢失数据:
开启磁盘持久化配置,在发送消息前数据存储到磁盘中,当发送消息返回失败时重新发送
设置持久化
1:将query的持久化标志durable设置为true,则代表一个持久的队列
2.发送消息的时候将delieveryMode设置为2
这样设置即使MQ挂了也能恢复数据
消费者丢失消息:设置为手动回复确认消息
4.RabbitMQ的缺点
1.系统可用性降低
2.系统复杂性提高
3.一致性问题
单个消费者来出路对应的单个queue是不会出现消息错乱的问题
5.RabbitMQ的顺序性
单个消费者来出路对应 的单个queue是不会出现消息错乱的问题
6.RabbitMQ的执行流程
1.注册中心启动,等待Broker,Producer,Consumen连接上报
2.broker启动和所有的注册中心建立长连接,定时发送心跳,心跳信息中包含自己的ip端口,topic信息
3.peoducer发送消息,先跟一台注册中心建立连接,询问topic要发送到哪个borler上,然后和broker建立连接获取消息
4.Consumer获取消息,先向注册中心询问自己监听的哪个topic在哪个borler上然后和broker建立连接获取消息
Kafka和Raa和RabbitMQ的区别
对比项 | kafka | MQ |
是否支持topic的优先级 | 不支持 | 支持 |
是否支持消息全局有序 | 不支持 | 支持 |
是否内置监控 | 无 | 有 |
是否支持多个生产者 | 一个topic支持多个生产者 | |
是否支持多个消费者 | 一个topic支持多个消费者 | |
是否支持消息追踪 | 不支持 | 支持 |
是否支持消费者推模式 | 不支持 | 支持 |
是否支持消费者拉模式 | 支持 | 支持 |
是否支持消息分区有序 | 支持 | 支持 |
是否支持加密 | 支持 | 支持 |
是否支持广播消息 | 支持 | 支持 |
是否支持消息回溯 | 支持 | 不支持 |
是否支持消息持久化 | 支持 | 支持 |
是否支持消息堆积 | 支持,并批量持久化到磁盘 | 支持,无法较大的堆积消息 |
是否支持事务行消息 | 支持 | 不支持 |
元数据管理 | 通过zookeeper进行管理 | 支持消息数据持久 |
默认服务端口 | 9092 | 5672 |
默认服务端口 | 9000 | 15672 |
网络开销 | 相对较小 | 相对较大 |
内存消耗 | 相对较小 | 相对较大 |
cpu小号 | 相对较大 | 相对较小 |
实际场景选择
1.在实际应用场景中MQ具有较高的严谨性少数据丢失的可能性较小,Kafka的优势主要体现在吞吐量上,虽然可以通过策略不丢失,但从严谨角度来讲,不如MQ