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

消息队列基础概念及选型,常见解决方案包括消息可靠性、消息有序、消息堆积、重复消费、事务消息

前言

是时候总结下消息队列相关知识点啦!我搓搓搓搓

本文包括消息队列基础概念介绍,常见解决方案包括消息可靠性、消息有序、消息堆积、重复消费、事务消息

参考资料:

Kafka常见问题总结 | JavaGuide

RocketMQ常见问题总结 | JavaGuide

【原创】消息队列的消费语义和投递语义 - 孤独烟 - 博客园

Kafka事务是怎么实现的?Kafka事务消息原理详解(文末送书)-CSDN博客

Kafka/RocketMQ事务消息对比 - 简书

1. 什么是消息队列

消息队列可以看作是存放消息的容器,常用于分布式系统中,在消息的生产者和消费者之间引入一个缓冲区

它的作用主要由三点概括,分别是

  1. 解耦:生产者和消费者之间没有直接的调用关系,新增或者修改模块对其它模块的影响较小
  2. 异步:生产者无需等待消息消费完成就即刻返回,减少用户请求的响应时间
  3. 削峰:在高并发场景,消息队列可以缓存消息,平滑高峰流量,防止系统过载

2. 消息队列有什么常见应用场景

日志处理:将日志发送到消息队列,由日志处理系统进行消费,进行实时分析和监控
电商系统:订单的创建、支付、发货等步骤可以由消息队列进行异步处理和解耦
任务调度:任务调度系统可以将任务发布在消息队列中,由多个不同的节点并行处理
数据同步:消息队列可以将变更的数据同步到不同的存储系统中

3. 常见的消息队列如何选型

常见的消息队列有几种:RabbitMQ、Kafka、RocketMQ

延时来看,RabbitMQ是基于Erlang开发的,延时最低,能达到微秒级别,其它都是毫秒级别

吞吐量来看,Kafka和RocketMQ吞吐量最高,达十万、百万级,RabbitMQ只有万级

定制开发难度来看,RocketMQ是由Java开发的,对于大型公司可以有人手进行定制化开发,而能对RabbitMQ进行定制化开发的较少,但是RabbitMQ社区活跃,能够解决开发上的bug

业务场景来看,RocketMQ基本上经受住了大型企业场景的考验比如双十一,Kafka适用于大数据场景实时分析和日志采集等业务

总结,如果是数据量没有那么大,可以选择功能完备、社区活跃的RabbitMQ,如果有大数据量的金融互联网场景,对可靠性和吞吐量要求都很高,推荐选择RocketMQ,如果是日志采集和大数据实时分析的场景,则推荐使用Kafka

4. 消息队列有什么模型

JMS是一种Java消息服务的API规范,它定义了两种消息模型:队列模型和发布/订阅模型

队列模型又叫点对点模型,指的是生产者往队列里发送消息,一个消息只能被一个消费者消费,一个队列的多个消费者之间是竞争关系

发布/订阅模型又叫主题模型,指生产者往Topic发送消息,所有订阅了该Topic的消费者都能消费到

Kafka和RocketMQ就是基于发布/订阅模型实现的

AMQP是另一种消息服务的协议,它定义了几种消息模型,通过引入exchange完成对消息的路由,支持direct exchange、fanout exchange、topic exchange

RabbitMQ就是基于AMQP协议实现的

5. 如何保证消息不丢失

消息不丢失需要从生产消息、存储消息、消费消息三个方面去保证

5.1 生产消息

在生产者侧,需要处理好生产消息的异常处理,如果写入失败需要有重试、告警等机制

5.2 存储消息

在存储消息上,Broker需要在刷盘之后再给生产者应答

在RocketMQ中,可以配置同步刷盘,主从架构下配置同步复制(也叫同步双写)

在Kafka中,默认acks=1,表示消息被leader副本接受后就会返回成功,设置acks=all,那么在所有的ISR(In-Sync Replicas)接受后才算成功,相关的其它参数有:
replication.factor:分区的副本数,可设置为>=3
min.insync.replicas:消息发送成功需要至少写入的副本数,设置为>1
unclean.leader.election.enable:leader副本故障后的选举机制,false表示不从非ISR节点中选leader,设置为false

5.3 消费消息

消费者在真正完成业务逻辑时再返回成功给Broker

在RocketMQ中,完成消费逻辑后再返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS,否则返回ConsumeConcurrentlyStatus.RECONSUME_LATER

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;public class RocketMQConsumer {public static void main(String[] args) throws Exception {// 实例化消费者,并指定消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("example_consumer_group");// 指定NameServer地址consumer.setNamesrvAddr("localhost:9876");// 订阅一个或多个Topic,以及Tag来过滤需要消费的消息consumer.subscribe("TopicTest", "*");// 注册消息监听器consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {for (MessageExt msg : msgs) {try {// 处理消息的业务逻辑System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msg.getBody()));} catch (Exception e) {// 处理异常,这里可以根据业务需求进行重试或其他处理e.printStackTrace();// 消费失败,返回RECONSUME_LATER,消息会重新投递return ConsumeConcurrentlyStatus.RECONSUME_LATER;}}// 消费成功,返回CONSUME_SUCCESSreturn ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});// 启动消费者实例consumer.start();System.out.printf("Consumer Started.%n");}
}    

在Kafka中,需要设置enable.auto.commit=false,然后在代码中手动提交offset

import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.TopicPartition;import java.time.Duration;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;public class KafkaConsumerExample {public static void main(String[] args) {// 配置消费者属性Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "test-group");props.put("enable.auto.commit", "false");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");// 创建Kafka消费者实例KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);// 订阅主题String topic = "test-topic";consumer.subscribe(Collections.singletonList(topic));try {while (true) {// 拉取消息ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));Map<TopicPartition, OffsetAndMetadata> offsetsToCommit = new HashMap<>();for (ConsumerRecord<String, String> record : records) {try {// 处理消息的业务逻辑System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());// 记录需要提交的偏移量TopicPartition partition = new TopicPartition(record.topic(), record.partition());OffsetAndMetadata offsetAndMetadata = new OffsetAndMetadata(record.offset() + 1);offsetsToCommit.put(partition, offsetAndMetadata);} catch (Exception e) {// 处理异常,这里可以根据业务需求进行重试或其他处理e.printStackTrace();}}// 手动同步提交偏移量if (!offsetsToCommit.isEmpty()) {consumer.commitSync(offsetsToCommit);}}} finally {// 关闭消费者consumer.close();}}
}    

6. 如何解决重复消费

解决重复消费比较粗鲁的办法就是保证一条消息只能被消费一次,但是如果消费者挂了未提交offset,那么为了保证消息可靠性,消息就会被重复消费

所以重点是要让消费者的处理具有幂等性,即多次处理同一条消息得到的结果是一样的

具体做法有引入全局唯一的ID,对已经消费过的消息进行去重

7. 如何保证消息的有序性

简单粗暴的方法是:单一生产者和单一消费者,即消息只由单个生产者发往单个队列,再由单个消费者消费,存在性能瓶颈

在支持分区键(Partition Key)的系统比如Kafka和RocketMQ中,可以在发送消息的时候指定key

在Kafka中在发送消息时指定key,如果需要严格顺序的话,可以指定max.in.flight.requests.per.connection=1,该参数表示在得到响应前可以发送的消息数,参数值越大吞吐量越大,设置为1会降低吞吐量

在RocketMQ中可以通过继承MessageQueueSelector实现

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;import java.util.List;public class RocketMQPartitionKeyProducer {public static void main(String[] args) throws MQClientException {DefaultMQProducer producer = new DefaultMQProducer("partition_key_producer_group");producer.setNamesrvAddr("localhost:9876");producer.start();String topic = "partition_key_topic";// 模拟不同的 Partition KeyString[] partitionKeys = {"key1", "key2", "key1", "key2"};for (int i = 0; i < partitionKeys.length; i++) {String partitionKey = partitionKeys[i];Message msg = new Message(topic, "TAG", ("Message " + i).getBytes());try {SendResult sendResult = producer.send(msg, new MessageQueueSelector() {@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {String key = (String) arg;int index = Math.abs(key.hashCode()) % mqs.size();return mqs.get(index);}}, partitionKey);System.out.printf("%s%n", sendResult);} catch (Exception e) {e.printStackTrace();}}producer.shutdown();}
}

8. 推拉模式有什么区别,怎么选择

推模式和拉模式的选择一般出现在Broker和消费者之间,而生产者和Broker之间一般使用推模式而不是Broker去拉取消息,否则大量的生产者还需要去维护消息可靠性

推模式的好处是Broker在接收到消息后能够迅速地推送给消费者进行消费,适用于对实时性要求比较高的场景,坏处是消费者消费能力不够强时容易过载,需要Broker去维护消费者的状态去调整推送速率,对Broker要求比较高

拉模式的好处是对Broker没什么要求,可以稳定地控制消息消费的速率,防止消费者过载,并且适合批量地拉取消息,坏处是消息容易延迟,或者是长时间轮询没有消息可消费

RocketMQ和Kafka都使用了拉模式,它们都利用长轮询对拉模式做了优化,也就是在消费者拉取的时候把请求给hold住,然后等待消息到来再把消息发送出去

9. 如何解决消息堆积

消息堆积问题有两个原因,一个是生产太快,一个是消费太慢

生产太快的问题可以对生产端做限流和降级,以及只保留关键消息,丢弃非关键消息,或者延迟处理

消费太慢的问题需要去定位bug,提升消费者的消费能力,包括优化消费的逻辑,增加消费者的线程数量,对消费者进行垂直扩容(增加单个消费者的CPU/内存),或者水平扩容(增加消费者副本数)

10. Kafka的事务消息是什么,怎么实现

Kafka的事务消息保证一系列消息要么完全发送成功,要么完全发送失败,即一系列消息操作的原子性

实现的方式是,Kafka使用事务协调器负责事务的启动、提交和终止,为确保精确一次(exactly once)的投递语义,会为每个Producer维护一个pid,为<pid, topic, partition>维护一个递增的seq从而保证消息按顺序被正确接收,在消费者侧,需要设置read_committed=true保证只消费已提交的消息

具体实践如下

生产者配置acks=all确认消息成功发送、transaction_id设置事务id、enable.idempotence=true确保投递精确一次

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;public class KafkaTransactionalProducer {public static void main(String[] args) {Properties props = new Properties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());props.put(ProducerConfig.ACKS_CONFIG, "all");props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");KafkaProducer<String, String> producer = new KafkaProducer<>(props);producer.initTransactions();try {producer.beginTransaction();ProducerRecord<String, String> record = new ProducerRecord<>("test_topic", "key", "value");producer.send(record);producer.commitTransaction();} catch (Exception e) {producer.abortTransaction();e.printStackTrace();} finally {producer.close();}}
}

消费者配置read_committed=true确保只消费已提交的消息,auto.offset.reset=earliest确保启动时从最早的消息开始消费

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;public class KafkaTransactionalConsumer {public static void main(String[] args) {Properties props = new Properties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(ConsumerConfig.GROUP_ID_CONFIG, "test_group");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Collections.singletonList("test_topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (var record : records) {System.out.printf("Received message: key = %s, value = %s%n", record.key(), record.value());}}}
}

11. RocketMQ的事务消息是什么

RocketMQ的事务消息和Kafka的不同,Kafka实现的是多条消息的原子性,RocketMQ实现的是分布式事务,也就是消息存储和本地事务处在同一个事务

RocketMQ是利用事务消息+事务回查机制实现分布式事务的

  1. 生产者发送“半消息”到MQ
  2. MQ响应
  3. 生产者执行本地事务
  4. 生产者根据本地事务执行状态向MQ发送commit/rollback,若是commit,半消息变为正式消息,消费者可见,若是rollback,则丢弃该半消息
  5. 如果因为网络抖动等原因,MQ没收到第四步,则通知生产者事务回查
  6. 生产者查询事务状态
  7. 生产者根据回查的事务状态,通知MQ进行commit/rollback

相关文章:

消息队列基础概念及选型,常见解决方案包括消息可靠性、消息有序、消息堆积、重复消费、事务消息

前言 是时候总结下消息队列相关知识点啦&#xff01;我搓搓搓搓 本文包括消息队列基础概念介绍&#xff0c;常见解决方案包括消息可靠性、消息有序、消息堆积、重复消费、事务消息 参考资料&#xff1a; Kafka常见问题总结 | JavaGuide RocketMQ常见问题总结 | JavaGuide …...

子类是否能继承

继承 父类&#xff1a; 子 类 构造方法 非私有 不能继承 私有&#xff08;private&#xff09;不能继承 成员变量 非私有 能继承 私有&…...

计算机系统--- BIOS(基本输入输出系统)

一、BIOS的定义与核心定位 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机启动时运行的底层固件&#xff0c;存储在主板的ROM芯片中。它是连接硬件与操作系统的桥梁&#xff0c;负责初始化硬件、加载启动程序&#xff0c;并提供基础配置界面。其核心目标是&a…...

Ollama 与 llama.cpp 深度对比

Ollama 与 llama.cpp 深度对比 1. 定位与架构 维度llama.cppOllama核心定位Meta LLaMA 的 C 推理框架&#xff0c;专注底层优化基于 llama.cpp 的高层封装工具&#xff0c;提供一站式服务技术栈纯 C 实现&#xff0c;支持量化/内存管理/硬件指令集优化&#xff08;AVX/NEON/M…...

C++ —— 智能指针

C ——智能指针 智能指针存在的必要性1. 解决内存泄漏问题2. 避免悬垂指针&#xff08;Dangling Pointer&#xff09;3. 异常安全性 std::unique_ptr &#xff08;独占所有权&#xff09;代码功能说明关键点解析内存管理流程对比传统指针为何使用 make_unique&#xff1f; uniq…...

Go语言的测试框架

Go语言测试框架详解 Go语言&#xff08;Golang&#xff09;自发布以来&#xff0c;因其简洁、高效和并发支持而受到广泛欢迎。在软件开发过程中&#xff0c;测试是确保代码质量与稳定性的重要环节。Go语言内置的测试框架为开发者提供了灵活而强大的测试工具&#xff0c;使得编…...

配置多区域集成IS-IS和抓包分析

基本概念 IS-IS区域结构&#xff1a; 使用两级层次结构&#xff1a;Level 1&#xff08;区域内&#xff09;和Level 2&#xff08;区域间&#xff09; Level 1路由器了解本区域拓扑 Level 2路由器在不同区域间传输流量 Level 1-2路由器同时执行两种功能 NSAP地址&#xff…...

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史&#xff1a; HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…...

JavaScript逆向WebSocket协议解析与动态数据抓取

在JavaScript逆向工程中&#xff0c;WebSocket协议的解析和动态数据抓取是关键技能。本文将结合Fiddler、Charles Proxy和APIfox工具&#xff0c;详细讲解如何解析WebSocket协议并抓取动态数据。 一、WebSocket协议解析 &#xff08;一&#xff09;WebSocket协议的基本概念 …...

过滤震荡行行策略思路

本文讨论的是如何识别和过滤金融市场中的震荡行情&#xff0c;特别是对于趋势交易者来说&#xff0c;如何避免在震荡行情中频繁止损和资金回撤。 主要观点 震荡行情的定义 - 行情在有序与无序之间的中间状态&#xff0c;由多空力量不足导致的横盘。 震荡行情的分类 - 宽幅震…...

消息队列(kafka 与 rocketMQ)

为什么要使用消息队列?作用1: 削峰填谷(突发大请求量问题)作用2: 解耦(单一原则)作用3: 异步(减少处理时间) 如何选择消息队列(kafka&RocketMQ)成本功能性能选择 rocketMQ是参考kafka进行实现的为什么rocketMQ与kafka性能差距很大呢?kafka 的底层数据储存实现rocketMQ 的…...

Invalid bean definition with name ‘employeeMapper‘ defined in file。解决问题

求解决方法&#xff1a; Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-06T15:23:24.87308:00 ERROR 30192 --- [ main] o.s.boot.SpringApplication : Appli…...

使用NVM管理nodejs

使用NVM管理nodejs 前言1. 先清空本地安装的node.js版本2. 下载nvm管理工具3. 安装nvm管理工具4. 输入命令查看nvm版本号5. 查看node.js版本号6. 安装对应版本6.1安装命令6.2使用命令&#xff08;可以快速切换node版本&#xff09;6.3成功之后就可以查看本地的node版本了 7. 查…...

第11课:Tiled DiffusionVAE高分辨率放大应用

文章目录 Part.01 Tiled Diffusion原理与基本操作Part.02 Tiled Diffusion超高分辨率升级Part.03 与ControlNet Tile配合使用显存和图片大小的对应关系 Part.01 Tiled Diffusion原理与基本操作 降低显存负担,用不到一半的显存消耗实现同一张大图的绘制,提高超过50%的出图效…...

APS相关知识

MRP 在系统中实现 MRP&#xff08;物料需求计划&#xff09; 的逻辑&#xff0c;需要基于 数据库 和 算法 进行自动计算&#xff0c;确保物料按时到达&#xff0c;以满足生产需求。以下是 MRP 的核心逻辑和实现步骤&#xff1a; &#x1f4cc; MRP 系统实现流程 数据输入&…...

浮点数精度问题

目录 ieee754标准解决方法 和c语言一样&#xff0c;所有以ieee754标准的语言都有浮点数精度问题&#xff0c;js也有浮点数精度问题&#xff0c;并且因为是弱类型语言这个问题更严重&#xff0c;js的Number类型的数据都被视为浮点数 ieee754标准 js的数字类型就相当于c语言doub…...

DHCP Snooping各种场景实验案例

一、概述 DHCP Snooping的基本功能能够保证客户端从合法的服务器获取IP地址,而且能够记录DHCP客户端IP地址与MAC地址等参数的对应关系,进而生成绑定表。 DHCP Snooping的基本功能的配置任务如下(只有前面两个是必选的)。 使能DHCP Snooping功能。配置接口信任状态。(可选)使能…...

设计模式简述(八)中介者模式

中介者模式 描述基本使用使用 描述 为了简化多个类间复杂的耦合关系&#xff0c;单独定义一个中介者 将边界交互的部分交给中介者&#xff0c;从而简化各个类内部逻辑 个人建议在3个及以上的类间存在复杂交互关系时再考虑中介者&#xff0c;否则可能反而增加系统复杂度 基本使…...

【力扣hot100题】(064)在排序数组中查找元素的第一个和最后一个位置

调试了半天终于过了…… 神人题目&#xff0c;主要是情况太太太多了&#xff0c;有先找到左边界的情况、先找到右边界的情况、找到中间节点之后要依次找左右边界的情况……其实要是弄多一点循环应该就不会像我写的这么复杂&#xff0c;但我太懒了就是不想多开循环。 class So…...

【Python爬虫高级技巧】深入掌握lxml库:XPath解析/HTML处理/性能优化全攻略|附企业级实战案例

作为Python生态中最快的HTML/XML解析库&#xff0c;lxml凭借其C语言级别的性能表现&#xff0c;成为爬虫和数据处理的利器。但很多开发者仅停留在基础用法&#xff0c;未能充分发挥其潜力。唐叔将通过本期带你深入剖析lxml的奥秘。 文章目录 一、lxml架构设计揭秘1.1 Cython混合…...

ABAP 新语法 - corresponding

在 ABAP 中&#xff0c;CORRESPONDING 操作符用于根据字段名称自动映射结构体&#xff08;Structure&#xff09;或内表&#xff08;Internal Table&#xff09;的字段值。它比传统的 MOVE-CORRESPONDING 语句更灵活&#xff0c;支持更多控制选项。 基础用法 data: begin of …...

基于高云fpga实现的fir串行滤波器

大家好&#xff0c;随着国产芯片的崛起&#xff0c;本文将专注于使用国产fpga芯片----高云fpga实现串行fir滤波器的项目 1.fir滤波器简介 设计一个频域滤波器&#xff08;将想要保留的频率段赋值为1&#xff0c;其他频率段赋值为0&#xff09;&#xff0c;将其与含噪声信号的…...

Spring 中的 BeanFactory 和 ApplicationContext

在 Spring 中&#xff0c;BeanFactory 和 ApplicationContext 都是 IOC 容器的实现接口&#xff0c;负责管理 Bean 的生命周期和依赖注入。但它们之间确实有一些关键区别。 &#x1f50d; 一、什么是 BeanFactory&#xff1f; BeanFactory 是 Spring 最基础的 IOC 容器接口&am…...

木里风景文化|基于Java+vue的木里风景文化管理平台的设计与实现(源码+数据库+文档)

木里风景文化管理平台 目录 基于SSM&#xff0b;vue的木里风景文化管理平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…...

国内 windows powershell 安装 scoop

目录 Win10 Terminal Powershell 安装 scoop 失败1. 网络问题2. 报错 Win10 Terminal Powershell 安装 scoop 失败 1. 网络问题 将通常使用的 get.scoop.sh 改为 scoop.201704.xyz (使用scoop国内镜像优化库) 2. 报错 Running the installer as administrator is disabled b…...

【Linux】iptables命令的基本使用

语法格式 iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]注意事项 不指定表名时&#xff0c;默认使用 filter 表不指定链名时&#xff0c;默认表示该表内所有链除非设置规则链的缺省策略&#xff0c;否则需要指定匹配条件 设置规则内容 -A&#xff1a…...

ROS2笔记-2:第一个在Gazebo中能动的例子

第一个在Gazebo中能动的例子 写在前面X-windows 与cursorSimple ROS2 RobotProject StructureFeaturesDependenciesInstallationUsageRobot DescriptionMovement PatternCustomization 解释运行的效果启动控制机器人移动 代码 写在前面 第一个在Gazebo中能动的例子 是指对我来…...

剑指Offer(数据结构与算法面试题精讲)C++版——day6

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day6 题目一&#xff1a;不含重复字符的最长子字符串题目二&#xff1a;包含所有字符的最短字符串题目三&#xff1a;有效的回文 题目一&#xff1a;不含重复字符的最长子字符串 这里还是可以使用前面&#x…...

人工智能起源:从图灵到ChatGPT

如今作诗AI的祖先是打卡机、缓慢行动的机器人和神一般的游戏引擎。 “第一台能产生自己想法”的机器问世近70年后&#xff0c;人类的大脑仍然没有真正的对手 1958年冬天&#xff0c;30岁的心理学家弗兰克 罗森布拉特&#xff08;Frank Rosenblatt&#xff09;正从康奈尔大学前…...

vue2打包部署到nginx,解决路由history模式下页面空白问题

项目使用的是vue2&#xff0c;脚手架vue-cli 4。 需求&#xff1a;之前项目路由使用的是hash&#xff0c;现在要求调整为history模式&#xff0c;但是整个过程非常坎坷&#xff0c;遇到了页面空白问题。现在就具体讲一下这个问题。 首先&#xff0c;直接讲路由模式由hash改为…...

ASM磁盘组替换

1.udev绑定新磁盘 udevadm control --reload-rules udevadm trigger [rootrac1 ~]# ll /dev/asm* brw-rw---- 1 grid asmadmin 8, 64 Apr 4 13:55 /dev/asm-arc brw-rw---- 1 grid asmadmin 8, 48 Apr 4 14:04 /dev/asm-data brw-rw---- 1 grid asmadmin 8, 80 Apr 4 14:03…...

ZooKeeper集群部署(容器)

文章目录 一、ZooKeeper基本概念二、ZooKeeper集群部署1、前置环境准备2、ZooKeeper伪集群部署(可选)3、ZooKeeper集群部署(可选) 三、ZooKeeper集群验证1、查看集群角色2、数据同步测试3、选举leader测试 一、ZooKeeper基本概念 ZooKeeper是一个分布式且开源的分布式应用程序…...

Scala语言基础:开启你的 Flink 之旅

引言&#xff1a;为什么选择Scala&#xff1f; 大家好&#xff0c;我是心海&#xff01; Scala&#xff08;Scalable Language&#xff09;是一门融合面向对象与函数式编程的现代语言。它像瑞士军刀一样灵活——既能编写简洁的脚本&#xff0c;又能构建复杂的分布式系统。想象你…...

C++计算机视觉实战:100个实际案例分析

【2025最新版】C计算机视觉100个案例算法汇总(长期更新版) 本文是基于C的项目实战&#xff0c;需要具备一点C基础与深度学习基础&#xff0c;并且对opencv、open3d、tensorrt、onnxruntime有一定了解。 你们的订阅是我更新的动力&#xff0c;请订阅、点赞、收藏。 1.Yolov5实…...

V-SHOW和箭头函数在VUE项目的踩坑点

v-show和v-if v-show控制显示隐藏是通过控制CSS的display决定dom节点的显示和隐藏。v-if通过控制dom节点的渲染与否实现元素的显示和隐藏。 在vue中&#xff0c;template标签不参与页面渲染&#xff0c;也不会破坏代码的层级结构&#xff0c;所以多和v-if结合控制元素的显示隐…...

vscode使用方式

一、常用快捷键与代码操作 注释与代码排版 行注释&#xff1a;Ctrl /&#xff1b;块注释&#xff1a;Shift Alt A。 代码缩进&#xff1a;选中代码段后按 Tab&#xff08;右移&#xff09;或 Shift Tab&#xff08;左移&#xff09;。 代码导航与编辑 快速跳转文件&…...

使用OpenSceneGraph生成3D数据格式文件

OpenSceneGraph (OSG) 提供了多种方式来生成和导出3D数据格式文件。以下是详细的生成方法和示例代码&#xff1a; 一、基本文件生成方法 1. 使用osgDB::writeNodeFile函数 这是最直接的生成方式&#xff0c;支持多种格式&#xff1a; #include <osgDB/WriteFile>osg:…...

网络安全应急响应-系统排查

在网络安全应急响应中&#xff0c;系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南&#xff0c;涵盖常用命令及注意事项&#xff1a; 一、Windows系统排查 1. 系统信息工具&#xff08;msinfo32.exe&#xff09; 命令执行&#x…...

如何判断JVM中类和其他类是不是同一个类

如何判断JVM中的类是否为同一个类 在Java虚拟机(JVM)中&#xff0c;判断两个类是否相同需要同时满足以下三个条件&#xff1a; 1. 类全限定名必须相同 包括包名类名的完整路径必须完全一致例如&#xff1a;java.lang.String和com.example.String被视为不同类 2. 加载该类的…...

Prolog语言的共识算法

Prolog语言的共识算法 引言 在分布式计算和区块链技术的背景下&#xff0c;共识算法作为确保节点一致性的重要机制&#xff0c;受到了广泛关注。传统的共识算法如PBFT&#xff08; Practical Byzantine Fault Tolerance &#xff09;等在许多系统中得到了应用&#xff0c;但随…...

AIDD-深度学习 MetDeeCINE 破译代谢调控机制

深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示&#xff0c;提升基因组分析效率&#xff0c;尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…...

pyTorch框架-迁移学习-实现四种天气图片多分类问题

目录 1.导包 2.加载原数据、创建训练与测试目录路径 3.用transforms.Compose、torchvision.datasets.ImageFolder数据预处理 4.加载预训练好的模型 5.固定与修改预训练模型的参数 6.将模型拷到GPU上 7.定义优化器与损失函数 8.定义训练过程 9.测试运行 10.测试结果…...

python1(基础语法输入输出)

输入输出&#xff1a; 输出 print(*objects, sep , end\n, filesys.stdout, flushFalse) objects&#xff1a;这是一个可变参数&#xff0c;意味着你可以传入任意数量的对象。print 函数会将这些对象依次打印出来。在函数内部&#xff0c;这些对象会被转换为字符串形式。 se…...

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…...

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组&#xff08;Security Group&#xff09;默认是通过Linux的iptables实现的。以下是其主要实现原理和机制&#xff1a; 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…...

开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)

文章目录 开源身份和访问管理方案之keycloak&#xff08;三&#xff09;keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak&#xff08;三&…...

棋盘问题(DFS)

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 kk 个棋子的所有可行的摆放方案数目 C…...

verilog学习--1、语言要素

先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B&#xff1b; endmodule; Verilog以module为单位编写&#xff0c;每个文件一个module&#…...

from fastmcp import FastMCP和from mcp.server.fastmcp import FastMCP的区别是什么?

文章目录 困惑以方式一开启一个mcp server,并用cline进行调用mcp install server.py修改配置文件以方式二开启MCP server困惑 一直比较困惑的是,好像用python实现mcp server有两种实现方式。 一是使用: https://github.com/modelcontextprotocol/python-sdk 二是使用: …...

QT工程建立

打开软件新建一个工程 选择chose 工程命名&#xff0c;选择保存路径&#xff0c;可以自己选择&#xff0c;但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面&#xff0c;点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…...