消息中间件RabbitMQ安装
消息队列概述
1.1 概念
MQ通常指的是消息队列(Message Queue),它是一种应用程序间的通信方法,用于实现异步消息传递和处理。是现代软件架构中不可或缺的组件,特别是在构建可扩展、高可用的分布式系统时。
OpenStack:里面有MQ, Swift Cinder Nuron
1.2 为什么使用
1.2.1应用解耦
场景:双11购物,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.
https://111.xxx.x.x:8899/kucun/getNum?
这种做法有一个缺点:
-
当库存系统出现故障时,订单就会失败
-
订单系统和库存系统高耦合
引入消息队列
订单系统: 用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。之前还需要等库存系统获取数据再返回给客户。
库存系统: 订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
1.2.3异步处理
场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1. 串行的方式 2. 并行的方式
串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.
并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间
假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回.
消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍
1.2.3.流量削峰
流量削峰一般在秒杀(电商 抢票 )活动中应用广泛
场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
消费券/
开发:验证码
假验证码
作用: 1.可以控制活动人数,超过此一定阀值的订单直接丢弃;
2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
2万用户下单;只能接受10万;场景:服务器会宕机。
所有的用户的都没有体验了,10万队列;一次获取资源。还有一部分,等待。可以给他信息,已经下单成功;
这样我们就可以采用队列的机制来处理,如同我们在超市结算一样,并不会一窝蜂一样涌入收银台,而是排队结算,一个接着一个的处理,不能插队,因为同时结算就只能达到这么多。
MQ介绍
2.1 常见产品
市面上比较火爆的几款MQ:
ActiveMQ,RocketMQ,Kafka,RabbitMQ。
语言的支持:ActiveMQ,RocketMQ只支持Java语言,Kafka可以支持多门语言,RabbitMQ支持多种语言。
效率方面:ActiveMQ,RocketMQ,Kafka效率都是毫秒级别,RabbitMQ是微秒级别的。
消息丢失,消息重复问题: RabbitMQ针对消息的持久化,和重复问题都有比较成熟的解决方案。
学习成本:RabbitMQ非常简单。
RabbitMQ是由Rabbit公司去研发和维护的,最终是在Pivotal,由Erlang语言开发(函数式、并发的编程语言)
RabbitMQ严格的遵循AMQP协议,高级消息队列协议,帮助我们在进程之间传递异步消息。
RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控制、负载均衡等特性,使得RabbitMQ拥有更加广泛的应用场景。RabbitMQ跟Erlang和AMQP有关。下面简单介绍一下Erlang和AMQP。
Erlang是一门动态类型的函数式编程语言,它也是一门解释型语言,由Erlang虚拟机解释执行。从语言模型上说,Erlang是基于Actor模型的实现。在Actor模型里面,万物皆Actor,每个Actor都封装着内部状态,Actor相互之间只能通过消息传递这一种方式来进行通信。对应到Erlang里,每个Actor对应着一个Erlang进程,进程之间通过消息传递进行通信。相比共享内存,进程间通过消息传递来通信带来的直接好处就是消除了直接的锁开销(不考虑Erlang虚拟机底层实现中的锁应用)。
AMQP(Advanced Message Queue Protocol)定义了一种消息系统规范。这个规范描述了在一个分布式的系统中各个子系统如何通过消息交互。而RabbitMQ则是AMQP的一种基于erlang的实现。AMQP将分布式系统中各个子系统隔离开来,子系统之间不再有依赖。子系统仅依赖于消息。子系统不关心消息的发送者,也不关心消息的接受者。
如果是业务场景可用rocketMQ与rabbitMQ,如果是大数据场景用kafka;至于rocketMQ与rabbitMQ中如何选择,根据技术栈来决定,如果是Erlang语言则尽量选用rabbitmq,如果是java语言,则选用rocketMQ。
如果消息的敏感性要求不高,允许少数据丢失,可以选择kafka;如果消息的敏感性要求高则不选用kafka;如果消息敏感度要求极高,则选择rocketMq,因为rocketMq具有消息查询的功能。
- 点赞
- 收藏
- 关注作者
评论(0)