销售平台网站建设方案,wordpress文章有模板下载,桂林论坛网app,时装网站的建设消息队列
在认识rabbitMQ之前#xff0c;我们需要先认识下消息队列。 消息队列#xff0c;一般简称为MQ#xff08;Message Queue#xff09;。先不管消息(Message)这个词#xff0c;先看看队列(Queue)。 队列就是一种先进先出的数据结构。 所以消息队列可以简单理解为我们需要先认识下消息队列。 消息队列一般简称为MQMessage Queue。先不管消息(Message)这个词先看看队列(Queue)。 队列就是一种先进先出的数据结构。 所以消息队列可以简单理解为把要传输的数据放在队列中。 科普 把数据放到消息队列叫做生产者
从消息队列里边取数据叫做消费者
为什么要用MQ
MQ可通过消息的收发使多个系统之间不局限于同步调用通过异步调用更好地实现解耦流量削峰等。下面是几个常见的应用场景帮助我们对MQ有一个简单的认识。 异步处理
引入MQ后通过异步处理将响应时间减少至原先的1/3 应用解耦
场景双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口 缺点 当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱^ ^)
订单系统和库存系统高耦合. 引入消息队列后 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
库存系统:订阅下单的消息,获取下单消息,进行库操作。就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了).
流量削峰
流量削峰一般在秒杀活动中应用广泛 场景:秒杀活动一般会因为流量过大导致应用挂掉。比如业务系统每秒只能处理1000个请求但是一下子来了5000个请求那系统就崩了。为了解决这个问题一般会将用户请求加入消息队列。 引入消息队列后 1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面. 2.秒杀业务根据消息队列中的请求信息再做后续处理。避免系统崩溃。 使用MQ要考虑什么问题
熟悉后端编程的同学都知道pythonjava都有自己的队列函数。比如python的Queue.LifoQueueQueue.PriorityQueue 。那为啥还要用RabbitMQ这种消息队列中间件呢 1.高可用
无论是我们使用消息队列来做解耦、异步还是削峰消息队列肯定不能是单机的。万一这台机器挂了那我们整个系统几乎就是不可用了。所以当我们项目中使用消息队列都是得集群/分布式的。要做集群/分布式就必然希望该消息队列能够提供现成的支持而不是自己写代码手动去实现。 2. 数据丢失问题
A系统将数据写到消息队列上系统B和C还没来得及取消息队列的数据就挂掉了。如果没有做任何的措施我们的数据就丢了。 3.消费者怎么得到消息队列的消息
两种方法 生产者将数据放到消息队列中消息队列有数据了主动叫消费者去拿(俗称push) 消费者不断去轮训消息队列看看有没有新的数据如果有就消费(俗称pull) 4.其他
除了这些我们在使用的时候还得考虑各种的问题 消息重复消费了怎么办啊
我想保证消息是绝对有顺序的怎么做
……..
基于这些问题市面上涌现了很多消息队列的中间件。这些MQ中间件几乎都解决了上面的问题但也存在差异。 常见的MQ产品
这里有一个简介 ActiveMQ基于JMSApache
RocketMQRocket火箭阿里巴巴的产品基于JMS目前由Apache维护
Kafka分布式消息系统亮点吞吐量超级高每秒中数十万的并发。
RabbitMQ由erlang语言开发基于AMQP协议在erlang语言特性的加持下RabbitMQ稳定性要比其他的MQ产品好一些而且erlang语言本身是面向高并发的编程的语言所以RabbitMQ速度也非常快。且它基于AMQP协议对分布式、微服务更友好。
科普 AMQP协议即Advanced Message Queuing Protocol是一个应用层标准高级消息队列协议提供统一消息服务。是应用层协议的一个开放标准为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息并不受客户端/中间件不同产品不同的开发语言等条件的限制。