消息队列项目(1)

概念

这里的消息队列, 大致上就是一个生产者消费者模型.

我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的

需求分析

有几个核心的概念:

  1. 生产者(Producer)
  2. 消费者(Consumer)
  3. 中间人(Broker)
  4. 发布(Publish) :生产者向中间人投递消息的过程
  5. 订阅(Subcribe) :记录哪些消费者要从中间人这里取数据
  6. 消费(Consume): 消费者从中间人这里取数据的过程

 上面是大概的一个流程, 但在消息队列中生产者消费者远远不止一个

BrokerServer

内部关键概念

1. 虚拟主机(VirtualHost): 类似于MySQL 中的 database, 是一个逻辑上的数据集合

2. 交换机(Exchange): 生产者把消息投递给 Broker Server, 实际上是把消息交给 了 BrokerServer 上的某一个交换机, 再有交换机把消息转发给对应的队列

3. 队列(Queue): 真正用来存储处理消息的实体, 消费者也是从队列中取出数据

4. 绑定(Binding): 把交换机和队列中间, 绑定起关联关系, 交换机和队列之间类似与 与数据库中的 "多对多" 的关系

5. 消息(Message): 服务器 A 给 B 发送的请求就是一个消息, 服务器 B 给 A 发送的响应也是一个消息, 一个消息可以视为一个字符串(二进制数据), 具体包含的数据就得看业务场景

重要的属性

交换机(Exchange)

1. name: 一个作为标识的字符串, 相当于主键

2. type: 交换机有以下几种类型:

Direct 直接交换机:

生产者发送消息的时候, 会指定一个"目标队列"的名字, 交换机收到后, 就会看看绑定的队列里有没有匹配的队列, 有就转发过去, 没有就丢弃消息

Fanout: 扇出交换机:

将与该交换机绑定的所有队列都发送一份一样的消息

Topic: 主题交换机:

有两个关键概念: routingKeybindingKey.

routingKey 在 Message 手里, bindingKey 在 Binding 手里

说白了他们就是两个字符串, 如果这两个字符串通过一些匹配规则匹配上了就能够将消息发送给对应绑定的队列手里

 3. durable: 是否持久化, 意思就是会不会保存在硬盘中

type可以用枚举:

package com.example.mq.mqserver.core;

public enum ExchangeType {
    DIRECT(0),
    FANOUT(1),
    TOPIC(2);

    private final int type;

    private ExchangeType(int type){
        this.type = type;
    }

    public int getType(){
        return type;
    }
}
package com.example.mq.mqserver.core;

import lombok.Data;

@Data
public class Exchange {
    private String name;
    private ExchangeType type;
    private Boolean durable = false;

}

队列(MSGQueue)

1. name: 标识符

2. durable: 是否持久化

package com.example.mq.mqserver.core;

import lombok.Data;

@Data
public class MSGQueue {
    private String name;
    private Boolean durable = false;
}

绑定(Binding)

1. ExchangeName

2. QueueName

Binding 主要就是靠 exchange 和 queue 直接的联系而存在的, 因此由这个两个进行定义

3. durable: 是否持久化

4. bindingKey: 匹配符, 上面有介绍

package com.example.mq.mqserver.core;

import lombok.Data;

@Data
public class Binding {
    private String ExchangeName;
    private String QueueName;
    // 匹配符
    private String bindingKey;
    private Boolean durable;
}

消息(Message)

1. MessageID 标识符

2. body 消息主体内容

3. durable 是否持久化

4. offsetBeg 消息在硬盘中头的偏移量

5. offsetEnd 消息在硬盘中尾的偏移量

这个两个偏移量就能很好的找到消息在硬盘中的位置

6. routingKey 匹配符

package com.example.mq.mqserver.core;

import lombok.Data;

@Data
public class Message {
    private String messageID;
    private Byte[] body;
    // 匹配符
    private String routingKey;
    private Boolean durable = false;

    // 这个两个表示偏移量
    private transient long offsetBeg = 0;
    private transient long offsetEnd = 0;
    // 0x1 表示有效, 0x2 表示无效
    private byte isValid = 0x1;
}

我们要用的几个 package:

这些属性放到 mqserver 中的 core 中

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值