消息中间件的作用
一、消息中间件的作用如下:
实现支撑高并发、异步解耦、流量削峰、减低耦合度
1、支撑高并发
在高并发环境下,如果消息的处理速度跟不上消息的生成速度,就会导致消息队列囚堆积,进而影响系统的稳定性和可
用性。为了解决这个问题,引入消息限流策略是非常必要的。
消息限流是一种通过控制消息的生成速率和处理速率来平衡生产者和消费者之间的关系。通过设置合理的限流参数,可以
控制系统的负载,避免资源耗尽和系统崩溃的风险。
RabbitMQ与消息限流策略的结合
1、预取计数(prefetchcount):RabbitMQ中的预取计数可以控制消费者从队列中获取消息的数量。通过合理设置预取
计数,可以平衡生产者和消费者之间的速率差异。当消费者处理完预取的消息后,才会继续从队列中获取新的消息,这样
可以避免消息的堆积。
2、限制连接数和通道数:在RabbitMQ中,可以通过限制连接数和通道数来控制消息的生成速度和处理速度。通过限制连
接数,可以限制生产者的连接数,控制消息的生成速度;通过限制通道数,可以提高消费者的处理速度,避免系统负载过
高。
3、延迟队列(dead-letterqueue):延迟队列是一种特殊的队列,用于存放无法立即处理的消息。当消息到达延迟队列
后,可以设置一个延迟时间,在延迟时间过后再将消息重新发送给消费者进行处理。通过延迟队列,可以有效控制消息的
处理速率,尤其适用于对实时性要求不高的场景。
2、异步解耦
应用场景:一般用于用户注册后,需要发送注册邮件和注册短信
传统做法:
1.串行方式
串行的方式就是将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。
这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西。

2.并行方式
将注册信息写入数据库后,同时执行发送邮件,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理
的时间。

假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但
是,前面说过邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写
入数据库后就返回。
3.消息队列的方式
引入消息队列之后就可以异步处理发送注册邮件和注册短信的业务,在注册信息写入数据库之后,这些不妨碍用户使用的
业务,先加入到消息队列当中等待处理。

由此可见引入消息队列之后,响应时间=数据库写入时间+写入消息队列的时间,消息队列中的消息可以等待前面的消息处
理完再处理。
3、降低耦合度
应用场景:商城活动时,下单高峰时期,用户下单,订单业务模块调用库存业务模块的接口。

这种情况下,就会存在订单业务和库存业务高度耦合的问题,一旦我们的库存业务使用不了了,那我们的订单业务就无法使用了。引入消息队列就可以解决这一问题。

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。
就算苦笋系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
4、流量削峰
应用场景:流量削峰一般用于秒杀活动中。秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端假如消息队列。
作用:
1、可以控制活动人数,超过限制就会直接丢弃掉后来的订单
2、可以缓解短时间的高流量(超出服务器承受范围)压垮服务器

1、用户的请求,服务器收到之后,首先写入消息队列,假如消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面。
2、秒杀业务根据消息队列中的请求信息,再做后续处理。
二、消息队列优缺点
关于消息队列的有点也就是上面列举的,在特殊场景下有其对应的好处、解耦、异步、削峰。
缺点:
1、系统可用性降低:系统引入的外部依赖越多,越容易挂掉。本来是A系统调用BCD三个系统的接口就好了,ABCD 系统好好的,没啥问题,你加个MQ进来,万一MQ挂了,整个系统崩溃的,那不就完了吗?
2、系统复杂度提高:硬生生的加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?
3、一致性问题:A系统处理完了直接返回成功了,就以为这个请求就成功了;但存在的问题是,要是BCD三个系统,BD两个系统写库成功了,结果C系统写库失败了,数据就不一致了,咋办?

浙公网安备 33010602011771号