尚硅谷rabbitmq2024 集群篇仲裁队列 第52节 答疑
我们希望创建一个队列,队列分布在各个节点上,仲裁队列很好的解决了这个问题.那么在仲裁队列之前,创建一个队列,队列不是分布在各个节点上的吗?
在RabbitMQ中,默认情况下创建的队列是“普通队列”,这些队列并不会自动分布在多个节点上。默认的普通队列是由一个单一节点来管理的,这意味着如果该节点出现故障,队列和其消息将不可用。这种单节点管理的队列在高可用性方面存在一定的局限性。
仲裁队列(Quorum Queues)是RabbitMQ 3.8引入的一种新的队列类型,专门为高可用性和数据一致性而设计。仲裁队列使用Raft共识算法来确保消息在多个节点上复制和存储,从而提高了队列的可用性和数据的安全性。
### 普通队列与仲裁队列的区别
1. **普通队列**:
- 由一个单一节点管理。
- 如果该节点失败,队列和消息将不可用,除非手动恢复或使用镜像队列。
2. **仲裁队列**:
- 使用Raft共识算法在多个节点上复制消息。
- 提供更高的可用性和数据一致性。
- 自动处理节点故障,确保队列和消息在集群中依然可用。
### 创建普通队列和仲裁队列的示例
**普通队列**:
```java
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue myQueue() {
return new Queue("myQueue", true); // true表示队列持久化
}
}
```
**仲裁队列**:
```java
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue myQuorumQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-queue-type", "quorum");
return new Queue("myQuorumQueue", true, false, false, args);
}
}
```
在这个示例中,通过设置`x-queue-type`为`quorum`,我们创建了一个仲裁队列。这个队列会自动在多个节点上复制和存储消息,从而提供更高的可用性。
希望这些信息能帮助你理解普通队列和仲裁队列之间的区别以及如何创建它们。如果有其他问题,随时问我!
===========
1. **普通队列**:
- 由一个单一节点管理。
- 如果该节点失败,队列和消息将不可用,除非手动恢复或使用镜像队列。
没有仲裁队列能搭建集群吗?搭建了集群,是每个节点上队列都是一样的?然后一个节点坏了集群就不可用了?那这种集群还有什么意义呢?
----
在RabbitMQ中,除了仲裁队列(Quorum Queues),还有另一种机制来实现高可用性,这就是镜像队列(Mirrored Queues)。虽然普通队列默认情况下是由单一节点管理的,但通过配置镜像队列,可以在多个节点上复制队列和消息,从而提高系统的容错性和可用性。
### 镜像队列(Mirrored Queues)
镜像队列通过在多个节点上复制队列来实现高可用性。你可以配置一个队列,使其在集群中的多个节点上都有副本(镜像)。如果管理队列的主节点发生故障,RabbitMQ会自动将队列的管理切换到一个镜像节点,从而确保队列和消息的可用性。
### 集群的意义
即使没有仲裁队列,RabbitMQ集群仍然具有以下几个重要的意义:
1. **负载均衡**:
集群可以分散消息的发布和消费负载,防止单一节点成为瓶颈。
2. **高可用性**:
通过使用镜像队列,可以在多个节点上复制队列和消息,从而提高系统的容错性。
3. **扩展性**:
集群可以通过添加更多节点来扩展系统的处理能力和存储容量。
### 镜像队列配置示例
可以通过策略来配置镜像队列。例如,使用RabbitMQ的管理插件(如`rabbitmqctl`或Web管理界面)来设置策略:
```bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
```
这个命令会将所有队列设置为镜像队列,并在所有节点上复制。
### 镜像队列与仲裁队列的对比
- **镜像队列**:
- 可以在多个节点上复制队列和消息。
- 使用经典的主-从复制机制。
- 需要手动配置策略。
- **仲裁队列**:
- 使用Raft共识算法在多个节点上复制消息。
- 提供更高的一致性和自动化的故障恢复。
- 适用于需要高可用性和数据一致性的场景。
### 总结
即使没有仲裁队列,通过镜像队列机制,RabbitMQ集群仍然可以提供高可用性和负载均衡。镜像队列确保了即使一个节点发生故障,队列和消息仍然可用,从而提高系统的可靠性。
如果你需要更高的一致性和自动化的故障恢复,可以考虑使用仲裁队列。希望这些信息能帮助你理解RabbitMQ集群的意义和高可用性机制。如果有其他问题,随时问我!
=========
所以搭建一个集群。我用了haproxy,还将节点加入了 集群,但是如果没有配置镜像或者仲裁队列的话,这个集群也不可用吗?
---
如果你已经搭建了一个RabbitMQ集群并使用了HAProxy进行负载均衡,但没有配置镜像队列或仲裁队列,那么默认情况下,队列和消息将只存在于创建它们的单个节点上。这种情况下,集群的高可用性特性将无法充分发挥作用。
### 集群在没有镜像或仲裁队列的情况下的行为
1. **单节点故障**:
- 如果一个节点故障,所有在该节点上创建的队列和消息将不可用,直到该节点恢复。
- 其他节点上的队列和消息不受影响,但如果这些队列和消息对你的应用来说是关键的,系统的部分功能可能会中断。
2. **负载均衡**:
- HAProxy可以均衡消息发布和消费的负载,但不会自动处理队列的高可用性。
- 即使负载均衡,队列和消息仍然依赖于单个节点。
### 如何确保高可用性
为了确保你的RabbitMQ集群在节点故障时仍然可用,你需要配置镜像队列或使用仲裁队列。以下是如何配置这两种队列的概要:
#### 配置镜像队列
通过策略配置镜像队列,使队列在多个节点上复制:
```bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
```
这个命令会将所有队列设置为镜像队列,并在所有节点上复制。
#### 配置仲裁队列
创建时指定队列类型为“quorum”:
```java
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue myQuorumQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-queue-type", "quorum");
return new Queue("myQuorumQueue", true, false, false, args);
}
}
```
### 总结
如果你没有配置镜像队列或仲裁队列,那么即使你搭建了RabbitMQ集群并使用了HAProxy进行负载均衡,集群的高可用性特性仍然无法充分发挥作用。在这种情况下,单个节点的故障会导致该节点上的队列和消息不可用。
为了确保高可用性,建议你配置镜像队列或使用仲裁队列。这样可以确保队列和消息在多个节点上复制,从而在节点故障时仍然可用。如果有其他问题或需要进一步的帮助,随时问我!
========
那我就先说在没有镜像或者仲裁队列的情况下,集群是什么情况,haproxy负载均衡了之后,发送一个3个消息到某个队列上,是每个节点上都有3个消息,还是每个节点上有一个1个消息?是每个节点上都有3个消息,和广播有什么区别?如果每个节点上有一个1个消息,不就是仲裁队列的效果了吗?
在没有配置镜像队列或仲裁队列的情况下,RabbitMQ集群的行为如下:
### 消息分配和存储
1. **队列的创建和存储**:
- 队列是创建在某个具体的节点上的,并且默认情况下不会自动复制到其他节点。
- 如果你通过HAProxy发送消息到一个队列,该队列仍然只存在于一个节点上。
2. **消息的发送**:
- 当你发送消息到某个队列时,消息会被存储在该队列所在的节点上。
- 消息不会自动分发到集群中的其他节点。
### 负载均衡的行为
HAProxy的负载均衡仅影响客户端连接和请求的分配,而不改变RabbitMQ队列和消息的存储机制。具体来说:
- 如果你通过HAProxy连接到RabbitMQ集群,HAProxy会根据配置将你的连接分配到不同的节点。
- 但是,消息仍然会被发送到你指定的队列,而该队列只存在于创建它的节点上。
### 具体情况分析
假设你有一个RabbitMQ集群,包含节点A、B和C,并且你通过HAProxy发送消息到一个名为`myQueue`的队列:
1. **队列创建**:
- `myQueue`在节点A上创建。
2. **消息发送**:
- 你发送3条消息到`myQueue`。
- 这3条消息将全部存储在节点A上,因为`myQueue`只存在于节点A。
### 没有镜像或仲裁队列的情况下的集群行为
- **每个节点上都有3个消息**:这种情况不会发生,因为默认情况下队列和消息不会自动复制到其他节点。
- **每个节点上有一个消息**:这种情况也不会发生,因为消息是发送到队列所在的节点上,而不是分散到不同的节点。
- **每个节点上都有3个消息,与广播的区别**:在默认配置下,消息不会广播到所有节点。广播是一种特殊的消息传递模式,不适用于默认的队列行为。
### 总结
在没有配置镜像队列或仲裁队列的情况下:
- 队列和消息是单节点存储的。
- HAProxy可以均衡客户端连接,但不会改变队列和消息的存储位置。
- 发送到某个队列的消息只会存储在该队列所在的节点上,不会自动分发到其他节点。
为了实现高可用性和消息复制,你需要配置镜像队列或使用仲裁队列。希望这些信息能帮助你理解RabbitMQ集群在不同配置下的行为。如果有其他问题,随时问我!
==========
一般haproxy负载均衡到集群中每个节点,比如3个节点 a b c, a b c上都有队列q1,而只有a上有q2,然后我发3个消息到q1,根据负载均衡,不是a b c上各有一个消息,还不同,a上第一个消息,b上第二个消息。。而发送3个消息到q2队列是不是 所有消息都到a上了?但是根据负载均衡,应该第一个消息发到a了,后面两个发送到b和c,由于找不到队列,就丢失到 死信队列了.是这样吗?不然能怎样?
在RabbitMQ集群中,HAProxy负载均衡主要用于分配客户端连接到不同的节点,而不是直接用于消息的分发和存储。因此,理解RabbitMQ集群在没有配置镜像队列或仲裁队列的情况下的行为非常重要。
### RabbitMQ集群中的队列和消息存储
1. **队列的创建和存储**:
- 队列是创建在某个具体的节点上的,并且默认情况下不会自动复制到其他节点。
- 如果你通过HAProxy发送消息到一个队列,该队列仍然只存在于一个节点上。
2. **消息的发送**:
- 当你发送消息到某个队列时,消息会被存储在该队列所在的节点上。
- 消息不会自动分发到集群中的其他节点。
### 负载均衡的行为
HAProxy的负载均衡仅影响客户端连接和请求的分配,而不改变RabbitMQ队列和消息的存储机制。具体来说:
- 如果你通过HAProxy连接到RabbitMQ集群,HAProxy会根据配置将你的连接分配到不同的节点。
- 但是,消息仍然会被发送到你指定的队列,而该队列只存在于创建它的节点上。
### 具体情况分析
假设你有一个RabbitMQ集群,包含节点A、B和C,并且你通过HAProxy发送消息到一个名为`q1`的队列,而`q1`在每个节点上都存在,但`q2`只存在于节点A:
1. **队列创建**:
- `q1`在节点A、B和C上都存在。
- `q2`只在节点A上存在。
2. **消息发送**:
- 你发送3条消息到`q1`。
- 根据HAProxy的负载均衡策略,客户端连接可能会被分配到节点A、B和C中的任意一个。
- 假设HAProxy将每个消息的发送请求分配给不同的节点,那么消息会被发送到`q1`
### 负载均衡和消息分发的具体情况
#### 发送消息到存在于所有节点上的队列(例如 `q1`)
假设 `q1` 队列在节点 A、B 和 C 上都存在,并且你通过 HAProxy 发送 3 条消息到 `q1`:
1. **HAProxy 负载均衡**:
- HAProxy 会根据其配置的负载均衡策略(如轮询、最少连接等)将客户端连接分配给不同的节点。
- 假设 HAProxy 使用轮询策略,3 条消息的发送请求会依次分配给节点 A、B 和 C。
2. **消息存储**:
- **消息 1**:通过 HAProxy 被分配到节点 A,存储在节点 A 的 `q1` 队列中。
- **消息 2**:通过 HAProxy 被分配到节点 B,存储在节点 B 的 `q1` 队列中。
- **消息 3**:通过 HAProxy 被分配到节点 C,存储在节点 C 的 `q1` 队列中。
因此,每个节点上的 `q1` 队列各自存储了一条消息。
#### 发送消息到只存在于一个节点上的队列(例如 `q2`)
假设 `q2` 队列只存在于节点 A 上:
1. **HAProxy 负载均衡**:
- HAProxy 会将客户端连接分配给不同的节点,但由于 `q2` 只存在于节点 A 上,只有通过节点 A 的连接才能成功发送消息到 `q2`。
2. **消息存储**:
- **消息 1**:通过 HAProxy 被分配到节点 A,成功存储在节点 A 的 `q2` 队列中。
- **消息 2**:通过 HAProxy 被分配到节点 B,由于节点 B 上没有 `q2` 队
好的,继续讨论发送消息到只存在于一个节点上的队列(例如 `q2`)的情况。
### 发送消息到只存在于一个节点上的队列(例如 `q2`)
假设 `q2` 队列只存在于节点 A 上:
1. **HAProxy 负载均衡**:
- HAProxy 会将客户端连接分配给不同的节点,但由于 `q2` 只存在于节点 A 上,只有通过节点 A 的连接才能成功发送消息到 `q2`。
2. **消息存储**:
- **消息 1**:通过 HAProxy 被分配到节点 A,成功存储在节点 A 的 `q2` 队列中。
- **消息 2**:通过 HAProxy 被分配到节点 B,由于节点 B 上没有 `q2` 队列,消息发送失败。
- **消息 3**:通过 HAProxy 被分配到节点 C,由于节点 C 上没有 `q2` 队列,消息发送失败。
### 消息发送失败的处理
在 RabbitMQ 中,当消息发送失败时,可以采取以下几种处理方式:
1. **丢弃消息**:
- 如果没有配置任何处理机制,消息发送失败后将被丢弃。
2. **返回给生产者**:
- 可以配置 RabbitMQ 将发送失败的消息返回给生产者。生产者可以选择重新发送消息或进行其他处理。
3. **死信队列(Dead Letter Queue)**:
- 可以配置死信队列,将发送失败的消息路由到死信队列进行后续处理。
### 配置死信队列的示例
以下是一个配置死信队列的示例:
#### 声明死信交换机和死信队列
```java
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange("deadLetterExchange");
}
@Bean
public Queue
==============
那用了仲裁队列,我 写springboot程序,连接集群,还要把每个节点的ip都写上吗?redis和elasticsearch好像不是这样吧?而且一个rabbitmq节点 宕机了,虽然 还能收发消息,但是java程序里面 好像会报个错?
是的,使用仲裁队列(Quorum Queues)可以提高RabbitMQ集群的高可用性和数据一致性,但在连接和配置方面确实需要注意一些细节。
### 连接RabbitMQ集群
在Spring Boot应用程序中连接RabbitMQ集群时,确实需要提供集群中所有节点的IP地址,以便在一个节点宕机时,客户端能够自动切换到其他可用节点。这与Redis和Elasticsearch的行为类似,尽管它们的客户端可能会隐藏一些配置细节。
### Spring Boot中的连接配置
在Spring Boot中,可以使用`spring.rabbitmq.addresses`属性来配置集群节点的地址。这个属性允许你指定一个逗号分隔的节点列表。
```yaml
spring:
rabbitmq:
addresses: amqp://user:password@node1:5672,amqp://user:password@node2:5672,amqp://user:password@node3:5672
username: user
password: password
```
### 自动重连和错误处理
RabbitMQ客户端(如Spring AMQP和RabbitMQ Java客户端)通常会处理连接的自动重连,但在某些情况下,仍然可能会遇到错误或异常。这些错误通常是暂时性的,并且客户端会尝试重新连接到集群中的其他节点。
#### 处理连接错误
在Spring Boot中,可以通过配置连接工厂的属性来调整重连策略。例如,可以设置连接超时、重试间隔等参数。
```java
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses("node1:5672,node2:5672,node3:5672");
connectionFactory.setUsername("user");
connectionFactory.setPassword("password");
connectionFactory.setConnectionTimeout(30000); // 30秒连接超时
connectionFactory.setRequestedHeartBeat(
### 处理连接错误和自动重连
在Spring Boot中,可以通过配置连接工厂的属性来调整重连策略。例如,可以设置连接超时、重试间隔等参数。以下是一个详细的配置示例:
#### 配置连接工厂
```java
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses("node1:5672,node2:5672,node3:5672");
connectionFactory.setUsername("user");
connectionFactory.setPassword("password");
connectionFactory.setConnectionTimeout(30000); // 30秒连接超时
connectionFactory.setRequestedHeartBeat(30); // 30秒心跳间隔
connectionFactory.setPublisherConfirms(true); // 启用发布确认
connectionFactory.setPublisherReturns(true); // 启用发布返回
return connectionFactory;
}
}
```
#### 配置重试机制
可以通过配置Spring Retry来处理连接失败后的重试逻辑。以下是一个示例:
```java
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
@Configuration
public class RabbitMQRetryConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setRetryTemplate(retryTemplate());
return template;
}
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
// 配置重试策略策略
SimpleRetryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5); // 最大重试次数
retryTemplate.setRetryPolicy(retryPolicy);
// 配置退避策略
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(1000); // 初始间隔时间(毫秒)
backOffPolicy.setMultiplier(2.0); // 每次重试间隔的倍数
backOffPolicy.setMaxInterval(10000); // 最大间隔时间(毫秒)
retryTemplate.setBackOffPolicy(backOffPolicy);
return retryTemplate;
}
}
```
### 总结
1. **连接配置**:在Spring Boot中,通过`spring.rabbitmq.addresses`属性配置RabbitMQ集群的所有节点地址,以确保客户端能够在一个节点宕机时自动切换到其他可用节点。
2. **自动重连**:RabbitMQ客户端通常会处理自动重连,但可以通过配置连接工厂的属性来调整重连策略,例如连接超时、心跳间隔等。
3. **重试机制**:使用Spring Retry配置重试策略和退避策略,以处理连接失败后的重试逻辑。
通过这些配置,可以确保你的Spring Boot应用在连接RabbitMQ集群时具备更高的可用性和容错性。如果有其他问题或需要进一步的帮助,随时问我!
相关文章:

尚硅谷rabbitmq2024 集群篇仲裁队列 第52节 答疑
我们希望创建一个队列,队列分布在各个节点上,仲裁队列很好的解决了这个问题.那么在仲裁队列之前,创建一个队列,队列不是分布在各个节点上的吗? 在RabbitMQ中,默认情况下创建的队列是“普通队列”࿰…...

《Spring Cloud 微服务:构建高效、灵活的分布式系统》
《Spring Cloud 微服务:构建高效、灵活的分布式系统》 一、引言 在当今快速发展的数字化时代,软件系统的规模和复杂性不断增加。为了应对这种挑战,微服务架构应运而生。Spring Cloud 作为构建微服务架构的强大工具集,提供了一系…...

OpenFeign 入门与实战:快速搭建 Spring Cloud 微服务客户端
1. 前言 随着微服务架构的流行,服务之间的通信变得越来越重要。Spring Cloud 提供了一系列工具来帮助开发者构建分布式系统,其中 OpenFeign 是一个轻量级的 HTTP 客户端,它简化了 Web 服务客户端的开发。本文将介绍如何在 Spring Cloud 应用…...

上门按摩系统开发方案源码搭建
上门按摩系统开发方案 一、项目概述 上门按摩系统是一个连接按摩技师和客户的平台,旨在提供便捷、高效的上门按摩服务。通过该系统,客户可以轻松预约合适的按摩技师,并享受个性化的按摩服务。 二、系统功能模块 用户管理模块:…...

【数据结构】宜宾大学-计院-实验四
栈和队列之(栈的基本操作) 实验目的:实验内容:实验结果:实验报告:(及时撰写实验报告):实验测试结果:代码实现1.0:(C/C)【含注释】代码…...

selenium的IDE插件进行录制和回放并导出为python/java脚本(10)
Selenium IDE:Selenium Suite下的开源Web自动化测试工具,是Firefox或者chrome的一个插件,具有记录和回放功能,无需编程即可创建测试用例,并且可以将用例直接导出为可用的python/java等编程语言的脚本。 我们以chrome浏…...

从0到1封装一个image/pdf预览组件
iShot_2024-10-14_16.47.10 目录结构 content.vue <template><div class"no-content-block"><i class"iconfont icondocument large-file" /><div class"text-wrapper">{{ t(__ui__.siPreview.previewSupported) }}<…...

Android build子系统(02)Ninja语法与复杂依赖构建解读
说明:本文将解读Ninja构建系统的基础语法和应用,同时给出一些示例便于理解和学习;给出一个复杂构建的基础demo,通过这个demo的分析理解复杂构建的内在逻辑和build.ninja编写法则;最后扩展之前Android Framework中构建b…...

JavaScript的第三天
目录 JS中的循环,使某些代码重复执行 一、for循环:重复执行某段代码,通常用于计数 1、for的语法结构 2、代码解析 3、代码尝试 4、循环重复相同的代码,可以让用户控制输出的次数(对该变量进行遍历) 5、循环…...

初识git · 有关模型
目录 前言: 有关开发模型 前言: 其实文章更新到这里的时候,我们已经学习了可以满足我们日常生活中的基本需求的指令了,但是为什么要更新本篇文章呢?是因为实际生活中我们对于开发工作,运维工作ÿ…...

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...

解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)
机器视觉产业链全景回顾 视觉引导机器人生态系统或产业链分为三个层次。 上游(供应商) 该机器人视觉系统的上游包括使其得以运行的硬件和软件提供商。硬件提供商提供工业相机、图像采集卡、图像处理器、光源设备(LED)、镜头、光…...

CORS预检请求配置流程图 srpingboot和uniapp
首先要会判断预检请求 还是简单请求 简单请求 预检请求 #mermaid-svg-1R9nYRa7P9Pll4AK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1R9nYRa7P9Pll4AK .error-icon{fill:#552222;}#mermaid-svg-1R9nYRa7P9Pll4…...

用Spring AI 做智能客服,基于私有知识库和RAG技术
Java智能客服系统运用RAG技术提升答疑精准度 基于Spring ai 的 RAG(检索增强生成)技术,Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。 它的核心思路是: 首先,将客服QA以Word形式导入到系统中&…...

TemporalBench:一个专注于细粒度时间理解的多模态视频理解的新基准。
2024-10-15,由威斯康星大学麦迪逊分校、微软研究院雷德蒙德等机构联合创建了TemporalBench,它通过大约10K个视频问答对,提供了一个独特的测试平台,用以评估各种时间理解和推理能力,如动作频率、运动幅度、事件顺序等。…...

网友提问:网上申请流量卡不通过怎么办?
网上申请流量卡不通过怎么办?网上办理流量卡不通过,说明你不符合办理此套餐的要求,可以选择其他套餐,或者其他运营商的流量卡申请试试。 我们不管是在京*、淘*、拼**哪个网站申请的流量卡,提交的申请信息都是由运营商…...

JavaWeb 22.Node.js_简介和安装
有时候,后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务&a…...

APIJSON的使用
APIJSON是一个用于简化后端接口开发的工具,在Java中可以按照以下步骤使用: 1. 引入依赖 在Java项目中,需要引入APIJSON的相关依赖。如果使用Maven,可以在pom.xml文件中添加以下依赖: <dependency><groupId…...

简单三步完成 Telegram 生态的 Web3 冷启动
在竞争激烈的 Web3 领域,强有力的启动往往能决定成败。Telegram 无疑当下最火热的流量池,是很多 Web3 项目冷启动阶段的必选项。 但眼看着好多项目在 Telegram 生态火速获取百万级甚至千万级别的用户,自己的项目要怎么开始做增长,…...

Go Wails 学习笔记:创建第一个项目
文章目录 1. 安装 Wails2. 创建 Wails 项目3. 项目结构4. 运行项目5. 构建项目6. 部署和发布总结 Wails 是一个用于构建跨平台桌面应用程序的框架,允许开发者使用前端技术(如 HTML、CSS、JavaScript)以及 Go 语言来开发桌面应用。本文基于官方…...

Postman使用-基础篇
前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API,详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前,先聊一下为什么接口测试在现软件行业如此重要? 为什么我们要学习Postman? 现代软件…...

LeetCode 202.快乐数
LeetCode 202.快乐数 C 思路: 用快慢指针来进行解答,可以将其看做一个回环链表,慢指针完成一次平方和操作,快指针完成两次平方和操作,当快慢指针相遇时,判断快慢指针是否为1(为1以后无论怎么取平方和都会为…...

Redis-03 持久化(RDB, AOF,混合持久化)及原理
1,持久化 Redis的持久化是必须的,当Redis服务宕机后,如果没有持久化,重启服务后redis中的数据都将丢失,所有的数据操作都将直连数据库,系统性能会大幅降低,所以在使用Redis做缓存服务时必须持久…...

TikTok账号策略:IP和网络环境的要求分析
在当今社交媒体迅猛发展的时代,TikTok作为一款短视频平台,凭借其独特的算法和庞大的用户基础,吸引了越来越多的内容创作者和营销人员。成功地运营一个TikTok账号,除了优质的内容创作外,良好的IP和网络环境也至关重要。…...

vue后台管理系统从0到1(5)
文章目录 vue后台管理系统从0到1(5)完善侧边栏修改bug渲染header导航栏 vue后台管理系统从0到1(5) 接上一期,我们需要完善我们的侧边狼 完善侧边栏 我们在 element 组件中可以看见,这一个侧边栏是符合我们…...

OpenAI的新功能Canvas,效果还不错
时隔两年,ChatGPT终迎来界面全新升级! 这一次,OpenAI官宣推出类似 Anthropic 的 Artifacts 的界面交互功能 canvas,并称这是一种使用 ChatGPT 写作和编程的新方式。不论是写作,还是编码,都可以开启全新的交…...

了解一些常用的Javascript对象方法
javascript 的对象包含许多有用的方法,可以帮助开发人员轻松操作对象。让我们通过简短的解释和示例来了解一些最重要的内容 object.create()object.assign()object.keys()object.values()object.entries()object.freeze()object.seal()object.preventextensions()o…...

【知识科普】GraphQL一个强大的API查询语言
文章目录 概述📚 GraphQL 的类型系统是如何工作的?🔍 能否举例说明 GraphQL 的类型系统在实际应用中是如何工作的?位置步骤 1: 定义类型步骤 2: 实现解析器步骤 3: 客户端查询步骤 4: 执行查询 🛠️ 在实际开发中&…...

Spring Boot 整合达梦
Maven 依赖 <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.192</version></dependency> yml配置 datasource:master:url: jdbc:dm://192.168.211.113:30236username: WE…...

Vue.js 组件开发基本步骤
Vue.js 是一个构建用户界面的渐进式框架,它被设计为能够轻松地被集成进项目的部分功能,或者用于构建完整的前端应用。组件化是 Vue.js 的核心概念之一,它允许开发者将界面拆分成独立、可复用的组件,每个组件负责应用中的一小部分功…...