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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat -2

① 单机反向代理 7-2 代理服务器 7-5 tomcat 设置 7-3 测试&#xff1a; 代理服务器那里写什么就显示什么 ② 多机反向代理 实现动静分离和负载均衡 7-2 nginx 7-3 7-5 测试&#xff1a; 看静态&#xff1a; 看动态&#xff1a; ③ 反向代理多机多级 7-2 7-1 和 7-4 7-3…

【STM32】STM32学习笔记-读写内部FLASH 读取芯片ID(49)

00. 目录 文章目录 00. 目录01. FLASH概述02. 读写内部FLASH接线图03. 读写内部FLASH相关API04. 读写内部FLASH程序示例05. 读写芯片ID接线图06. 读写芯片ID程序示例07. 程序示例下载08. 附录 01. FLASH概述 STM32F10xxx内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(…

华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

外部存储器接口(EMIF)

外部存储器接口&#xff08;EMIF&#xff09; 该设备支持双核架构&#xff1b;为了为每个CPU子系统提供一个专用的EMIF&#xff0c;该设备支持两个EMIF模块——EMIF1和EMIF2。两个模块完全相同&#xff0c;具有相同的功能集&#xff0c;但具有不同的地址/数据大小。EMIF1在CPU…

Unity 角色控制(初版)

角色控制器组件&#xff0c;当然是将组件放在角色上了。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// 获取角色控制器private CharacterController player;void Start(){// 加载角色控制器player …

机器学习 | 模型性能评估

目录 一. 回归模型的性能评估1. 平均平方误差(MSE)2. 平均绝对误差(MAE)3. R 2 R^{2} R2 值3.1 R 2 R^{2} R2优点 二. 分类模型的性能评估1. 准确率&#xff08;Accuracy&#xff09;2. 召回率&#xff08;Recall&#xff09;3. 精确率&#xff08;Precision&#xff09;4. …

大模型学习笔记五:RAG

文章目录 一、RAG介绍1)局限性2)通过检索增强生成二、RAG系统的基本搭建流程1)搭建流程简介2)文档的加载和切割3)检索引擎4)LLM接口封装5)prompt模板6)RAG Pipeline初探7)关键字检索局限性三、向量检索1)文本向量2)向量相似度计算3)向量数据库4)基于向量检索的RAG…

电源完整性设计的重要三步!

电源模块布局布线 电源模块是电子设备的能量来源&#xff0c;其性能与布局直接影响到整个系统的稳定性和效率。正确的布局和走线不仅能减少噪声干扰&#xff0c;还能确保电流的顺畅流通&#xff0c;从而提高整体性能。 1、电源模块布局 ● 源头处理&#xff1a;电源模块作为…

Java 面试题

Java 基础 以下代码执行结果&#xff1f; 示例1&#xff1a; public static void main(String[] args) {int a 0;Integer b 0;String c "0";String d new String("0");change(a, b, c, d);System.out.println(a "|" b "|" …

glibc

交叉编译器的glibc库位置&#xff1a; 用此交叉编译器编译的根文件系统对应的开发板上的GLIBC版本&#xff1a; 证明buildroot会使用交叉编译器自带的glibc库来对根文件系统进行编译。

如何在CentOS部署JumpServer堡垒机并实现无公网ip环境远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践

作者&#xff1a;汪诚愚&#xff08;熊兮&#xff09;、高一鸿&#xff08;子洪&#xff09;、黄俊&#xff08;临在&#xff09; Qwen1.5&#xff08;通义千问1.5&#xff09;是阿里云最近推出的开源大型语言模型系列。作为“通义千问”1.0系列的进阶版&#xff0c;该模型推出…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…

llc半桥开关电源基础知识2(电路图简化)

llc半桥开关电源拓扑图如下 稳态:LLC电源已经正常工作,已经输出电压稳定稳态:LLC电源已经正常工作,已经输出电压稳定。 我们在分析拓扑结构的时候,都是基于他已经正常稳定输出的时候来分析的,毕竟LC电源只要以工作啊,绝大多数时间都是工作在稳态。 具体电路图化简分析如…

yolov9训练

目录 说明 1、下载代码安装新的python环境 2、准备数据 3、修改代码 说明 本文参考该博主的文章&#xff0c;在已经有数据的情况&#xff0c;进行简单总结。需要详细版见原文链接如下&#xff1a;YOLOV9保姆级教程-CSDN博客 1、下载代码安装新的python环境 代码下载&…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…

如何选择程序员职业赛道

目录 前言1 个人技能分析1.1 技术栈评估1.2 经验积累1.3 数据科学能力 2 兴趣与价值观2.1 用户交互与界面设计2.2 复杂问题解决与系统优化 3 长期目标规划4 市场需求分析4.1 人工智能和云计算4.2 前沿技术趋势 5 就业前景5.1 前端在创意性公司中的应用5.2 后端在大型企业中的广…

前端爬虫+可视化Demo

爬虫简介 可以把互联网比做成一张 “大网”&#xff0c;爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流&#xff1a;Demo实现前置知识&#xff1a; JS 基础Node 基础 &#xff08;1&#xff09;爬虫基本工作流程&#xff1a; 向…

『运维备忘录』之 RegEx 正则表达式实例汇总

运维人员不仅要熟悉操作系统、服务器、网络等知识&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

深入理解Tomcat

目录&#xff1a; TomcatTomcat简介如何下载tomcatTomcat工作原理Tomcat架构图Tomcat组件Server组件Service组件Connector组件Engine组件Host组件Context组件 配置虚拟主机(Host)配置Context Tomcat Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE…