
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
消息队列的应用随着互联网的不断发展而被越来越多的程序员掌握,我们今天就通过案例分析来简单了解一下,软件开发消息队列应用实践分析。
什么是消息队列
消息队列,我们一般会称为MQ(MessageQueue),也就是说消息队列的本质就是一个队列,而队列是一种先进先出的数据结构,提供消息传递和消息排队模型,可以在分布式环境下提供应用解耦、弹性伸缩、流量削峰、异步通信、数据同步、微服务之间通信等功能,作为分布式系统架构中的一个重要组件,有着举足轻重的地位
我们会将要传输的数据、消息放在消息队列中
其中,往MQ里放东西的叫做生产者
从MQ里面取消息的叫做消费者
为什么要用消息队列
解耦
现在有一个系统A,A可以产生一个UserId
然后有系统B和系统C都需要这个UserId去做相关的操作
这样就会有一个问题,每当出现改动的时候,我都要改动整个系统,比如B不需要A的消息了,那么就要改A、B,新来的一个D服务,需要用到A的消息,那么又需要修改,整个系统的冗余度很高
引入消息队列之后:系统A将id写到消息队列中,BC服务从消息队列中拿数据
系统A只负责写数据,不关心数据的消费、处理,而BC服务只负责拿数据,即使BC服务挂了,也和系统A没关系,只和消息队列有关,这样就能做到多个服务之间的解耦
异步
如果是同步的话,A必须要等待BCD处理完之后才能返回,整个时间比较久
如果是异步的话,A(比如注册服务)将消息写道消息队列之后就可以返回,之后再发给邮件服务和短信服务消费
限流、削峰
当请求来的时候,先把请求放在消息队列中,然后系统再根据自己能够处理的请求数去消息队列里面拿数据,这样即使每秒请求数很大,也不会把系统打崩
流量控制
消息队列通常有很多种方式来实现流量控制
1.配额控制:通过为每个生产者或者消费者分配配额,限制它们可以发送或者接受的消息数量。这可以保证消息队列中的资源不会被过度使用,并确保系统在高负载情况下的稳定性
2.窗口机制:当生产者将消息发送到消息队列的时候,消息队列会给每个生产和分配一个发送窗口,当消费者确认之后把对应的消息从窗口里面删除
3.缓冲区:消息队列把消息往缓冲区里丢,消费者从缓冲区里去取
4.速率限制:这个一般是在客户端实现的,可以实现生产者在每秒、每分钟生产多少条消息
如何保证消息不被重复消费
常见的消息队列都有确认机制(ACK机制),当消费者消费数据之后会给消息队列中间件发送一个确认消息,消息队列收到之后就会把这条消息从队列中删除。
当出现网络传输等故障,ACK没有传送到消息队列,导致消息队列不知道消费者已经消费过该消息了,再次将消息分发给其他的消费者
解决:
1.看场景,如果场景不需要幂等,那么可以不管,比如这条消息拿去插入数据库,重复插入主键相同的数据是会自动出错的,再比如做redis的set操作,也不需要管,多次set之后仍然是幂等的
2.准备三方介质做消费记录,比如加个redis,给消息分配一个全局id,只要消费过该消息就将