java每日5问(第45天)

为什么要用 MQ?

1、解耦:如果多个模块或者系统中,互相调用很复杂,维护起来比较麻烦,但是这个调用又不是同步调用,就可以运用 MQ 到这个业务中。
2、异步:这个很好理解,比如用户的操作日志的维护,可以不用同步处理,节约响应时间。
3、削峰:在高峰期的时候,系统每秒的请求量达到 5000,那么调用 MySQL 的请求也是
5000,一般情况下 MySQL 的请求大概在 2000 左右,那么在高峰期的时候,数据库就被打垮了,那系统就不可用了。此时引入 MQ,在系统 A 前面加个 MQ,用户请求先到 MQ, 系统 A 从 MQ 中每秒消费 2000 条数据,这样就把本来 5000 的请求变为 MySQL 可以接受的请求数量了,可以保证系统不挂掉,可以继续提供服务。MQ 里的数据可以慢慢的把它消费掉。

使用 MQ 会有什么问题?

(1)降低了系统可用性 (2)增加了系统的复杂性

怎么保证 MQ 的高可用?

RabbitMQ 是比较有代表性的,因为是基于主从做高可用性的。以他为例,自行查阅以下模式。
rabbitmq 有三种模式:单机模式、普通集群模式、镜像集群模式。

MQ 的优缺点?

在特殊场景下有其对应的好处,解耦、异步、削峰。 缺点有以下几个:
系统可用性降低
系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩溃,你不就完了?
系统复杂度提高
硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?问题一大堆。
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

猜你喜欢

转载自blog.csdn.net/qq_39899164/article/details/107733576