-
RabbitMQ -
RocketMQ 可靠消息 -
Kafka 分布式的,可实时快速处理大量数据 Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。
没有主从,通过zookepper 完成协调
- ActiveMQ
吞吐量较低
消息队列适合哪些场景
消息队列:它主要用来暂存生产者生产的消息,供后续其他消费者来消费。 它的功能主要有两个:a.暂存(存储)、b.队列(有序:先进先出)。
- 异步处理数据:允许用户把一个消息放入队列,但并不立即处理它
- 系统应用解耦:
- 业务流量削峰:
RabbitMQ
1. 应用
服务间异步通信,顺序消费,定时任务,请求削峰
2. 工作模式
- 简单模式:一个生产者一个消费者
- 工作模式work:一个生产者,多个消费者;
多个消费者同时监听同一个队列时会共同争抢当前消息队列的内容 - 订阅者模式:群发
- 路由模式routing:匹配对应关键字
- 主题模式topic:交换机个根据通配符模糊匹配对应队列,由队列的监听消费者接收消息消费
3 问题
消息如何路由?
消息提供方–> 路由 —>一个至多个队列消息发布到交换器时, 消息将有一个路由键,在消息创建时设定; 通过队列路由键,可把队列绑定到交换器上; 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行对应路由机制的匹配 fanout:交换器收到消息,将会广播到所有绑定队列 direct:路由键匹配,则把消息发送到相应队列 topic:可使用通配符模糊匹配
如何保证消息不被重复消费?(如何保证消息消费时的幂等性)
为什么会被重复消费?
正常来说消费者在消费完消息时,会发送一个确认消息给消息队列,队列得知该消息被消费就会将该消息从消息队列删除, 但有网络故障时,确认消息没有传到消息队列,导致消息队列不知道该消息已经被消费,会再次将该消息分发给其他的消费者
解决
保证消息的唯一性 在写入消息队列的数据做唯一标识,消息消费时,根据唯一标识判断是否消费过
例如有一个系统,消费一条消息后就往数据库插入一条数据,一个消息重复两次的话就会出错,应在插入数据库时根据唯一标识自己判断一下是否已经消费过,若消费过,直接丢掉,从而保证了数据的正确性
如何保证RabbitMQ消息的可靠传输?
消息
Kafka
实时快速处理大量数据 Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。
没有主从,通过zookepper 完成协调
问题
kafka中的broker 是干什么的?
broker 是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。
kafka中的 zookeeper 起到什么作用,可以不用zookeeper么
zookeeper 是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖, 但是broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活等等。
kafka 为什么那么快?
- 顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。
硬盘的每次读写都会 寻址–>写入 ,采用顺序读写极大的提升速度 Kafka的message 是不断追加到本地磁盘文件末尾的,而不是随机的写入 - Cache Filesystem Cache PageCache缓存
利用了操作系统本身的内存 通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。 - Zero-copy 零拷技术减少拷贝次数
允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据 - 分区,分段,索引
Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹 - Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。
- Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符
kafka producer如何优化打入速度
增加线程 提高 batch.size 增加更多 producer 实例 增加 partition 数 设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解; 跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
整体架构:
zookeeper :分布式协调服务,协调kafka应用 broker:kafka的节点 producer:生产者生产数据 consumer:消费者 consumer group:消费者组,组内的消费者默认是不能重复消费 topic:主题,是消息的归类 partition:分区 replicas:副本,数据冗余储存 segment:文件段,文件按照1G大小进行拆分,主要包括两个文件,.index索引和.log(如何查找,二分)
消费者语义
- exactly at once:精准消费一次,主要的是要保存好消费的偏移量,比如存储到redis或hbase中
- at least once:至少消费一次,重复消费
- at most once:至多消费一次,数据丢失
数据的不丢失
- broker:通过副本机制,保证数据的不丢失
- producer:ack机制
1)0:不管broker是否保存好数据,都一直发送数据 2)1:至少leader节点保证存储好数据 3)-1:leader和follower 都保存好数据,再发送下一条数据 - consumer:保存好offset
- flume整合kafka
关键点:设置好flume中的sink,到kafka
|