消息队列

消息队列概述

组成

作用

应用场景:

  • 异步解耦
  • 削峰
  • 顺序保证
  • 缓冲

常见中间件

名字 特点
kafka 高吞吐、持久化、partition 有序,多broker 备份,写hash 保证多patition 有序,单机并发10w/s
nsq 内存,高吞吐,不保证顺序,没有备份机制
rocket MQ 并发w/s,支持事务,仅支持java
rabitMQ 并发w/s,支持事务,支持多语言,标准消息队列协议,通用性好
redis 高吞吐,没有组概念

生产者消息的可靠投递

组成

  • 生产者 P
  • 消费者 C
  • 消息队列 M
  • 消息确认服务 MC

过程

  • P submit MC ,消息prepare
  • C 内部业务持久化操作
  • C confirm MC , 消息撤销 /确认
  • Mc 轮询P ,与P check 确认

消费者消息的可靠接收

  • C 消费结果确认机制
  • Mc 轮询 C,与C 确认

kafka 文件存储原理:

partition 文件存储说明

  • 目录规则: topic+partitionid
  • 存储文件:segment file组成和物理结构。数据分段 segment
    • segment file组成:
      • index file:
        • 文件名是当前topic 消息的开始序列值。消费时,通过offset 二分查找文件,提高效率;
        • 索引文件内,a 相对偏移量、b 对应data 文件offset:
          • a相对偏移量=offset-文件索引初始值, 减小索引文件占用的空间;
          • a的值设置成稀疏索引的方式 ,减少空间占用
          • 然后通过mmap 直接读取message;
      • data file:数据文件
      • 2个文件一一对应
      • segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。
      • 文件元数据映射关系:
      • messge 结构

参考文章:
https://juejin.im/post/5d8882bdf265da03c9273821

WRITTEN BY:    陈贞

个人博客