• MQ消息中间件分布式原理及常见问题


    消息队列

     

    为什么用?

    解耦,削峰,异步

    基本模型

    生产者  ->  MQ   ->  消费者

    Kafka 十万级/s  适用于大数据领域实时计算,日志采集,

     ActiveMQ /s ,  RabbitMQ /s ,  RocketMQ 十万/s  

    造成问题及解决

    1.系统可用性降低 (MQ发生故障,全崩了)

    2.MQ重复发送消息 重复消费问题 MQ丢消息问题  MQ发送消息顺序错乱

    3.不一致性,MQ给客户端显示执行成功,结果在服务器一端执行失败了,导致不一致

    MQ高可用问题:

    RabbitMQ 普通集群模式,一个机器,多个节点 消费者随机找到一个MQ节点消费,该进程会去找其他MQ节点的数据同步过来,返还给消费者。 集群内部存在大量数据传输。一旦其中一个节点挂了,数据就没了。

    RabbitMQ 镜像集群模式,每个节点的数据都会同步到其他全部节点,保证了每个节点都有全部数据,数据量过大同步困难

    Kafka高可用框架:

    同一数据存在不同机器上,每一份数据leader 都同步副本数据在一台机器上作为follower作为备份

    消息重复消费问题:

    Kafka重复消费问题:生产者生产的数据进入到kafka后都会为每一条数据标识一个offset值,消费者消费到该数据后,把offset值提交给zookeeper用来记录offset,再传回kafka证明消息已经消费完毕。

    如果消费者消费完准备提交offset,还未提交就挂了,重启后不再提交到zookeeper,导致kafka以为该消息还没消费,继续发送给消费者导致重复消费。

    解决办法:消费者程序做幂等性来保证

    消息丢失问题:

    Kafka  

    1.消费者到broker: 消费者把消息发送到broker主节点,并且同步到从节点后返回ack,消费者做try catch处理是否重复发送

    2.broker到消费者: 关闭kafka自动提交offset,改成手动提交offset,在代码中消费到数据并完完全全彻底处理完数据后才提交offset

    配置kafka四个参数

    参数1:topic的relacation必须大于1(必须有多个follower)

    参数2:min_insync.replicas必须大于1(必须至少有一个follower与自己保持联系)

    参数3:asKs=all 要求必须生产者的数据发送到leader,并且同步到全部follower才算一次发送成功

    参数4:retries=max 如果未同步到全部follower一直重试

     

    消费大量积压问题

    原因:一般是消费者挂掉导致大量消息积压在MQ

    解决:临时创建一个topic,多开几倍的partition。原来的消费者更改逻辑 消费到的数据发到新topic上,多开几个消费者同时消费新的topic。

     

    消费顺序出错问题

    原因;把应该保证顺序的多条消息分散发给多个消费者,再从多个消费者整合到一起导致消息顺序错乱。

    解决:把需要保证顺序的多条消息写入同一个消费者。

    Kafka中写入到一个partition中的数据一定是有顺序的。

     

     Kafka为啥这么快,性能这么高?

    1.顺序写入

    每个partation只能append追加,顺序IO写到磁盘而不是随机IO,避免了寻址时间

     

    2.sendfile零拷贝读取

    利用DMA技术从磁盘拷贝到内核缓冲区,内核缓冲区通过管道连接socket缓冲区,socket缓冲区拷贝到网卡上

     

    消息队列推拉模式

    Kafka RocketMQ 是推还是拉?

  • 相关阅读:
    documentFragment文档碎片
    OpenResty之resty.limit.count 模块介绍
    vue前端分页多条件搜索
    element ui Tree树形控件获取未全选父节点和子节点id
    如何使 pdf 文件在浏览器里面直接下载而不是打开
    关于本博客
    圆锥曲线基础知识点
    NOI2021游记
    20210716模拟赛
    计数+动态规划
  • 原文地址:https://www.cnblogs.com/ttaall/p/13189049.html
Copyright © 2020-2023  润新知