消息队列简介
消息队列中间件是分布式系统中重要的组件。主要解决应用解耦,异步消息,流量削峰,消息通讯等问题,实现高性能,高可用,可伸缩和最终一致性架构。
目前使用较多的是ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
为什么使用消息队列
由于在高并发环境下,由于来不及处理,往往会发生请求堵塞,比如,大量的insert,update语句到达MySQL,直接导致无数的行级锁表,甚至最后请求过多,导致too many connections错误,使用消息队列,可以异步处理,从而缓解系统压力。
消息队列的使用场景
- 异步消息
场景:用户注册完成后,发送注册邮件和注册短信
运用消息队列之后,用户注册完之后,注册信息写入数据库,再写入消息队列,发送邮件和发送短信各自去消息队列进行读取,节省时间,提高效率。 - 应用解耦
场景:用户下单后,订单系统需要通知库存系统修改库存
订单系统:用户下单后,将信息写入消息队列,返回用户下单成功。
库存系统:订阅下单的消息,从消息队列获取下单信息,进行库存修改。
这样,如果库存系统不能正常使用,也不影响用户下单,用户下单后,只用把下单信息写入消息队列,不用关心后续操作,实现了订单系统和库存系统的解耦。 - 流量削峰
一般在秒杀或者团购活动中使用。
场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。针对这个问题,一般需要在应用前端加入消息队列。
a.可以控制活动的人数
b.可以缓解短时间内高流量压垮应用
用户的请求,服务器接收后,首先写入消息队列,如果消息队列的数量大于最大的数量,则直接抛弃用户请求或者跳转错误页面。
消息队列的两种模式
消息队列有两种通讯模式:点对点模式和发布订阅模式。
消息队列一般都内置了高效的通讯机制,因此可以用在纯的消息通讯,比如实现点对点消息队列或者聊天室等。
1.点对点模式
场景:客户端A和客户端B使用同一队列,进行消息通讯,客户端A发布消息,客户端B接收消息。
点对点模式包含三个角色:
消息队列,发送者,接收者
发送者发送消息到消息队列中,接收者从消息队列中取出消息进行接收,消息接收后,消息队列中将不再存储该消息,其他接收者不可能再接收到这条消息。
特点:
- 每个消息只有一个接收者
- 发送者和接收者之间没有依赖性,发送者发送消息后,消息直接存储在消息队列中,接收者是否在线并不影响发送。
- 接收者成功接收消息之后,需要向消息队列应答成功,以便消息队列删除该条消息。
2.发布订阅模式
场景:客户端A,客户端B,客户端N等订阅同一主题,进行消息发布和接收。
点对点模式包含三个角色:
角色主题(topic),发布者(publisher),订阅者(subscriber)
发送者将消息发送到topic,系统将这些消息传递给多个订阅者。
特点:
- 每个消息可以有多个订阅者
- 发布者和订阅者之间有时间上的依赖性。针对某个主题的订阅者,它必须创建一个订阅者之后,才可以接收发布者发布的消息。
- 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行。