消息中心
零拷贝技术
方式
-
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