- 关于 RabbitMQ -
出身:诞生于金融行业的消息队列
语言:Erlang
协议:AMQP(Advanced Message Queuing Protocol 高级消息队列协议)
关键词:内存队列,高可用,一条消息
队列结构
Producer/Consumer:生产者消费者
Exchange:交换器,可以理解为队列的路由逻辑,交换器主要有三种,图中是Direct交换器
Queue:队列
Binding:绑定关系,实际是交换器上映射队列的规则
发送和消费一条消息
- 消息产生 -
#消息发送方法
#messageBody 消息体
#exchangeName 交换器名称
#routingKey 路由键
publishMsg(messageBody,exchangeName,routingKey){
......
}
#消息发送
publishMsg("This is a warning log","exchange","log.warning");
- 消息消费 -
多种消息路由模式
- 消息的存储 -
消息投体时使用持久化投递模式 目标交换器是配置为持久化的 目标队列是配置为持久化的
当一条持久化消息发送到持久化的Exchange上时,RabbitMQ会在消息提交到日志文件后,才发送响应。 一旦这条消息被消费后,RabbitMQ会将会把日志中该条消息标记为等待垃圾收集,之后会从日志中清除。 如果出现故障,自动重建Exchange,Bindings和Queue,同时通过重播持久化日志来恢复消息。
- 消息投递模式 -
RabbitMQ RPC
RabbitMQ集群
允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 能过通过添加节点来线性扩展消息通信吞吐量
- 集群结构 -
队列元数据-队列名称和属性; 交换器元数据-交换器名称,类型和属性; 绑定元数据-路由信息。
存储成本-RabbitMQ作为内存队列,复制对存储空间的影响,毕竟内存是昂贵而有限的; 性能损耗-发布消息需要将消息复制到所有节点,特别是对于持久化队列而言,性能的影响会很大。
- 镜像队列 -
镜像队列架构
- 镜像队列原理 -
AMQPQueue:负责AMQP协议相关的消息处理,包括接收消息,投递消息,Confirm消息等 BackingQueue:提供AMQQueue调用的接口,完成消息的存储和持久化工作
Alpha:消息的内容和消息索引都在RAM中。(Q1,Q4) Beta:消息的内容保存在Disk上,消息索引保存在RAM中。(Q2,Q3) Gamma:消息的内容保存在Disk上,消息索引在DISK和RAM上都有。(Q2,Q3) Delta:消息内容和索引都在Disk上。(Delta)
- 流控 -
{credit_from,From}-该值表示还能向消息接收进程From发送多少条消息 {credit_to,To}-表示当前进程再接收多少条消息,就要向消息发送进程增加Credit数量 credit_blocked-表示当前进程被哪些进程block了,比如进程A向B发送消息,那么当A的进程字典中{credit_from,B}的值为0是,那么A的credit_blocked值为[B] credit_deferred-消息接收进程向消息发送进程增加Credit的消息列表,当进程被Block时会记录消息信息,Unblock后依次发送这些消息
- 总结 -
作者:Java 大蜗牛
来源:
https://sq.163yun.com/blog/article/229026816937607168