从零开始实现消息队列(一)

本文介绍了消息队列的核心概念,如生产者、消费者、中间者和队列,以及它们如何通过生产者发布、消费者订阅实现解耦和削峰填谷。作者还模拟了RabbitMQ风格,探讨了Broker中的虚拟机、交换机、队列和绑定等关键组件。
摘要由CSDN通过智能技术生成

.

在这里插入图片描述

什么是消息队列

相信大家都了解过阻塞队列和生产者消费者模型,而阻塞队列最大的用途,就是用于实现生产者消费者模型,生产者消费者模型有以下好处:

  1. 解耦合

解释:
当主机A给主机B发消息时,A给B发送请求,B给A返回响应,这样的场景中,A和B之间耦合性较高,但是如果在AB之间插入一个阻塞队列,在这种场景中,A发送的请求先存到阻塞队列中,B在接收来自A的请求的时候,取阻塞队列中取就行,就可以很好的解决AB之间的高耦合问题,避免了AB两个主机直接交互.

  1. 削峰填谷

当AB主机直接进行交互的时候,一旦用户访问量过高,可能主机A处理的业务比较轻松,因此不会出现太大的问题,但是主机B却承担着项目主要的工作,可能会因为业务过于超负荷,而导致主机B挂掉,而在有着阻塞队列的生产者消费者模型中,即使主机A接收了大量的用户请求,但是都会将其先放在阻塞队列中,主机B在这种情况下,依旧可以按照正常的状态进行工作.

在实际的后端开发中, 尤其是分布式系统里, 跨主机之间使用生产者消费者模型, 也是非常普遍的需求.因此, 我们通常会把阻塞队列, 封装成⼀个独立的服务器程序, 并且赋予其更丰富的功能.这样的程序我们就称为 消息队列 (Message Queue, MQ)
市面上成熟的消息队列有很多
• RabbitMQ
• Kafka
• RocketMQ
• ActiveMQ
今天,我们就仿照RabbitMQ,来模拟实现一个简单的消息队列

需求分析

核心概念

生产者(Producer)
消费者(Consumer)
中间者(Broker)阻塞队列
发布(Publish)生产者向中间者发送信息的过程
订阅(Subscribe)哪些消费者要从中间者这里获取数据,这个注册的过程就是订阅
消费(Consumer)消费者从中间者获取数据的动作

模型

由上述几个核心概念,构成了各种各样的生产者消费者模型,包括有一对一,一对多,多对多等
一个生产者,一个消费者

在这里插入图片描述
多个生产者,多个消费者
在这里插入图片描述
Broker是最核心的部分,负责消息的存储和转发
在Broker中,也是存在着以下几个概念
• 虚拟机 (VirtualHost): 类似于 MySQL 的 “database”, 是一个逻辑上的集合. 一个BrokerServer 上可以存在多个 VirtualHost.
• 交换机 (Exchange): 存在于VirtualHost,生产者把消息先发送到 VirtualHost的 Exchange 上. 再根据不同的规则, 把消息转发给不同的 Queue.
• 队列 (Queue): 真正用来存储消息的部分. 每个消费者决定自己从哪个 Queue 上读取消息.
• 绑定 (Binding): Exchange 和 Queue 之间的关联关系. Exchange 和 Queue 可以理解成 “多对多” 关系. 使用一个关联表就可以把这两个概念联系起来.
• 消息 (Message): 传递的内容.
这里的Exchange和Queue之间的关系可以类比生产者和消费者之间的关系
在这里插入图片描述
这些概念, 既需要在内存中存储, 也需要在硬盘上存储.
• 内存存储: 方便使用.
• 硬盘存储: 重启数据不丢失.

  • 37
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值