当前位置: 首页 > news >正文

mq基础类设计

消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。

但是阻塞队列是在一个进程内部进行的;

消息队列是在进程与进程之间进行实现的, 

解耦合:就是在分布式系统中,A服务器调用B服务器,A给B发送请求,B给A返回响应,A和B之间耦合性很大。引入消息队列后,A把请求发给消息队列,B再从消息队列获取请求。

削峰填谷:B接收,A传送过多,B会感受到峰值,而B的硬盘之类资源有限,有消息队列,B仍然可以按照原本速度进行接收数据。不至于太多的并发量。

broker中间人负责转发和存储,mq和消费者的工作模式主要有两种,

推:push,Broker把收到的消息主动发出。

核⼼概念 • ⽣产者 (Producer) • 消费者 (Consumer) • 中间⼈ (Broker) • 发布 (Publish) • 订阅 (Subscribe)

 

package com.example.mq.mqserver.core;import javax.websocket.RemoteEndpoint;
import java.io.Serializable;
import java.util.UUID;/**Message包含正文和属性两个核心部分;*其中basicproperties基本特性包含routingkey,与Binding类中的bindingkey相对应;*in the end,创建工厂方法协助我们去创建Message对象:* *//**对于message:需要支持序列化;将对象转变为字节流方便网络传输或者存储。* 可能会进行网络传输或者持久化存储;** json中本质存储文本了理性的数据;* 而这里的Message存储二进制数据;* 标准库自带的方式进行序列化可以!*需要被序列化的类需要实现特定的接口;之前我们实现一个接口就是为了重写里面的某个或者某些方法。* 但是offsetEnd,offsetBeg是不需要序列化到保存在文件中的;因为消息一旦写入文件中位置就已经固定了;* so,transient暂住的,临时的;保证不背序列化* **//**硬盘存储:数据库  或者内存* mysql是客户端服务器结构的程序,SQLite(轻量级)是一个本地数据库,这个数据库相当于直接操作本地的硬盘文件;*在java中想要使用SQLite,就直接使用maven,将SQLite的依赖引入·,如果想额外安装SQLite也可以,下载就是一个dll/exe;** 轻量级SQLLite* */
public class Message implements Serializable {private BasicPropertities basicPropertities=new BasicPropertities();private byte[] body;private transient long offsetBeg=0;//begin,消息的开头距文件的偏移;【)transient暂住的,临时的;保证不背序列化private transient long offsetEnd=0;//消息结尾距离文件开头的文件偏移;【)/**消息内容的存储需要持久化,硬盘对这个的处理就是存储在文件中。* 后续就是一个文件中存储很多消息;而如何在一个文件中找到我们想要的消息?* 就是使用偏移量,offsetBeg和offsetEnd;* */private byte isValid=0x1;/**是否是有效消息:** 删除数据通常是逻辑删除,只是把它标记成无效而不是真正进行物理上的删除;*0x1有效,0x0无效;* 在硬盘操作使用byte更好一点;* */public  String getMessageId(){return basicPropertities.getMessageId();}public void setMessageId(String MessageId){basicPropertities.setMessageId(MessageId);}public String getRoutingKey(){return basicPropertities.getRoutingkey();}public void setRoutingKey(String routingKey){basicPropertities.setRoutingkey(routingKey);}public int getDeliverMode(){return basicPropertities.getDeliverMode();}public void setDeliverMode(int mode){basicPropertities.setDeliverMode(mode);}public BasicPropertities getBasicPropertities() {return basicPropertities;}public void setBasicPropertities(BasicPropertities basicPropertities) {this.basicPropertities = basicPropertities;}public byte[] getBody() {return body;}public void setBody(byte[] body) {this.body = body;}public long getOffsetBeg() {return offsetBeg;}public void setOffsetBeg(long offsetBeg) {this.offsetBeg = offsetBeg;}public long getOffsetEnd() {return offsetEnd;}public void setOffsetEnd(long offsetEnd) {this.offsetEnd = offsetEnd;}public byte getIsValid() {return isValid;}public void setIsValid(byte isValid) {this.isValid = isValid;}/*** 创建工厂方法协助我们去创建Message对象:*创建的message会帮助我们创建一个唯一的message id;* 这也是使用工厂方法而不是构造方法的原因之一。** 函数里面放message的核心内容,basicproperties和body,* 这里是在内存中设置这些属性,而offsetEnd,offsetBeg是在持久化才。** */public static Message createMessageWithId(String routingKey, BasicPropertities basicPropertities,byte[] body){Message message=new Message();if(basicPropertities!=null){message.setBasicPropertities(basicPropertities);}message.setMessageId("M-"+UUID.randomUUID());//前缀message.basicPropertities.setRoutingkey(routingKey);message.body=body;return message;}
}
package com.example.mq.mqserver.core;import java.util.HashMap;
import java.util.Map;public class MSGQueue {private String name;//唯一的身份标识;private boolean durable=false;private boolean exclusive=false;//如果为true,表示这个队列只能被一个消费者使用;//如果是false,表示这个队列可以被大家都使用;private boolean autodelete=false;private Map<String,Object> arguments=new HashMap<>();//其它的选项,可以有。public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isDurable() {return durable;}public void setDurable(boolean durable) {this.durable = durable;}public boolean isExclusive() {return exclusive;}public void setExclusive(boolean exclusive) {this.exclusive = exclusive;}public boolean isAutodelete() {return autodelete;}public void setAutodelete(boolean autodelete) {this.autodelete = autodelete;}public Map<String, Object> getArguments() {return arguments;}public void setArguments(Map<String, Object> arguments) {this.arguments = arguments;}
}
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;/*** 描述队列与交换机之间的关联关系* Binding依附于交换机和队列* 所以如果交换机和队列都没有持久化,对Binding进行持久化是没有任何意义的。* */
public class Binding {private String exchangName;private String queueName;private String bindingKey;//routingkey,口令红包;public String getExchangName() {return exchangName;}public void setExchangName(String exchangName) {this.exchangName = exchangName;}public String getQueueName() {return queueName;}public void setQueueName(String queueName) {this.queueName = queueName;}public String getBindingKey() {return bindingKey;}public void setBindingKey(String bindingKey) {this.bindingKey = bindingKey;}
}
package com.example.mq.mqserver.core;import java.util.HashMap;
import java.util.Map;public class Exchange {private String name;//唯一标识//交换机的三种类型:direct,fanout,topic;private ExchangeType type=ExchangeType.DIRECT;private boolean durable=false;//是否需要持久化;shifalse不用/*** 内存存储:快速;* 硬盘存储:持久;* 对于交换机,队列,绑定,有些需要持久化有些不需要;* so,持久化的开关;** */private boolean autoDelete=false;//没人使用就自动删除private Map<String,Object> arguments=new HashMap<>();//arguments表示创建交换机的时候指定的一些其它参数选项;//可以有也可以没有,用于开启不同的功能;public String getName() {return name;}public void setName(String name) {this.name = name;}public ExchangeType getType() {return type;}public void setType(ExchangeType type) {this.type = type;}public boolean isDurable() {return durable;}public void setDurable(boolean durable) {this.durable = durable;}public boolean isAutoDelete() {return autoDelete;}public void setAutoDelete(boolean autoDelete) {this.autoDelete = autoDelete;}public Map<String, Object> getArguments() {return arguments;}public void setArguments(Map<String, Object> arguments) {this.arguments = arguments;}
}

相关文章:

mq基础类设计

消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。 但是阻塞队列是在一个进程内部进行的&#xff1b; 消息队列是在进程与进程之间进行实现的&#xff0c; 解耦合&#xff1a;就是在分布式系统中&#xff0c;A服务器调用B…...

【Node.js从基础到高级运用】二、搭建开发环境

Node.js入门&#xff1a;搭建开发环境 在上一篇文章中&#xff0c;我们介绍了Node.js的基础概念。现在&#xff0c;我们将进入一个更实际的阶段——搭建Node.js的开发环境。这是每个Node.js开发者旅程中的第一步。接下来&#xff0c;我们将详细讨论如何安装Node.js和npm&#…...

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…...

设计模式 单例模式

单例模式就是在整个程序运行的过程中&#xff0c;这个类的实例化对象只有一个。 单例模式和private static 有密切的关系。 举一个例子&#xff1a; 一个wife&#xff0c;在法律允许的范围内&#xff0c;只能有一个。 public class Wife{private static Wife wife null; //…...

使用 Mendix 中的 OIDC 模块集成 Azure AD SSO

前言 在当今快速发展的数字化世界中&#xff0c;企业追求高效率和灵活性已成为常态。Mendix&#xff0c;作为一个先进的低代码开发平台&#xff0c;正是企业快速响应市场需求、加速数字化转型过程的利器。通过其直观的可视化开发环境&#xff0c;即使是非技术背景的用户也能设…...

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…...

【基于springboot+Vue+Element ui的电影推荐之协同过滤算法简单实现】

基于springbootVueElement ui的电影推荐之协同过滤算法简单实现 1.基于用户的协同过滤算法的简单设计与实现1.1获取某个用户的评分矩阵1.2获取该用户与其他用户的相似度矩阵1.3获取两个用户之间的相似度并存储1.4返回推荐列表 2.基于物品的协同过滤算法的简单设计与实现2.1计算…...

签约仪式如何策划和安排流程?如何邀约媒体现场见证报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 签约仪式的策划和安排流程&#xff0c;以及邀约媒体现场见证报道&#xff0c;都是确保活动成功和提升影响力的关键环节。以下是一些建议&#xff1a; 签约仪式的策划和安排流程 明确目标…...

k8s-生产级的k8s高可用(1) 24

高可用集群 实验至少需要三个master&#xff08;控制节点&#xff09;&#xff0c;一个可以使外部可以访问到master的load balancer&#xff08;负载均衡&#xff09;以及一个或多个外部节点worker&#xff08;也要部署高可用&#xff09;。 再克隆三台主机 清理并重启 配置两…...

python中lambda简介及用法

什么是lambda&#xff1f; lambda是python中的一个关键字&#xff0c;它用于创建匿名函数&#xff0c;也就是没有名字的函数。lambda函数通常用于一些简单的操作&#xff0c;比如作为参数传递给其他函数&#xff0c;或者作为返回值返回给调用者。lambda函数的语法如下&#xf…...

AI新工具 百分50%算力确达到了GPT-4水平;将音乐轨道中的人声、鼓声、贝斯等音源分离出来等

1: Pi 百分50%算力确达到了GPT-4水平 Pi 刚刚得到了巨大的升级&#xff01;它现在由最新的 LLMInflection-2.5 提供支持&#xff0c;它在所有基准测试中都与 GPT-4 并驾齐驱&#xff0c;并且使用不到一半的计算来训练。 地址&#xff1a;https://pi.ai/ 2: Moseca 能将音乐…...

websocket前端应用

基本了解 首先要对websocket有一个基本了解&#xff1a;WebSocket是一种在Web浏览器和Web服务器之间创建持久连接的技术。它允许在客户端和服务器之间进行全双工通信&#xff0c;而不需要在每次通信时都发起新的HTTP请求。主要作用包括实时通信、减少延迟、减少宽带消…...

SpringMVC05、结果跳转方式

5、结果跳转方式 5.1、ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} viewName {视图解析器后缀} <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.view.InternalResourc…...

STM32基础--位带操作

位带简介 位操作就是可以单独的对一个比特位读和写&#xff0c;这个在 51 单片机中非常常见。51 单片机中通过关键字 sbit 来实现位定义&#xff0c;STM32 没有这样的关键字&#xff0c;而是通过访问位带别名区来实现。 在 STM32 中&#xff0c;有两个地方实现了位带&#xff…...

C# winform 重启电脑

一、重启电脑指令 windows7系统的启动文件夹为“开始菜单”——“所有程序”里面就有“启动”文件夹&#xff0c;其位置是 “C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup” 如果没有&#xff0c;则需要将其中的"administrator…...

波奇学Linux: 信号捕捉

sigaction:修改信号对应的handler方法 act输入型参数&#xff0c;oldact输出型参数 void (*sa_handler) (int) //修改的自定义函数 sigset_t sa_mask // void handler(int signo) {cout<<"catch a signal, signal number: "<<signo<<endl; } int …...

Flink hello world

下载并且解压Flink Downloads | Apache Flink 启动Flink. $ ./bin/start-cluster.sh Starting cluster. Starting standalonesession daemon on host harrydeMacBook-Pro.local. Starting taskexecutor daemon on host harrydeMacBook-Pro.local. 访问localhost:8081 Flin…...

STL之map容器代码详解

基础概念 简介&#xff1a; map中所有元素都是pair。pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09;。所有元素都会根据元素的键值自动排序。 本质&#xff1a; map/multimap属于关…...

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…...

uniapp 小程序AP配网

一、TCPSocket.js 封装TCP协议 class socket {constructor() {this.connection {};}// 创建一个TCP实例establish(monitor) {this.connection wx.createTCPSocket();this.connection.connect({ address: "000.000.0.0", port: 6800 });}// 发送消息connect(messag…...

四十二、Fluent欧拉模型流化床模拟:从基础设置到颗粒动力学解析

1. 流化床与欧拉模型基础概念 流化床技术在现代工业中应用广泛&#xff0c;从化工反应器到生物质燃烧装置都能见到它的身影。简单来说&#xff0c;流化床就是让固体颗粒在流体作用下呈现类似流体流动状态的一种装置。想象一下小时候玩过的泡泡浴&#xff0c;当浴缸底部不断有气…...

uni-app本地打包APK实战:从HBuilder X到Android Studio的避坑指南

1. 环境准备&#xff1a;工具链全解析 第一次接触uni-app本地打包的开发者&#xff0c;往往会卡在环境配置这一步。我当初花了整整两天时间才搞明白各个工具的用途和安装顺序&#xff0c;这里把踩过的坑都总结给你。HBuilder X作为开发工具是起点&#xff0c;但真正打包需要And…...

别再死记硬背了!用Python+Matlab复现海上信道核心模型(附代码与实测数据对比)

从理论到代码&#xff1a;PythonMatlab实战海上信道建模与数据验证 海上无线信道建模一直是通信工程领域的难点——复杂的多径效应、海面反射波动、大气折射干扰等因素交织&#xff0c;让许多研究者望而生畏。但换个角度想&#xff0c;这些挑战恰恰是理解无线传播本质的绝佳案例…...

Barrier终极指南:一套键鼠控制Windows、macOS、Linux三系统,免费开源KVM软件让你效率翻倍![特殊字符]

Barrier终极指南&#xff1a;一套键鼠控制Windows、macOS、Linux三系统&#xff0c;免费开源KVM软件让你效率翻倍&#xff01;&#x1f680; 【免费下载链接】barrier Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/ba/barrier 你是否曾在多台电脑…...

房屋租赁管理|基于springboot + vue房屋租赁管理系统(源码+数据库+文档)

房屋租赁管理系统 目录 基于springboot vue房屋租赁管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue房屋租赁管理系统 一、前言 博主介绍&am…...

手把手教你为嵌入式设备编写一个简单的电池驱动(基于Linux Power Supply框架)

手把手教你为嵌入式设备编写一个简单的电池驱动&#xff08;基于Linux Power Supply框架&#xff09; 当你拿到一款新的嵌入式设备&#xff0c;尤其是带有电池的便携式产品时&#xff0c;如何快速为其开发一个可靠的电池状态监控驱动&#xff1f;Linux内核提供的Power Supply子…...

FPGA显示进阶:不用专用芯片,如何用IO口模拟HDMI驱动640x480显示器?

FPGA显示进阶&#xff1a;用IO口模拟HDMI驱动640x480显示器的技术解析 在资源受限或高度定制化的FPGA应用场景中&#xff0c;如何突破专用芯片的限制&#xff0c;直接利用FPGA的通用IO实现高清视频输出&#xff1f;本文将深入探讨一种基于LVDS和TMDS协议的"软核"HDMI…...

如何用键盘完全替代鼠标?Mouseable终极指南让你效率翻倍

如何用键盘完全替代鼠标&#xff1f;Mouseable终极指南让你效率翻倍 【免费下载链接】mouseable Mouseable is intended to replace a mouse or trackpad. 项目地址: https://gitcode.com/gh_mirrors/mo/mouseable 你是否曾经因为长时间使用鼠标而感到手腕酸痛&#xff…...

ABAP ALV删除行后数据又‘复活’?一个方法搞定check_changed_data

ABAP ALV删除行数据同步异常排查指南&#xff1a;从Del键失效到check_changed_data的深度解析 在SAP系统开发中&#xff0c;可编辑ALV报表的数据同步问题堪称"经典陷阱"。许多开发者都遇到过这样的场景&#xff1a;用户信心满满地按下Del键删除行项目&#xff0c;点击…...

AGI专利组合价值评估失真超400%?:基于WIPO专利引证网络+技术成熟度曲线的AGI核心专利估值模型(附可运行Python脚本)

第一章&#xff1a;AGI的知识产权与专利分析 2026奇点智能技术大会(https://ml-summit.org) 通用人工智能&#xff08;AGI&#xff09;作为前沿技术交叉领域&#xff0c;其知识产权格局呈现高度动态性与跨国性。全球主要专利局数据显示&#xff0c;2020–2024年间AGI相关发明…...