01.RabbitMQ基础
# 01.常见消息队列介绍
# 1.1 RabbitMQ
- RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。
- AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
- AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
# 1.2 Kafka(高性能)
- Kafka是Linkedln开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。
- Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。
- 0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
- kafka使用page cache进行文件存储,进而实现高性能读写。关注性能,可靠性关注不高
# 1.3 ActiveMQ(性能一般)
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且它一个完全支持JMS规范的消息中间件。
其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛!
MQ衡量指标:服务性能(一般,如果对并发要求不是特别大,可以考虑使用)、数据存储、集群架构
特点:
- 1、支持多种语 言编写客户端
- 2、对spring的支持,很容易和spring整合
- 3、支持多种传输协议:TCP,SSL,NIO,UDP等
- 4、支持AJAX
消息形式:
- 1、点对点(queue)
- 2、一对多(topic)
# 1.4 RockerMQ(收费)
RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目
它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点
RocketMQ思路起源于Kafka,它对消息的可靠传输及事务性做了优化
目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景
特点:
维护是一个痛点,需要专门的团队
可以保证消息顺序性
提供丰富的消息拉取和推送的模式
高效的水平扩展
多种架构模式可供选择:双Master,Msater-Slave,2m2s,多主多从
同步双写,异步复制,存储方式,零拷贝
分布式事务,主从自动切换
# 02.rabbitmq和kafka的区别
# 2.1 吞吐量:kafka吞吐量更高
- 1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率。
- 2)磁盘顺序读写,减少了寻道等待的时间。
- 3)批量处理机制,服务端批量存储,客户端主动批量pull数据,消息处理效率高。
- 4)存储具有O(1)的复杂度,读物因为分区和segment,是O(log(n))的复杂度。
- 5)分区机制,有助于提高吞吐量。
# 2.2 可靠性:rabbitmq可靠
- 1)确认机制(生产者和exchange,消费者和队列);
- 2)支持事务,但会造成阻塞;
- 3)委托(添加回调来处理发送失败的消息)和备份交换器(将发送失败的消息存下来后面再处理)机制;
# 2.3 高可用
1)RabbitMQ
- rabbitmq采用mirror queue,即主从模式,数据是异步同步的
- 当消息过来,主从全部写完后,回ack,这样保障了数据的一致性。
2)kafka
- 每个分区都可以有一个或多个副本,这些副本保存在不同的broker上
- broker信息存储在zookeeper上,当broker不可用会重新选举leader
- kafka支持同步负责消息和异步同步消息(有丢消息的可能)
- 生产者从zk获取leader信息,发消息给leader,follower从leader pull数据然后回ack给leader。
# 2.4.负责均衡
- 1)kafka
- kafka通过zk和分区机制实现:zk记录broker信息,生产者可以获取到并通过策略完成负载均衡;
- 通过分区,投递消息到不同分区,消费者通过服务组完成均衡消费。
- 2)需要外部支持
- keepalive+HA
# 03.RabbitMq与Redis队列
# 3.1 RabbitMQ与Redis作用
1.RabbitMQ:RabbitMQ是一个可以在不同程序间共享数据的代理,是实现AMQP(高级消息队列协议)的消息中间件的一种
2.Redis:是一个Key-Value的NoSQL数据库
# 3.2 具体对比
1.可靠消费
- Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
- RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费
2.可靠发布
Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器
3.高可用
- Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
- RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作
4.持久化
- Redis:将整个Redis实例持久化到磁盘
- RabbitMQ:队列,消息,都可以选择是否持久化
5.应用场景分析
- Redis:轻量级,高并发,延迟敏感即时数据分析、秒杀计数器、缓存等
- RabbitMQ:重量级,高并发,异步批量数据异步处理、并行任务串行化,高负载任务的负载均衡等行任务串行化,高负载任务的负载均衡等
编辑 (opens new window)
上次更新: 2024/3/13 15:35:10