1.什么是MQ
2.为什么要使用MQ
3.MQ的分类和选择
4.RabbitMQ的基础概念
5.RabbitMQ的安装
1.什么是MQ
MQ(message queue),全名为消息队列,接下来我们从数据结构、操作系统和日常开发的角度来解释一下这个概念。
从数据结构的角度上来看:
MQ是一个队列,拥有先进先出特性的一种数据结构。
从操作系统的角度上来看:
操作系统上有一个概念,叫做管道通信。所谓管道,就是连接一个读线程和一个写线程,以实现它们之间的通信的一个共享文件。有了管道,就意味着两个线程可以一边写,一边读,既不用担心读写控制的问题,也可以避免写进程繁忙/读进程空闲或者写进程空闲/读进程繁忙造成的阻塞,使两个进程有一个很好的解耦。
从日常开发的角度上来看:
我们在日常开发的时候,经常会需要有排队、异步、限流等操作,有了mq以后,消息只需要发送给mq,不用依赖其它服务。
2.为什么要使用MQ
我们使用mq一般有三个目的:削峰填谷,应用解耦,异步处理,我们来挨个解释一下这三个概念。
2.1)削峰填谷
假设现在有一个电商系统,一秒钟能处理一万个请求,在正常的时间段,系统的消费能力完全可以消化。但是在秒杀/活动/热品的高峰时期,如果一瞬间有两万个请求,那么这个时候操作系统是处理不了的,现在有了MQ,我们就可以把所有的消息放在MQ里,然后让系统能消费的速度进行处理,就达到了流量的一个削峰。
在服务器使用高峰后,往往会有一段低谷,就把消费不过来的那一部分订单丢到系统使用低谷时期进行处理,这就是削峰填谷。
2.2)应用解耦
我们假设还是一个电商系统,其中会有支付,订单,库存,物流等系统,当用户下单时,上游系统挨个调用下游系统,但是任何一个子系统出现了故障,下单都会失败,用户体验不佳。当系统调用方式变为消息队列的时候,我们只需要把消息发送给其它系统,就算其它系统出了故障,也可以保证自己的系统成功,在故障恢复之后,因为消息还可以保存在mq当中,可以继续消费,中间用户感知不到某些系统的异常,提升系统可用性。
2.3)异步处理
比如我们现在有一个注册功能,有输入邀请码和不输入邀请码两个选项,如果输入邀请码,邀请者会获得奖励。此时,我们就可以让消息队列来进行完成,把奖励的逻辑放在队列的消费者里面,消息生产者只需要完成注册逻辑,再发送一条消息给队列,就可以大大减少逻辑的处理时间,无需阻塞。
3.MQ的分类和选择
3.1)ActiveMQ
优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息可靠性较
低的概率丢失数据
缺点:官方社区现在对 ActiveMQ 5.x 维护越来越少,高吞吐量场景较少使用。
3.2)Kafka
优点: 性能卓越,单机写入 TPS 约在百万条/秒,最大的优点,就是吞吐量高。时效性 ms 级可用性非常高,kafka 是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采用 Pull 方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方KafkaWeb 管理界面 Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;功能支持: 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
缺点:Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高现象,队列越多,load 越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢;
3.3)RocketMQ
优点:单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到 0 丢失,MQ 功能较为完善,还是分布式的,扩展性好,支持 10 亿级别的消息堆积,不会因为堆积导致性能下降,源码是 java 我们可以自己阅读源码,定制自己公司的 MQ
缺点:支持的客户端语言不多,目前是 java 及 c++,其中 c++不成熟;社区活跃度一般,没有在MQ核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码
3.4)RabbitMQ
优点:由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ 功能比较完备,健壮、稳定、易用、跨平台、支持多种语言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持 AJAX 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高
缺点:商业版需要收费,学习成本较高
我们采用最近比较火的RabbitMq作为切入点进行学习。
4.RabbitMQ的基础概念
RabbitMQ作为一款消息队列,拥有四大核心概念,我们做一个初步的讲解,后续会在实战中不断应用。
4.1)生产者
生产数据,往队列里面发信息的是生产者。
4.2)交换机
交换机在Rabbitmq中的作用是一个中转站的作用,一方面接受来自生产者的消息,一方面将消息推到队列中。交换机的任务非常重要,要把消息转发到哪几个队列中,什么时候推,都由交换机决定。
4.3)队列
队列是Rabbitmq的主体部分,主要用于存储消息,是一个消息的缓冲区。许多生产者可以发送消息到一个队列,一个队列也可以被多个消费者消费,使用相当自由。
4.4)消费者
从队列里面取消息进行消费的是消费者。
架构图:
Broker:用于接收和发送消息,是mq的核心
Connection:是生产者/消费者与rabbitMq之间的tcp链接。
Exchange:message发送到队列的第一个节点,有不同的分发规则。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout(multicast)
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
Queue:消息保存的地方,消息发送到这里准备让customer消费
Channel:服务器和客户端之间的连接,如果在大量生产者和消费者存在的时候,Connection的开销是巨大的。通常是由一个线程处理多个客户端的连接,Channel 作为轻量级的Connection 极大减少了操作系统建立 TCP connection 的开销 。
5.RabbitMQ的安装
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。