知识扫盲:消息队列

 消息队列核心使用场景:削峰,解耦,异步

 

 MQ的好处

削峰:

   比如抢购秒杀,不在这个点上的时候,可能每秒只有50次请求,但是开始秒杀的时候每秒的请求数可能可以达到上万次,如果这些操作直接落点在数据库上,

拿MYSQL来说,一般MYSQL一秒最多可以处理2000条请求,一秒上万的请求基本直接就把服务器给打死了。

  但是如果先将请求在消息队列中堆积起来,消息队列可能每秒进来10000条数据,但是只能处理2000条,那么在高峰时可能在消息队列中会堆积几万条请求,

但是这是可以接受的,一旦秒杀结束,服务器还在以每秒2000条请求的速度慢慢处理。

解耦:

   服务器A如果需要将请求委托给BCD,如果不采用消息队列,就要将调用代码写在服务器A中,这样耦合是非常恐怖的,并且如果B服务器在处理时出错了或挂掉了

怎么办呢?再或者说此时又有一台服务器E需要调用A的这些数据呢?A是没办法解决这些问题的。

  如果使用消息队列,A只需要将关键的信息放到消息队列中,BCD甚至E自行去队列中消费就行了,A只负责提供信息,不在乎谁使用了数据,也不在乎谁在使用

中出现了问题。

异步:

  如果客户端直接请求服务器A,然后服务器需要将部分业务委托给服务器BCD,此时如果A接收请求需要5ms,BCD服务器分别需要300ms,450ms,350ms,

这样全部处理完后需要1秒的时候用户才能得到反馈。这样用户肯定时接受不了的。

  但是如果采用消息队列,服务器A可以将信息放在队列中,这个过只需要3ms,BCD再分别去队列中削峰。这样整个过程只需要5ms+3ms,用户得到反馈的时间

大大的缩短了

 

最后再说说引入了消息队列后的问题:

系统可用性降低:系统依赖的越多,越不稳定,就比如A在分发请求关联BCDE时,是以消息队列为媒介的,如果消息队列本身挂掉了,就完了。

系统复杂度提高:代码在处理数据时肯定时更加的复杂了

数据的一致性:BCD处理信息时,如果D挂掉了,那么BC是否需要回滚刚刚的数据?

posted @ 2020-01-14 15:25  无弦琴  阅读(184)  评论(0编辑  收藏  举报