基于RabbitMQ的模拟消息队列需求文档

文章目录

一、项目背景

什么是消息队列?

消息队列就是,基于阻塞队列,封装成一个独立的服务器程序,实现跨主机使用生产者-消费者模型。生产者生产消息到消息队列,消费者从消息队列消费数据。

二、需求分析

1.核心概念

  • 生产者(Producer):生产消息的客户端
  • 消费者 (Consumer) :消费消息的客户端
  • 中间人 (Broker):消息队列服务器
  • 发布 (Publish):生产者发送消息给中间人
  • 订阅 (Subscribe) :要消费消息的消费者
  • 消费 (Consume):消费者从中间人读取消息

Producer Client:生产者客户端

Broker Server:消息队列服务器

Consumer Client:消费者客户端

Publish Message:生产消息

Subscribe Messge:订阅消息

2.BrokerServer核心组件

  • 虚拟主机(VirtualHost):类似于MySQL的dataBase,用来区分不同组的业务。
  • 交换机(Exchange):生产者发送消息给BrokerServer,实际上是给某个交换机发送消息,交换机再把消息转发给队列。
  • 队列(Queue):存储消息
  • 绑定(Binding):交换机和队列之间的绑定关系(多对多)
  • 消息(Message):传递的内容

3.核心API

  • 创建交换机(exchangeDeclare)
  • 删除交换机(exchangeDelete)
  • 创建队列(queueDeclare)
  • 删除队列(queueDelete)
  • 创建绑定(queueBind)
  • 删除绑定(queueUnbind)
  • 发布消息(basicPublish)
  • 订阅消息(basicConsume)

注意,消费者得到服务器中的消息有两种方式:

一种是消费者主动从服务器中取。

一种是服务器推送消息给消费者。这里的订阅消息,只支持服务器推送消息给消费者。

  • 确认消息(basicAck)

消费者主动告诉消息队列已经收到消息了。(成功确认)

4.交换机类型

  • 直接交换机 (Direct Exchange)
    根据队列名查找队列,如果存在,转发消息;不存在,就把消息丢弃。
  • 扇出交换机(Fanout Exchange)
    转发消息至该交换机绑定的所有队列。
  • 主题交换机(Topic Exchange)
    交换机和队列绑定的时候,绑定关系中带有一个bindingKey(上联)。发送消息的时候,消息带有一个routingKey(下联)。在该交换机绑定的所有队列中查找,如果routingKey和bindingKey对上的话,就转发给该队列。没有,就丢弃消息。

5.持久化

当服务器重启后,内存的数据都会丢失。这个时候,需要通过持久化来保证数据不丢失。通过将数据保存到硬盘上来实现持久化。

  • 交换机、队列、绑定通过数据库来管理
  • 消息通过二进制的格式保存到文件中,重启后,从文件中读取数据到内存。
    (序列化/反序列化)

6.网络通信

生产者和消费者都是客户端,需要通过网络与服务器进行交互。这里的通信协议是基于TCP的自定义应用层协议。

在网络通信过程中,客户端要提供对应API,通过调用这个API来远程调用服务器的API,实现对服务器的操作。

客户端这边除了对应服务器的方法外,还需要实现其他的方法。

  • 创建Connection(newConnection)
  • 销毁Connection(close)

一个Connetion对象视作一次TCP连接。

  • 创建Channel (createChannel)
  • 销毁Channel(close)

Channel是一次逻辑上的连接。一个Connection里包含多个Channel。连接/断开TCP的成本太高。但是客户端和服务器的交互业务很多,所以通过多个Channel,传输不同的数据(channel之间互不相干),达到复用TCP的效果。

7.消息应答

  • 服务器推送消息给消费者的时候,自动确认。
  • 消费者手动调用basicAck这个方法。

三、消息队列模块划分

相关推荐
三木水5 小时前
Spring-rabbit使用实战七
java·分布式·后端·spring·消息队列·java-rabbitmq·java-activemq
AKAMAI6 小时前
通过Akamai分布式计算区域实现直播传输
人工智能·分布式·云计算
dessler6 小时前
RabbitMQ-知识技能图谱(总结篇)
分布式·rabbitmq
在未来等你8 小时前
RabbitMQ面试精讲 Day 20:RabbitMQ压测与性能评估
性能优化·消息队列·rabbitmq·压力测试·性能测试·面试题
货拉拉技术16 小时前
XXL-JOB参数错乱根因剖析:InheritableThreadLocal在多线程下的隐藏危机
java·分布式·后端
创码小奇客17 小时前
架构师选型圣经:SpringBoot 集成三大消息中间件的终极对决
rabbitmq·rocketmq·trae
博一波19 小时前
【车联网kafka】Kafka核心架构与实战经验(第三篇)
分布式·架构·kafka
weixin_422289371 天前
springboot整合rabbitMQ的示例
spring boot·rabbitmq·java-rabbitmq
掘金-我是哪吒1 天前
分布式微服务系统架构第163集:哈罗电池设备Netty网关架构
分布式·微服务·云原生·架构·系统架构
Code季风1 天前
如果缓存和数据库更新失败,如何实现最终一致性?
数据库·分布式·缓存·微服务·性能优化