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

RabbitMQ集群 - 普通集群搭建、宕机情况

文章目录

  • RabbitMQ 普通集群
    • 概述
    • 集群搭建
      • 数据准备
      • 启动容器
      • 宕机情况

RabbitMQ 普通集群


概述

1)普通模式中所有节点没有主从之分,所有节点的元数据(交换机、队列、绑定等)都是一致的.

例如只要有任意一个节点上面 新增交换机, 那么这个交换机的元数据也会被复制到其他节点上.

2)比较特殊的是队列,队列中的消息数据只保存在创建他的节点上,其他节点只保存元数据(队列名称、配置...)指针(指向创建该队列的节点).

例如 node1 创建 cyk.queue,那么 node2 只保存 队列的元数据 和 指向 node1 节点的指针,而 cyk.queue 中的消息,只会存在于 node1 节点中.

在这里插入图片描述

3)对于消息的传输如下:

假设有 node1、node2 节点,在 node1 中创建了 cyk.queue 队列.

  • 此时有一个生产者和 node2 建立连接,向 cyk.queue 队列发送数据:RabbitMQ 会根据 node2 中保存的 node1 的指针,把消息转发给 node1 节点,最后消息数据还是保存在 node1 中.
  • 此时有一个消费者和 node2 建立连接,从 cyk.queue 队列中消费:RabbitMQ 会根据 node2 中保存的 node1 的指针,把消费消息的请求转发给 node1,然后 node1 将消息实体取出,并经过 node2 发送给 消费者.

4)存在的问题:

假设有 node1、node2 节点,在 node1 中创建了 cyk.queue 队列.
那么一旦 node1 宕机,那么 cyk.queue 中的消息也随之丢失,那么其他节点保存的 node1 指针也相当于失效,再想拿到消息,更是不可能了.

集群搭建

数据准备

1)先简单启动一个容器.

docker run -d --name mq \--restart=always \-e RABBITMQ_DEFAULT_USER=root \-e RABBITMQ_DEFAULT_PASS=1111 \-p 15672:15672 \-p 5672:5672 \rabbitmq:3.8-management

2)RabbitMQ 底层基于 Erlang 语言,默认支持集群模式. 在集群模式中,每个 RabbitMQ 节点使用一个称为 Erlang cookie 的共享密钥来实现相互通信.

要想是两个节点能相互通信,必须具有相同的共享密钥(这个密钥是可以自定义的).

通过以下命令获取 cookie 值:

docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

在这里插入图片描述

Ps:可以不需要这个步骤,因为只要保证每个节点中保存的 .erlang.cookie 值相同即可

3)在 ~/ 目录下创建 .erlang.cookie 文件,用来保存 Erlang Cookie(将来挂载数据)

touch ~/.erlang.cookie
echo "FQXBTQJMJLRUGFPIECYG" > ~/.erlang.cookie
chmod 600 ~/.erlang.cookie

4)在 ~/ 目录下创建 rabbitmq.conf 文件,配置 RabbitMQ 集群各种参数,以及节点信息和端口(包括禁止默认的 guest 用户,指定 AMQP 端口 5672)

loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3

5)在 ~/mq_cluster 目录下创建三个目录,用来存放不同节点信息.

mkdir -p ~/mq_cluster/mq1
mkdir -p ~/mq_cluster/mq2
mkdir -p ~/mq_cluster/mq3

6)将 ~/rabbitmq.conf 和 ~/.erlang.cookie 文件复制到三个节点目录中

cp ~/rabbitmq.conf ~/mq_cluster/mq1
cp ~/rabbitmq.conf ~/mq_cluster/mq2
cp ~/rabbitmq.conf ~/mq_cluster/mq3cp ~/.erlang.cookie ~/mq_cluster/mq1
cp ~/.erlang.cookie ~/mq_cluster/mq2
cp ~/.erlang.cookie ~/mq_cluster/mq3

最后结构如下:
在这里插入图片描述

启动容器

1)创建网络,让集群中不同节点可以进行网络通信

docker network create mq-net

2)分别启动三个节点

docker run -d --net mq-net \
-v ~/mq_cluster/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq1/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq1 \
--hostname mq1 \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3.8-managementdocker run -d --net mq-net \
-v ~/mq_cluster/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq2/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq2 \
--hostname mq2 \
-p 5673:5672 \
-p 15673:15672 \
rabbitmq:3.8-managementdocker run -d --net mq-net \
-v ~/mq_cluster/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq3/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq3 \
--hostname mq3 \
-p 5674:5672 \
-p 15674:15672 \
rabbitmq:3.8-management

3)打开 MQ 控制台,例如访问 mq1,就可以看到集群信息:
在这里插入图片描述
4)测试集群:
例如在 mq1 节点上添加 cyk.queue 的队列.
在这里插入图片描述
此时,访问 mq2 和 mq3 的控制台,也能看到这个队列.
在这里插入图片描述
至此集群搭建完成.

宕机情况

1)在 mq1 节点上创建一个 cyk.queue 队列,并发送一个消息,在其他节点上也可以看到同样效果.
在这里插入图片描述
2)此时,假设 mq1 节点宕机了(docker stop mq1),那么在 mq2 上可以看到在 mq1 上创建的 cyk.queue 队列的消息也随之丢失
在这里插入图片描述
在这里插入图片描述
3)mq1 节点宕机了,那么 mq2 节点也就无法取出 mq1 中未消费的消息实体.

  • 如果 mq1 队列做了持久化,那么等到 node1 恢复了,就能进行消费. 但是在 mq1 恢复之前,其他节点不能创建 mq1 重点已创建的队列.
  • 如果 mq1 队列没有持久化,消息也会丢失. 并且在 mq1 恢复之前,其他节点可以创建和 mq1 相同的队列.

相关文章:

RabbitMQ集群 - 普通集群搭建、宕机情况

文章目录 RabbitMQ 普通集群概述集群搭建数据准备启动容器宕机情况 RabbitMQ 普通集群 概述 1)普通模式中所有节点没有主从之分,所有节点的元数据(交换机、队列、绑定等)都是一致的. 例如只要有任意一个节点上面 新增交换机&…...

xssDOM型练习

文章目录 例1要求 例2代码解析方法 例3例4例5例6例7例8 例1 本题通过get接收并传递参数,所有参数不经过过滤直接放入h2标签里面。 要求 1.需要页面弹出1337 2.不能与用户交互 官方认为innerHTML中script标签不安全,所以将其禁用,但只禁用了…...

python中的gradio使用麦克风时报错

python中的gradio使用麦克风时报错 当运行至 import gradio as gr with gr.Blocks() as demo:with gr.Tab("microphone transcriber"):gr.Audio(source"microphone", type"numpy", streamingTrue)demo.queue()##访问链接 https://ip:1235/demo…...

Oracle(63)什么是临时表(Temporary Table)?

临时表(Temporary Table)是一种特殊类型的表,用于存储临时数据,这些数据在会话期间或事务期间是短暂的。临时表在不同的数据库系统中都有实现,但功能和特性可能有所不同。临时表通常用于存储中间计算结果、临时数据处理…...

《Techporters架构搭建》-Day06 国际化

什么是国际化? 国际化,也叫i18n,为什么叫i18n呢? "i18n"是国际化(internationalization)的缩写,数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8s(kube…...

Linux ACL 访问控制

今天给伙伴们分享一下Linux ACL 访问控制,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步…...

hg transformers pipeline使用

什么是hg transformers pipeline? 在Hugging Face的transformers库中,pipeline是一个高级API,它提供了一种简便的方式来使用预训练模型进行各种NLP任务,比如情感分析、文本生成、翻译、问答等。通过pipeline,你可以在几行代码内…...

高性能内存对象缓存

Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 数据存储方式与数据过期方式 数据存储方式:Slab Allocation 按组分配内存,每次先分配一个Slab,相当于一个大小为1M的页&…...

文件上传-CMS文件上传分析

黑盒思路: 上传点抓包测试 个人用户中心是否存在文件上传功能后台管理系统是否存在文件上传功能字典目录扫描探针文件(eg:upload.php)构造地址字典目录扫描探针编辑器目录构造地址(编辑器目录一般是默认的&#xff09…...

云原生日志Loki

1. Loki简介 1.1 Loki介绍 Loki是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签…...

初阶数据结构之直接选择排序和快速排序

直接选择排序 1.在元素集合 array[i]–array[n-1] 中选择关键码最⼤(⼩)的数据元素 2.若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素 交换 3.在剩余的 array[i]–array[n-2](array[i1]–…...

Java语言程序设计——篇十三(4)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...

低代码: 组件库测试之渲染和元素获取,触发事件,更新表单,验证事件以及异步请求

组件库测试步骤 渲染组件(怎样将一个组件渲染到测试用例里面) mount 和 shallowMount传递属性元素是否成功的显示 查找元素的不同写法get, getAllfind, findAllfindComponent 和 getComponent触发事件(是click也好,是input也好,让它触发对应的事件) trigger 方法观察测试界面…...

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…...

2024年电赛H题全开源

当题目出来的的那一刻,看到了M0芯片,我们实验室只有一块板子,并且我没有接触过M0,电赛只准备了TI的MSP430f5529。但是我并没有放弃,决然的选择了H题。基本上将四问全做出来,可是测试由于使用了感为科技的寻…...

Docker:宿主机可以ping通外网,docker容器内无法ping通外网之解决方法

问题描述 1、宿主机可以ping外网,docker容器内无法ping外网 ping www.baidu.com 提示:unknown host baidu.com 2、宿主机可以wget下载,docker容器内无法wget下载 wget www.baidu.com 提示:unknown host baidu.com 解决方法 1、…...

bootchart抓Android系统启动各阶段性能数据

最近在做Android系统启动优化,首要任务是找到启动过程中各阶段耗时点,进而有针对性地进行优化。主要用bootchart抓开机数据,本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…...

使用 Node.js 和 Express 框架通过网页访问GPIO和嵌入式 Linux 系统中使用 GSM/3G/4G 模块

点击上方"蓝字"关注我们 01、前言 想要快速开发嵌入式 Linux 网络应用,控制硬件 GPIO,从而使得用户能够远程控制和监控系统。 主要目的是向读者展示开发使用文件系统控制 GPIO 的 Node 代码、创建用户有好的界面、以及运行基于 Express 框架使用 AJAX 通客户端进…...

IT 行业的就业情况

当前,IT 行业的就业情况呈现出以下特点: 1. 需求持续增长:随着数字化转型的加速,各个行业对信息技术的依赖程度不断提高,推动了对 IT 人才的持续需求。特别是在云计算、大数据、人工智能、物联网等新兴领域&#xff…...

如何快速获取麒麟操作系统版本信息

如何快速获取麒麟操作系统版本信息 一、桌面版系统1. 使用 /etc/kylin-build 文件2. 使用 /etc/.kyinfo 文件 二、服务器版系统1. 使用 /etc/.productinfo 文件2. 使用 nkvers 命令3. 使用 /etc/kylin-release 文件 三、总结 💖The Begin💖点点关注&…...

git提交规范检查husky

一、Eslint 尤雨溪推荐的 prettierrc 配置,句尾不带分号 单引号。 尤雨溪推荐配置:vue-next/.prettierrc lint lint 是最著名的 C 语言工具之一,是由贝尔实验室 SteveJohnson 于 1979 在 PCC(PortableC Compiler) 基础上开发的静态代码分…...

LeetCode 919. 完全二叉树插入器

完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。 设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作&#xf…...

C++密码管理器

先问一句 最近有几个关注我的原力等级为0或-1,文章全是转载,转载时间基本都在2021年,而且关注了很多人,这些是僵尸粉吗? 文末有投票,麻烦参与一下谢谢 实现功能列表 暂时还没做加密功能 打算用openssl/a…...

算法【Java】 —— 滑动窗口

滑动窗口 在上一篇文章中,我们了解到了双指针算法,在双指针算法中我们知道了前后指针法,这篇文章就要提到前后指针法的一个经典的使用 —— 滑动窗口,在前后指针法中,我们知道一个指针在前,一个指针在后&a…...

Spring Aware接口执行时机

一. 介绍 Spring Aware 接口的执行时机有两处,都在 getBean() 中的 initializeBean() 中; 下面我们分析这两处时机; // ----------------------- AbstractAutowireCapableBeanFactory --------------------- protected Object initializeB…...

android FD_SET_chk问题定位

android FD_SET_chk问题定位 一、FD报错二、问题定位2.1 APM定位2.2 adb定位2.3. 代码获取FD数 三、FD优化 一、FD报错 App在运行中记录报错如下,FD_SET,这个问题大概是文件描述符(File Descriptor,简称FD)超过了最大…...

Chapter 39 Python多线程编程

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、并行执行二、threading模块 前言 现代操作系统如 macOS、UNIX、Linux 和 Windows 等,均支持多任务处理。本篇文章详细讲解了并行执行的概念以及如何在 …...

STM32(二):GPIO

GPIO(General Purpose Input Output)通用输入输出口 1.可配置为8种输入输出模式,引脚电平:0V~3.3V,部分引脚可容忍5V,输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等,输入模式下…...

一文入门mysql 数据库

一、对数据库的操作 1.展示所有的数据库 show databases; 2.创建数据库 create database 数据库名 charset utf8; 3.删除数据库 drop database 数据库名; 4.查看当前使用的数据库 select database(); 5.使用数据库 use 数据库名; 二、对数据表的操作 1.展示所有表…...

通义千问( 四 ) Function Call 函数调用

4.2.function call 函数调用 大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。 您可以使用function call功能,通过调用外部工具来提升模型的输出效果。您可以在调用大模型时,通过tools参数传入工具的名称、描述、入参等信息。…...

设置idea中放缩字体大小

由于idea没默认支持ctrl滚轴对字体调节大小,下面一起设置一下吧! 点击 文件 -> 设置 按键映射 -> 编辑器操作 -> 搜索栏输入f 点击减小字体大小 -> 选择增加鼠标快捷键 按着ctrl键,鼠标向下滚动后,点击确定即可 然后…...

frameworks 之getEvent指令

frameworks 之getEvent指令 指令解析源码追溯源码解析1.解析参数2.初始化ufds数组3.添加到poll 并做对应处理 通过 getEvent 可以识别按键基本命令和里面的关键信息 涉及到的类如下 system/core/toolbox/toolbox.csystem/core/toolbox/tools.hsystem/core/toolbox/getevent.c …...

tensorboard显示一片空白解决方案

OK艾瑞巴蒂 不知道看这个视频几个小土堆过来的,今天已经发了一篇博文探讨快速下载tensorboard了 下面用的时候叒出现问题了 from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs")# writer.add_image() # Yx for i in range…...

C#编程中,如何实现一个高效的数据排序算法?

在C#编程中&#xff0c;可以使用内置的排序方法来实现高效的数据排序。最常用的方法是使用Array.Sort()和List<T>.Sort()。这些方法内部使用了快速排序算法&#xff08;Quick Sort&#xff09;&#xff0c;它是一种非常高效的排序算法&#xff0c;平均时间复杂度为O(n lo…...

LookupError: Resource averaged_perceptron_tagger not found.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Leetcode JAVA刷刷站(39)组合总和

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以使用回溯算法来找到所有可能的组合&#xff0c;使得组合中的数字之和等于目标数 target。因为数组中的元素可以无限制地重复选择&#xff0c;所以在回溯过程中&#xff0c;我们不需要跳过已经选择的元素&#x…...

Spring中AbstractAutowireCapableBeanFactory

AbstractAutowireCapableBeanFactory 是 Spring 框架中的一个抽象类&#xff0c;位于 org.springframework.beans.factory.support 包中。它实现了 AutowireCapableBeanFactory 接口&#xff0c;提供了一些通用的方法和逻辑&#xff0c;以支持 Spring 中的自动装配功能。 主要…...

PostgreSQL的walwriter和archiver进程区别

PostgreSQL的walwriter和archiver进程区别 在PostgreSQL中&#xff0c;walwriter和archiver进程是两个重要的后台进程&#xff0c;它们负责管理WAL&#xff08;Write-Ahead Logging&#xff0c;预写日志&#xff09;文件&#xff0c;但它们的职责和功能有所区别。理解这两个进…...

前端字体没有授权,字体版权检测(是否为方正字体)

1.截图系统中的首页和登录页面&#xff0c;主要是有字体的地方 2.在线字体版权检测地址&#xff1a;字体版权自动检测-求字体网 3.上传照片&#xff0c;开始对图片进行检测&#xff0c;每个账号有三次免费次数 4.检测完&#xff0c;直接查看检测报告即可&#xff0c; 报告中…...

在 SOCKS 和 HTTP 代理之间如何选择?

在 SOCKS 和 HTTP 代理之间进行选择需要彻底了解每种代理的工作原理以及它们传达的配置。只有这样&#xff0c;您才能轻松地在不同类型的代理之间进行选择。 本文概述了 HTTP 和 SOCKS 代理是什么、它们如何运作以及它们各自带来的好处。此外&#xff0c;我们将比较这两种代理类…...

C++适配windows和linux下网络编程TCP简单案例

C网络编程 网络协议是计算机网络中通信双方必须遵循的一套规则和约定&#xff0c;用于实现数据的传输、处理和控制。这些规则包括了数据格式、数据交换顺序、数据处理方式、错误检测和纠正等。网络协议是使不同类型的计算机和网络设备能够相互通信的基础&#xff0c;是网络通信…...

OpenDDS的GUID是如何构造的?

1、GUID、RepoID、GUID_t概念和关系 GUID(Global Unique IDentifiers)是RTPS规范约定的DDS对象的唯一性ID;RepoId(Repository IDentifiers)是Repo服务约定的DDS对象的唯一性ID;GUID和RepoId,都是基于GUID_t结构体定义,名称不同,但实质上是一样的。题外话: 无论是GUID还…...

初识MySQL(安装与配置环境)

嗨&#xff01;今天我们进入一个新的领域---数据库。 首先来个小小铺垫。 我们平时存储东西的时候&#xff0c;一般用到文件。为什么有文件了&#xff0c;还继续要这个数据库呢&#xff1f; 很明显&#xff0c;文件有一些不好的地方&#xff0c;需要数据库来进行补充。 文件…...

druid+logback打印sql执行日志

druid 的LogFilter 为我们准备了四种logger类型&#xff0c;对应打印 datasource相关、connection相关、statement相关、resultset相关的日志。 druid.sql.Datasource&#xff1a;打印数据源相关的字段。 druid.sql.Connection&#xff1a;打印应用程序获得数据库连接的过程。…...

C++编程:无锁环形队列 (LockFreeRingQueue)的简单实现、测试和分析

文章目录 0. 概述1. 无锁环形队列概述1.1 无锁环形队列的特点1.2 无锁环形队列的优势与局限 2. LockFreeRingQueue 实现2.1 Enqueue 操作流程图2.2 Dequeue 操作流程图 3. 核心实现细节3.1 环形队列的大小调整3.2 索引计算3.3 原子操作与CAS3.4 线程让步 4. 测试示例程序4.1 实…...

植物生长时为什么会扭动?科学家解开令查尔斯·达尔文困惑的千古之谜

在一项新的研究中&#xff0c;来自美国和以色列的物理学家可能已经弄清了植物生长过程中的一种古怪行为–也是查尔斯-达尔文本人在其生命的最后几十年里所好奇的一个谜&#xff1a;对于许多人类来说&#xff0c;植物可能看起来静止不动&#xff0c;甚至有点无趣。但实际上&…...

SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)

上一章学习了LE的基础知识。 1&#xff0c;LE的概述&#xff0c;LE里面包含下面3个大的模块 - LE-WM 仓库管理 / - LE-SHP 发货/ - LE-TRA 运输 2&#xff0c;仓库的结构 - 仓库番号 / -保管域Type(存储区域)/ - 保管区画(存储区)/ - 棚番&#xff08;Storage Bin 仓位&…...

Span<T> 是 C# 7.2 引入的重要类型

Span<T> 是 C# 7.2 引入的一个非常重要的类型&#xff0c;它提供了一种低开销、类型安全的方式来操作连续的内存区域。Span<T> 本质上是一个结构体&#xff0c;它封装了一个内存段的引用&#xff08;通过指针&#xff09;以及该内存段的长度。由于它直接操作内存&a…...

Python办公自动化:初识 `openpyxl`

1.1 什么是 openpyxl&#xff1f; openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。它允许我们通过 Python 脚本自动化处理 Excel 文件&#xff0c;包括创建新的工作簿、修改现有的工作簿、格式化单元格、处理公式和图表等功能。这对于办公自动化、…...

Pocketbase实战体验:内置数据库与实时功能如何超越传统MySQL

Pocketbase 是一个开源的实时后端服务器&#xff0c;内置了数据库、实时订阅、用户认证、RESTful API 等功能&#xff0c;而 MySQL 是一个广泛使用的关系数据库管理系统。以下是 Pocketbase 相对于 MySQL 的一些潜在优点&#xff1a; 完整的后端解决方案 一体化&#xff1a;P…...