RabbitMQ 集群与高可用性

目录

单节点与集群部署

1.1. 单节点部署

1.2. 集群部署

 镜像队列

1.定义与工作原理

2. 配置镜像队列

3.应用场景

4. 优缺点

5. Java 示例

分布式部署

1. 分布式部署的主要目标

2. 典型架构设计

3. RabbitMQ 分布式部署的关键技术

4. 部署策略和实践

5. 分布式部署的挑战和解决方案

6.使用Docker Compose 实现分布式部署

总结


前言

RabbitMQ 是一个广泛使用的消息队列系统,具有强大的集群和高可用性特性。以下是有关 RabbitMQ 集群与高可用性方面的详细解析,涵盖了单节点与集群部署、镜像队列、以及分布式架构的部署策略和最佳实践。

单节点与集群部署

1.1. 单节点部署

定义
RabbitMQ 的单节点部署是指在一台服务器上运行一个 RabbitMQ 实例。它适用于开发、测试环境或对高可用性要求不高的场景。

工作原理
在单节点中,所有消息和队列都集中在一个 RabbitMQ 实例上。如果该实例出现故障,则会导致消息服务不可用。

优缺点

  • 优点

    • 简单易用,部署和管理成本低。
    • 适合小规模应用和开发测试场景。
  • 缺点

    • 没有冗余,存在单点故障风险。
    • 扩展性差,难以应对高并发和大流量需求。

应用场景

  • 开发和测试环境。
  • 对消息丢失或短暂服务中断容忍度较高的生产环境。

配置方式

  • 在单台服务器上安装 RabbitMQ。
  • 通过管理插件或命令行工具进行简单的管理和监控。

示例

  • 使用 Docker 启动单节点 RabbitMQ:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

详细可参考之前的文章:

RabbitMQ入门基础及使用Docker安装

1.2. 集群部署

定义
RabbitMQ 集群由多个 RabbitMQ 节点组成,这些节点协同工作以提供更高的可用性和可扩展性。

工作原理
集群中的各个节点共享元数据,但消息存储在单个节点上(默认配置)。当一个节点出现故障时,集群中的其他节点仍然可以继续提供服务。

优缺点

  • 优点

    • 提高了系统的可靠性,减少单点故障。
    • 支持横向扩展,能够处理更多的消息和更高的并发量。
  • 缺点

    • 部署和管理相对复杂。
    • 需要额外的网络和存储资源。

应用场景

  • 高可用性要求高的生产环境。
  • 大流量、大并发的分布式系统。

配置方式一

1. 创建网络

docker network create rabbitmq-network

创建一个 Docker 自定义网络,名为 rabbitmq-network。此网络用于让各个 RabbitMQ 容器节点能够相互通信。Docker 网络确保节点之间的容器可以通过容器名互相访问,这对于集群的节点发现和通信至关重要

2. 启动节点1(磁盘节点)

# rabbitmq:3.12-management 镜像名:版本
docker run -d --hostname rabbit1 --name rabbit1 --network rabbitmq-network -e RABBITMQ_ERLANG_COOKIE='my_cookie' -e RABBITMQ_NODENAME=rabbit@rabbit1 -p 15672:15672 -p 5672:5672 rabbitmq:3.12-management
  • -d:后台运行容器。
  • --hostname rabbit1:设置容器的主机名为 rabbit1,这是 RabbitMQ 节点的名称标识。
  • --name rabbit1:设置容器的名称为 rabbit1,用于 Docker 内部管理。
  • --network rabbitmq-network:将容器连接到前面创建的 rabbitmq-network 网络中。
  • -e RABBITMQ_ERLANG_COOKIE='my_cookie':设置 Erlang Cookie,用于节点间的身份验证,确保集群的安全性。
  • -e RABBITMQ_NODENAME=rabbit@rabbit1:设置 RabbitMQ 节点的名称为 rabbit@rabbit1,这个名称在集群中是唯一的。
  • -p 15672:15672-p 5672:5672:分别映射管理界面和 AMQP 协议的端口到宿主机上,允许外部访问。

这是一个磁盘节点(默认),数据会保存在磁盘上。

3.启动节点2(RAM节点)

docker run -d --hostname rabbit2 --name rabbit2 --network rabbitmq-network -e RABBITMQ_ERLANG_COOKIE='my_cookie' -e RABBITMQ_NODENAME=rabbit@rabbit2 rabbitmq:3.12-management

 与启动节点1类似,但不暴露端口,并且这个节点稍后会加入到集群中并设置为 RAM 节点。RAM 节点的数据存储在内存中,适合对性能要求高的场景。

4.将节点2加入集群

docker exec -it rabbit2 bash
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
exit
  • docker exec -it rabbit2 bash:进入 rabbit2 容器的交互式终端。
  • rabbitmqctl stop_app:停止 RabbitMQ 应用,准备加入集群。
  • rabbitmqctl join_cluster rabbit@rabbit1:将 rabbit2 节点加入到 rabbit1 节点所在的集群中。
  • rabbitmqctl start_app:启动 RabbitMQ 应用,使节点成为集群的一部分。
  • exit:退出容器的交互式终端。

5.启动节点3(RAM节点)

docker run -d --hostname rabbit3 --name rabbit3 --network rabbitmq-network -e RABBITMQ_ERLANG_COOKIE='my_cookie' -e RABBITMQ_NODENAME=rabbit@rabbit3 rabbitmq:3.12-management

 启动另一个 RAM 节点 rabbit3,与启动节点2类似。

6.将节点3加入集群

docker exec -it rabbit3 bash
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
exit

与节点2的加入过程相同,将 rabbit3 加入到集群中,使其成为集群的一部分

  • 这组指令搭建了一个包含一个磁盘节点(rabbit1)和两个 RAM 节点(rabbit2 和 rabbit3)的 RabbitMQ 集群。
  • 磁盘节点负责持久化数据,RAM 节点利用内存加快消息的处理速度。
  • 每个节点通过指定的网络相互通信,并通过 Erlang Cookie 进行身份验证。
     

7.启动并访问

注:由于本次启动时并没有指定用户与密码,所以使用默认的guest/guest进行登录即可,也可以自己基于之前的文章 进行添加用户:
RabbitMQ日常运维指令集

 配置方式二

使用 Docker Compose 部署一个简单的 RabbitMQ 集群是一种便捷的方法,可以轻松管理多个 RabbitMQ 节点。以下是详细的步骤,包括如何编写 docker-compose.yml 文件以及配置、启动集群的过程。

1. 准备 docker-compose.yml 文件

首先,创建一个名为 docker-compose.yml 的文件,该文件定义了 RabbitMQ 集群的服务配置:

version: '3.8'
services:rabbit1:image: rabbitmq:3.12-managementcontainer_name: rabbit1hostname: rabbit1environment:RABBITMQ_ERLANG_COOKIE: 'my_cookie'RABBITMQ_NODENAME: 'rabbit@rabbit1'ports:- "15672:15672"  # 管理界面端口- "5672:5672"    # AMQP 协议端口networks:- rabbitmq_networkvolumes:- rabbit1_data:/var/lib/rabbitmqrabbit2:image: rabbitmq:3.12-managementcontainer_name: rabbit2hostname: rabbit2environment:RABBITMQ_ERLANG_COOKIE: 'my_cookie'RABBITMQ_NODENAME: 'rabbit@rabbit2'networks:- rabbitmq_networkvolumes:- rabbit2_data:/var/lib/rabbitmqrabbit3:image: rabbitmq:3.12-managementcontainer_name: rabbit3hostname: rabbit3environment:RABBITMQ_ERLANG_COOKIE: 'my_cookie'RABBITMQ_NODENAME: 'rabbit@rabbit3'networks:- rabbitmq_networkvolumes:- rabbit3_data:/var/lib/rabbitmqnetworks:rabbitmq_network:volumes:rabbit1_data:rabbit2_data:rabbit3_data:

docker-compose.yml 文件说明

  • version: 3.8 指定了 Docker Compose 文件的版本。
  • services: 定义了三个 RabbitMQ 服务 rabbit1rabbit2rabbit3,分别对应三个节点。
  • image: 使用 rabbitmq:3-management 镜像,包含 RabbitMQ 和管理插件。
  • container_name: 每个服务对应的容器名称。
  • hostname: 指定每个 RabbitMQ 节点的主机名,这对于集群中的节点名称是必要的。
  • environment: 配置环境变量:
    • RABBITMQ_ERLANG_COOKIE: Erlang Cookie,用于节点间的通信和认证。
    • RABBITMQ_NODENAME: 节点名称,必须唯一。
  • ports: 将 RabbitMQ 的管理界面和 AMQP 端口映射到宿主机上。
  • networks: 使用自定义的 rabbitmq_network 网络,以确保各节点之间可以互相通信。
  • volumes: 为每个节点配置持久化存储,以便重启后数据不会丢失。

2.启动集群

在包含 docker-compose.yml 文件的目录下,运行以下命令以启动集群:

docker-compose up -d

 此命令将在后台启动所有定义的 RabbitMQ 节点,并且这些节点将自动连接到同一个 Docker 网络 rabbitmq_network

验证集群

要验证集群是否正常运行,可以通过以下步骤:

检查服务状态

查看所有运行的容器,确保三个 RabbitMQ 容器都在运行:

docker ps

检查集群状态

进入 rabbit1 容器并检查集群状态:

docker exec -it rabbit1 bash
rabbitmqctl cluster_status

停止和删除集群

要停止并删除容器及其相关的网络和卷,运行以下命令:

docker-compose down -v

-v 选项将删除创建的卷,确保数据被清除。

 镜像队列

1.定义与工作原理

镜像队列是指将主节点的队列内容同步到集群中的其他节点上。当消费者从队列消费消息时,消息会从主节点发送,镜像节点会同步地更新其状态。如果主节点出现故障,RabbitMQ 会自动将其中一个镜像节点提升为新的主节点,从而继续处理队列中的消息。

工作原理

  • 主队列(Master Queue):在集群中的某个节点上维护的队列。
  • 镜像节点(Mirror Nodes):集群中的其他节点,它们会保持主队列的完整副本。
  • 故障切换(Failover):当主队列所在节点宕机时,RabbitMQ 自动选择一个镜像节点作为新的主队列,并继续处理消息。
2. 配置镜像队列

镜像队列可以通过 RabbitMQ 的策略(Policy)来配置。在 RabbitMQ 中,策略通过正则表达式匹配队列名称,然后应用指定的配置项来控制镜像队列的行为。

配置镜像队列的步骤:

  1. 连接到 RabbitMQ 管理界面或通过命令行执行操作。

  2. 创建策略,指定要镜像的队列以及镜像的规则:

    通过 RabbitMQ 管理界面:

    • 进入 "Admin" 选项卡,选择 "Policies"。
    • 创建新的策略,指定名称、匹配队列的正则表达式(如 ^mirrored.*)、配置镜像参数。

    通过命令行:

rabbitmqctl set_policy ha-all "^mirrored.*" '{"ha-mode":"all"}'
  • 以上命令的含义:

    • ha-all:策略名称。
    • ^mirrored.*:匹配队列名称的正则表达式,所有以 mirrored 开头的队列都会应用该策略。
    • {"ha-mode":"all"}:指定将队列镜像到集群中的所有节点。
  • 验证配置

    • 使用 RabbitMQ 管理界面查看队列状态,确认队列已被镜像。
    • 或使用以下命令行查看队列详细信息:
rabbitmqctl list_queues name policy slave_pids
3.应用场景

镜像队列特别适用于以下场景:

  • 高可用性要求高的系统:如金融、医疗等行业,需要保证消息不丢失且系统持续可用。
  • 灾备系统:需要容灾功能,保证在某个节点宕机时,系统仍然可以正常运行。
  • 关键任务应用:不能容忍消息丢失的业务逻辑。
4. 优缺点

优点

  • 高可用性:在节点故障时,自动故障切换确保队列的持续可用性。
  • 数据冗余:消息会在多个节点上存储,有助于防止单点故障导致的数据丢失。

缺点

  • 性能开销:每条消息的操作都需要在多个节点间进行同步,可能会影响吞吐量和延迟。
  • 资源消耗:由于数据在多个节点间复制,需要更多的存储和网络资源。
  • 复杂性:配置和维护镜像队列相对复杂,特别是在集群规模较大时。
5. Java 示例

假设我们有一个需要镜像的队列,以下是使用 Java 和 Spring AMQP 创建并连接到一个镜像队列的示例。

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Beanpublic Queue mirroredQueue() {return QueueBuilder.durable("mirrored.queue").withArgument("x-ha-policy", "all") // 配置为镜像队列.build();}@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {return new RabbitTemplate(connectionFactory);}@Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {return new RabbitAdmin(connectionFactory);}
}

使用了 x-ha-policy 参数来配置队列为镜像队列

分布式部署

分布式部署意味着将 RabbitMQ 节点分布在不同的数据中心、地理位置或网络环境中。这种部署方式适用于需要跨多个地区或数据中心实现高可用性和容灾的场景。

1. 分布式部署的主要目标
  • 容灾:确保在一个数据中心或地理位置发生故障时,系统仍然能够正常运行。
  • 负载均衡:通过分布多个节点,均衡不同区域的请求负载。
  • 数据局部化:为不同区域的用户提供更低延迟的服务。
2. 典型架构设计

分布式部署通常包括以下几种架构模式:

  • 多集群架构:在不同的数据中心或地理位置各自运行一个独立的 RabbitMQ 集群,之间通过某种消息传递机制进行通信,如使用 ShovelFederation 插件。
  • 跨数据中心的集群:在不同的数据中心部署一个跨越数据中心的 RabbitMQ 集群,节点之间通过 WAN 网络进行同步。该方案适合低延迟且带宽足够的环境。
3. RabbitMQ 分布式部署的关键技术

3.1 Shovel 插件

Shovel 插件用于在两个不同的 RabbitMQ 实例或集群之间转发消息。它能有效地在跨网络的 RabbitMQ 实例之间传递消息。

示例配置

# 在 rabbit1 节点上安装并配置 Shovel 插件
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management# 创建 Shovel 配置
rabbitmqctl set_parameter shovel my-shovel \'{"src-uri": "amqp://user:pass@rabbit1/vhost", "src-queue": "queue1", "dest-uri": "amqp://user:pass@rabbit2/vhost", "dest-queue": "queue2"}'

Shovel 插件会从 queue1 拉取消息并转发到 queue2,实现不同 RabbitMQ 实例之间的消息传递。

3.2 Federation 插件

Federation 插件允许不同的 RabbitMQ 集群通过逻辑链接进行消息传递。与 Shovel 不同,Federation 更适合跨地理位置的集群之间建立动态连接。

示例配置

# 在 rabbit1 节点上启用 Federation 插件
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management# 配置 Federation Upstream
rabbitmqctl set_parameter federation-upstream my-upstream '{"uri":"amqp://user:pass@rabbit2/vhost"}'# 配置 Federation Policy
rabbitmqctl set_policy my-federation ".*" \'{"federation-upstream-set":"all"}'

Federation 插件会将消息从一个集群传递到另一个集群。

4. 部署策略和实践

4.1 地理分布式集群

在每个主要地区或数据中心部署一个 RabbitMQ 集群,使用 Federation 或 Shovel 在这些集群之间转发消息。这种策略可以为每个地区的用户提供低延迟服务,并且在一个地区发生故障时,其他地区的服务不受影响。

4.2 多租户架构

在分布式部署中,可以通过虚拟主机(vhost)隔离不同租户的数据和操作。不同租户可以在不同的数据中心有各自的 RabbitMQ 集群,Shovel 或 Federation 可以实现租户数据的跨区域同步。

4.3 数据局部化

根据用户地理位置,将用户请求路由到最近的数据中心。使用分布式 RabbitMQ 结构可以有效减少延迟,提升用户体验。

5. 分布式部署的挑战和解决方案
  • 网络延迟:跨数据中心的通信会受到网络延迟的影响。解决方案包括在低延迟网络上部署节点,或使用本地缓存。
  • 数据一致性:保证跨节点或集群的数据一致性是一个挑战。可以通过消息的持久化和确认机制来减少不一致的风险。
  • 运维复杂性:分布式部署增加了运维的复杂性,需要更复杂的监控、报警和自动化工具来管理。

通过合理的架构设计和技术手段,可以有效地在不同网络环境下实现 RabbitMQ 的分布式部署,从而实现系统的高可用性、容灾和低延迟服务。

6.使用Docker Compose 实现分布式部署

在每个服务器上,创建一个 docker-compose.yml 文件,用于定义 RabbitMQ 服务的配置。假设我们有两台服务器 server1server2

Server 1 的 docker-compose.yml:

version: '3.7'
services:rabbitmq1:image: rabbitmq:3.12-managementcontainer_name: rabbitmq1hostname: rabbit1environment:- RABBITMQ_ERLANG_COOKIE=my_cookie- RABBITMQ_DEFAULT_USER=user- RABBITMQ_DEFAULT_PASS=passwordports:- "15672:15672" # 管理界面- "5672:5672"   # AMQP 端口networks:- rabbitmq-networknetworks:rabbitmq-network:driver: bridge

Server 2docker-compose.yml:

version: '3.7'
services:rabbitmq2:image: rabbitmq:3.12-managementcontainer_name: rabbitmq2hostname: rabbit2environment:- RABBITMQ_ERLANG_COOKIE=my_cookie- RABBITMQ_DEFAULT_USER=user- RABBITMQ_DEFAULT_PASS=passwordports:- "15672:15672" # 管理界面- "5672:5672"   # AMQP 端口networks:- rabbitmq-networknetworks:rabbitmq-network:driver: bridge

部署 RabbitMQ 实例

server1server2 上分别运行以下命令来启动 RabbitMQ 服务:

docker-compose up -d

这将在每个服务器上启动一个 RabbitMQ 实例。

4. 配置 Shovel 插件或 Federation 插件

接下来,使用 ShovelFederation 插件来连接这两个分布式的 RabbitMQ 实例。

使用 Shovel 插件配置消息传递

server1 上:

docker exec -it rabbitmq1 bash
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management
rabbitmqctl set_parameter shovel my-shovel \'{"src-uri": "amqp://user:password@rabbit1/vhost", "src-queue": "queue1", "dest-uri": "amqp://user:password@rabbit2/vhost", "dest-queue": "queue2"}'

server2 上:

docker exec -it rabbitmq2 bash
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management
rabbitmqctl set_parameter shovel my-shovel \'{"src-uri": "amqp://user:password@rabbit2/vhost", "src-queue": "queue2", "dest-uri": "amqp://user:password@rabbit1/vhost", "dest-queue": "queue1"}'

使用 Federation 插件配置消息传递

server1 上:

docker exec -it rabbitmq1 bash
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
rabbitmqctl set_parameter federation-upstream my-upstream \'{"uri":"amqp://user:password@rabbit2/vhost"}'
rabbitmqctl set_policy my-federation ".*" \'{"federation-upstream-set":"all"}'

 在 server2 上:

docker exec -it rabbitmq2 bash
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
rabbitmqctl set_parameter federation-upstream my-upstream \'{"uri":"amqp://user:password@rabbit1/vhost"}'
rabbitmqctl set_policy my-federation ".*" \'{"federation-upstream-set":"all"}'

总结

  • 单节点与集群部署:单节点适用于开发和测试环境,集群部署用于生产环境,提高了系统的可靠性和可扩展性。
  • 镜像队列:为关键业务场景提供高可用性,确保消息在节点故障时不会丢失。
  • 分布式架构:通过 Federation 和 Shovel 插件,RabbitMQ 可以在不同地理位置的集群间实现消息的传递,适用于复杂的分布式系统。

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

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

相关文章

前端开发学习Docker记录01镜像操作

Docker相关命令 Demo安装nginx 先搜索然后拉取,然后查看images列表是不是拉取成功 docker search nginxdocker pull nginx特定某个版本,镜像名:版本号 docker images

layui2.9 树组件默认无法修改节点图标,修改过程记录下

官方文档树组件 data 参数值&#xff0c;未提供icon属性配置 需要修改源码 layui.js, 搜索图片中标记部分 查找到之后&#xff0c;修改为 <i class“‘(i.icon || “layui-icon layui-icon-file”)’”> 如图&#xff1a; 修改完成后&#xff0c;即可在data中添加icon…

redis学习笔记 ——redis中的四大特殊数据结构

一.前言 在之前的学习中&#xff0c;我们已经介绍了Redis中常见的五种基本的数据结构&#xff0c;而今天我们就要开始介绍Redis的四种特殊的数据结构&#xff0c;它们分别是bitmap(位图)&#xff0c; HyperLogLog(基数统计),Geospatial(地理信息),Stream。 二.位图(Bitmap) …

Windows安装PostgreSQL数据库,保姆级教程

PostgreSQL 是客户端/服务器关系数据库管理系统 (RDMS)。PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff08;RDBMS&#xff09;。PostgreSQL 也有自己的查询语言&#xff0c;称为 pgsql。 此外&#xff0c;PostgreSQL 还支持过程语言&a…

CS224W—07 Machine Learning with Heterogeneous Graphs

CS224W—07 Machine Learning with Heterogeneous Graphs 本节中&#xff0c;我们将学习如何在异构图中进行图神经网络学习。 Heterogeneous Graphs 图中的节点类型/边类型不同&#xff0c;就会形成一个异构图&#xff08;Heterogeneous Graph&#xff09;&#xff0c;例如下…

基于SpringBoot的在线答疑管理系统

基于SpringBootVue的在线答疑管理系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 基于SpringBoot的在线答疑管理系…

如何使用IDEA搭建Mybatis框架环境(详细教程)

文章目录 ☕前言为什么学习框架技术Mybatis框架简介 &#x1f379;一、如何配置Mybatis框架环境1.1下载需要MyBatis的jar文件1.2部署jar文件1.3创建MyBatis核心配置文件configuration.xml1.4.创建持久类(POJO)和SQL映射文件1.5.创建测试类 &#x1f9cb;二、 MyBatis框架的优缺…

Linux下UDP编程

一.概念介绍 1.socket 是什么&#xff1f; socket&#xff08;套接字&#xff09;本质上是一个抽象的概念&#xff0c;它是一组用于网络通信的 API&#xff0c;提供了一种统一的接口&#xff0c;使得应用程序可以通过网络进行通信。在不同的操作系统中&#xff0c;socket 的实…

【Python系列】Jinja2 模板引擎

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【软件测试】软件测试生命周期与Bug

目录 &#x1f4d5; 前言 &#x1f334;软件测试的生命周期 ​编辑&#x1f332;BUG &#x1f6a9; 概念 &#x1f6a9;描述bug的要素 &#x1f6a9;bug的级别 &#x1f6a9;bug的生命周期 &#x1f3c0;先检查自身&#xff0c;是否bug描述不清楚 &#x1f3c0;站在用…

Docker 安装 SqlServer

摘要&#xff1a;我们工作当中经常需要拉取多个数据库实例出来做集群&#xff0c;做测试也好&#xff0c;通过 Docker 拉取 SqlServer 镜像&#xff0c;再通过镜像运行多个容器&#xff0c;几分钟就可以创建多个实例&#xff0c;效率是相当的高。 1. docker 拉取镜像 注意&am…

[mysql]mysql的演示使用

mysql的演示使用 几个常见操作 1&#xff1a;show databases 这里第一个information_schema代表的是数据库的基本系统信息&#xff0c;数据库名称&#xff0c;表的名称&#xff0c;存储权限 第二个是mysql&#xff0c;保存的是我们数据库运行的时候需要的系统信息&#xff0…

数据中台即将消亡,数智基建取而代之?

数据中台即将消亡&#xff0c;数智基建取而代之&#xff1f; 前言数智基建 前言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;企业的发展如同在浩瀚海洋中航行的巨轮&#xff0c;而数据则是推动这艘巨轮前行的强大动力。然而&#xff0c;如何有效地管理和利用数据&#xff0c;…

Kafka3.x 使用 KRaft 模式部署 不依赖 ZooKeeper

前言 Kafka 从 2.8.0 版本开始引入了 Kafka Raft Metadata Mode&#xff08;KRaft 模式&#xff09;&#xff0c;这个模式允许 Kafka 在不依赖 ZooKeeper 的情况下进行元数据管理。KRaft 模式在 Kafka 3.0.0 中进入了稳定版本,本文部署的 Kafka_2.12-3.6.0 单机模式 环境 Ce…

工厂andon暗灯系统数字化应用案例

在当今数字化浪潮席卷制造业的时代&#xff0c;工厂的高效运作和精益管理离不开先进的技术手段。Andon 暗灯系统作为精益制造执行中的核心工具和 MES 制造执行系统的重要组成部分&#xff0c;正以其强大的功能为工厂带来全新的变革。 某汽车零部件制造工厂&#xff0c;拥有多条…

Java设计模式之策略模式详细讲解和案例示范

Java设计模式之策略模式详细讲解和案例示范 在软件开发中&#xff0c;策略模式是一种常见且非常有用的设计模式。它允许定义一系列算法&#xff0c;将它们一个个封装起来&#xff0c;并且使它们可以互相替换。策略模式让算法可以独立于使用它们的客户端而变化。本篇文章将详细…

[MySql]保姆级上手教程

介绍 通过数据库管理系统, 编写执行SQL语句, 实现对数据库数据的管理 数据库(DataBase): 储存和管理数据的仓库数据库管理系统(DBMS): 操作和管理数据库的软件SQL语言: 操作关系型数据库的通用语言数据库可以分为关系型数据库和非关系型数据库 相关产品 常见的关系型数据库产…

【golang-入门】环境配置、VSCode开发环境配置

golang介绍基础信息 windows环境配置安装包下载安装环境变量设置检查 VSCode开发配置插件配置在 Visual Studio Code 中安装通义灵码go hello word 参考资料 golang介绍 基础信息 golang官网&#xff1a;https://go.dev/golang学习网&#xff1a;https://studygolang.com/使用…

android使用YOLOV8数据返回到JAVA方法(JAVA)

一、下载扩展文件(最耗时,所以放第一步) 1.opencv下载 1)官网:Releases - OpenCV 2)下载最新版本的android包 2.NCNN下载 1)NCNN下载地址(20220420版本):https://github.com/Tencent/ncnn/releases/download/20220420/ncnn-20220420-android-vulkan.zip 3.在你的…

【C++二分查找】2271. 毯子覆盖的最多白色砖块数

本文涉及的基础知识点 C二分查找 LeetCode2271. 毯子覆盖的最多白色砖块数 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表…