美文网首页
消息队列选型和使用

消息队列选型和使用

作者: 隔壁小新 | 来源:发表于2022-11-08 21:44 被阅读0次

    1.消息队列的常用使用场景

    解耦,异步,消峰

    1.2 解耦

    1.2.1耦合情况下的系统

    当系统没有使用消息队列进行解耦时。


    系统调用图

    当A系统产生数据时候,需要调用这三个系统给他们发送数据。
    [图片上传中...(image.png-7ae0ee-1667719710998-0)]

    系统增加图

    当过段时间E系统也需要A系统的数据,这样A系统就要修改代码继续调用E系统的数据,

    image.png
    • 当过段时间D系统又不需要A系统的数据,这样A系统有需要修改代码来,取消A系统的调用接口。
    • 当A系统进行调用的时候,如果调用接口出现报错情况,还需要A系统进行各自的特殊处理。
    1.3 解耦
    解耦

    通过A系统发送数据给MQ,B、C、D、系统通过自行订阅A中的数据进行响应的操作即可,A不需要关注它的消息是被谁消费的,也不需要去考虑那个系统出现消费错误的情况下的另一些操作,它只需要关心发送数据进入MQ即可。这里使用的消息队列的中Pub\Sub模式

    2.异步

    2.1 同步情况
    image.png

    当A系统同步调用B、C、D、系统进行处理的时候,A系统的总调用时长为下面B、C、D系统加起来的总的时长。

    2.2 异步的情况
    image.png

    通过给三个队列中发送三条消息,之后直接返回,这样A接口的调用时长仅仅是A系统Sql执行时长,和插入三个队列消息的时长

    3.消峰

    3.1 项目未进行消峰操作的情况。
    未进行消峰的操作

    当一个时间端大量的请求涌入,当每秒的QPS到达了5000的峰值,每秒钟有5000个sql文件进行执行,这个时候会出现mysql宕机的情况,使服务器崩溃,当过了这个峰值后,就会回到正常情况。

    3.2项目进行了消峰处理

    消除峰值

    当请求进来的时候直接全部进入mq中,让请求积压在mq中,再让A系统每秒获取他最大访问的请求进行处理,实现了消峰的操作。

    2.使用mq后系统的缺点。

    • 系统的可用性降低


      image.png

    当系统中mq挂掉后,系统就会宕机,使得系统挂掉

    • 系统的复杂性增加
    image.png
    1. mq出现故障,导致系统挂掉
    2. mq发送了两条相同的数据,导致下面的系统消费后产生了两天一样的数据
    3. mq消费的服务挂掉了,导致消息进行了积压,没有服务进行消费导致服务挂掉
      4.插入mq中的数据顺序出现了错误,导致数据顺序改变,从而使消费的系统数据出现错乱的情况。
      5.系统一致性问题,本事使系统A、系统B,系统C、都执行成功才能返回个成功,但是系统AB都执行成功了,而系统C执行失败了,导致给用户返回的是成功,而系统的后台逻辑发生错误的情况。

    4.市面上的MQ对比







    6.面试题分析

    • 如何保证消息队列的高可用性

    rabbitmq保证高可用性的情况

    • rabbitmq的三种模式:1.单机、2.集群、3.镜像集群模式
    • 单机模式


    • 普通集群模式



      当启动了三台rabbitmq之后,当再中间的服务中创建了一个队列,当前的这个服务就会有rabbitmq的元数据和数据,而其他的服务只有他的元数据(当前队列的一些信息,包括队列在哪里放着);
      当一个消费之链接了右边的机器获取队列数据的时候,右边的机器就会与中间的机器进行通信,拉取中间queue中的数据返回给当前消费者
      缺点:如果中间的机器出现了宕机的情况,当前队列中的数据就会丢失。

    镜像集群模式


    镜像集群模式

    当写入一个数据的时候,每个机器都会同步当前数据的元数据和数据进行存储。
    当任何一个结点宕机了,其他的结点也会包含当前结点的其他完整信息,当其他结点宕机了,当前的消费者也会到其他的结点进行消费处理。
    因为不是分布式的,当一个数据特别大,大到一个服务存储不下的时候,这时候因为要同步,其他的结点也会因为同步不下,造成不可用。

    kafafa高可用性情况分析:




    image.png

    kafaka分布式情况解析:
    1.对每个机器都有一个partition,当插入三条数据的时候,三条数据会插入到不同的partiion中,


    高可用图

    当每次写入的时候leader会把数据同步到follower上去
    假设某一台机器出现了宕机,上面的leader就没有了,但此时follower还存在,此时kafka会自动感知的leader的死亡,会将其他的follower给选举出来作为leader。

    • 如何保证消息不被重复消费呢(如何保证消息消费时的幂等性)?


      如何保证消息不被重复消费图

    当消费者获取到数据153后,当消费已经完成,而未提交到kafka中,消费者就挂机了,当再一次链接后,kafka认为当前的当前数据153还为被消费,从而再次发送153的数据给消费者造成了数据二次消费的情况。

    • 幂等性的解释

    就是一个数据,或者一个请求,给你重复的来了多次,你得确保对应的数据不会改变的,不能出错

    消息重复消费情况解决,对消费的数据进行存储,消费前先去查询当前的数据是否已经被消费过,如果消费过了就抛弃,如果没有消费过,再进行消费操作,从而解决幂等性的问题
    还用一种解决方案:基于mysql中的唯一键处理,当数据插入的时候,也添加数据的id,当这条id已经存在的话插入就会报错。从而解决当前问题,重复的问题。
    如何保证消费的幂等性,需要结合一些业务场景的情况进行处理。

    • 如何保证消息的可靠性传输(如何处理丢失数据的情况)

    出现数据丢失的场景:rabbitmq:


    出现数据丢失的场景
    生产者丢失数据情况
    • 第一种方案实施


      image.png
    • 第二种方案实施


      confirm模式

    rabbitmq丢失数据情况方案:


    image.png

    消费者丢数据情况处理


    image.png
    image.png

    4.kafka数据丢了情况分析

    消费者丢失数据
    4.1kafka自己把数据搞丢了的情况
    kafka丢数据情况解析
    4.2 kafka生产者出现丢数据情况分析
    生产者出现丢数据情况分析
    5.如何保证数据的顺序性?
    情况图

    rabbitmq出现当前顺序性不同情况:


    rabbitmq顺序性

    rabbitmq顺序性解决方案


    image.png

    kafka出现数据不一致问题处理


    kafka顺序性问题
    kafka顺序问题

    相关文章

      网友评论

          本文标题:消息队列选型和使用

          本文链接:https://www.haomeiwen.com/subject/gkkvtdtx.html