消息中间件-很能打-对打面试官没输过

消息中心

零拷贝技术

方式

  • MMAP零拷贝

    • mmap函数做内存映射
  • sendfile零拷贝

    • transferTo函数做文件读取缓冲区与套接字缓冲区间共享

原理

  • 读取文件

    • 数据从磁盘DMA拷贝至内核态,文件读取缓冲区,CPU拷贝至用户态,应用缓存区
  • 写入文件

    • 数据从CPU拷贝,至套接字发送缓冲区,DMA拷贝至网卡

选型

RabbitMQ

  • 架构设计

    • Broker

    • Exchange

      • Direct

        • 直接匹配,Exchange名称+RountingKey
      • Fanout

        • 广播订阅,消费者队列绑定到该路由便收到消息,覆盖RountingKey
      • Topic

        • 绑定该路由器,且RountingKey 通用符匹配才收消息
      • Header

        • 发布者定义一个或多个键值对消息头,消费者定义键值对请求头(如:x-match=all或x-match=any)
      • 默认规则

        • 空字符串的exchange,系统会使用“amq.direct”这个exchange。新建的queue,默认绑定同名RountingKey到exchange
    • Queue

    • Binding

    • Vhost

    • Producer

    • Consumer

    • Channel

  • AMQP的实现

  • 事务

    • 发送方事务

      • 开启事务,发送多条,事务提交和回滚原子性,要么都提交,要么都回滚

        • ConfirmCallback

          • 消息到Exchange
    • 消费方事务

      • rabbitmq消费触发queue的一系列操作,消费方手动ack最终由事务提交和回滚决定

        • ReturnCallback

          • exchange到队列,除非写错代码
    • 事务与确认

      • 单事件为确认,多事件为事务

        • 确认模式

          • AcknowledgeMode.NONE
          • AcknowledgeMode.AUTO
          • AcknowledgeMode.MANUAL
        • 手动调用结果

          • Basic.Ack

          • Basic.Nack

          • Basic.Reject

            • 是否进入死信队列
  • 死信队列 DLX

    • 造成死信的原因

      • 信息被拒绝
      • 信息超时
      • 超过了队列最大长度
    • 过期机制(过期进入死信)

      • 队列设置过期

        • x-message-ttl 队列申明时设置
      • 单条消息设置过期

        • expiration 设置消息属性
      • 两者都有取其小

    • 以死信队列实现延迟队列

      • 为普通队列设置过期时间,设置DLX,为DLX关联一个死信队列。

Kafka

  • 零拷贝

    • sendfile
  • Rebanlance机制

    • 策略

      • Range
      • RoundRobin
      • Sticky
    • 时机

      • 组成员个数变化
      • 订阅topic个数变化
      • topic分区数变化
  • 消息丢失场景

    • 生产者在生产过程中的消息丢失

      • ack=0
    • broker故障后消息丢失

      • ack=1
    • 消费者消费中丢失

      • ack=-1
  • offset机制

    • at-most-once
    • at-least-once
    • exact-once

RocketMQ

  • 零拷贝

    • MMAP
  • 架构设计

    • topic

      • 消费主体
    • broker

      • topic的服务器
    • messageQueue

      • 一个topic对应多个messageQueue
    • commitlog

      • 消息主体以及元数据的存储主体
    • consumerQueue

      • 存储的是消息在commitlog中的offset以及tagcode
      • 定长结构,1条记录20个字节,8位代表消费的offset偏移量,size代表消息大小,messageTag HashCode用在tag过滤,用8个bit存储,
    • indexFile

      • 类hash的索引结构,方便基于messageId获取消息
      • 内部结构使用slot,Table+indexLinkedList,可以理解成HashMap,slot总数500万个
    • consumGroup

      • 消费方的逻辑组概念
    • Consumer

      • 一个具体的消费者
  • 设计原理

    • Producer 通过nameServe查询获取topic列表,并保存本地副本集,更新路由信息,并与name svr保持心跳
    • producer确定topic对应的broker位置,顺序写入其commitlog,采用专门的线程将offset转发给consumerQueue,
  • 发送模式

    • 同步发送
    • 消息发送至broker阻塞
    • 异步发送,消息发送至broker,提供回调函数
  • 消费模式

    • 短轮询

      • consumer控,主动拉取,周期不和设定,存在空拉取
    • 长轮询

      • 发起请求,broker可挂起,阻止consumer短期再发起请求,ReputMessageService检测consumerQueue,有消息则返回
  • 功能

    • 延迟队列
    • 死信消息
  • 数据分片机制

    • MessageQueue

消息去重

消费端MVCC

数据库加锁

redis bloomfilter

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值