一.什么是MQ?
概念: 消息队列(MQ):又叫消息中间件。(书面概念不再赘述),通俗讲可以理解为邮局和邮差,用来帮我们存储和转发消息的。
特点:1.是一个独立运行的服务,生产者发生消息,消费者接收消费,需要先跟服务器建立连接。
2.采用队列作为数据结构,有先进先出的特点
3.具有发布订阅的模型,消费者可以获取自己需要的消息。
二.面试常见问题
问题一:Java有许多队列的实现,可以解决消息消费的问题,为什么还需要消息中间件呢?(ps:这个问题可以类比有了HashMap,还要用Redis做缓存是一样的,)
队列不能跨进程,不能在分布式系统中使用,并且没有持久化机制等等。
问题二:我们为什么要在项目中使用消息中间件?
1.实现异步通信( ps:同步通信:发出请求,等待返回。异步通信:发出请求,直接返回,被调用者通过状态、通知来通知调用者处理。)
对数据量大或者处理耗时长的操作,可以使用MQ实现异步通信,减少客户端的等待,提升响应速度,优化客户体验。
2.实现系统解耦
对于改动影响较大的系统之间,引入MQ实现解耦,减少系统之间的直接依赖。提升可维护性和可扩展性。
以一个购物系统为例,使用传统的通信方式,订单系统发生退货时会依次调用下游系统。如下图一。但下游系统是并行关系。引入多线程也是可以实现的,但每一个需要并行执行的地方都引入线程,又会带来线程或者线程池的管理问题。引入消息队列后如图二。
3.实现流量削峰
MQ既然是队列就具备队列先进先出的特性,在系统一个特殊瞬间到达峰值时,可以把所有流量承接下来,达到保护应用和数据库的目的。比如天猫的双11,如果通过堆硬件的方式去解决,那么在流量峰值过去之后就会出现巨大的资源浪费。
4.实现广播通信
实现一对多通信