# 全面解剖 消息中间件 RocketMQ-(5)

全面解剖 消息中间件 RocketMQ-(5)

一、RocketMQ :过滤消息的两种方式

1、Tag 过滤

在大多数情况下,TAG 是一个简单而有用的设计,其可以来选择您想要的消息。

例如:
DefaultMoPushconsumer consumer = new DefaultMoPushconsumer(“CID EXAMPLE”).consumer.subscribe(“TOPIC”,“TAGA II TAGB II TAGC”):

消费者将接收包含 TAGA 或 TAGB 或 TAGC 的消息。但是限制是一个消息只能有一个标签,这对于复杂的场景可能不起作用。
在这种情况下,可以使用 SQL 表达式筛选消息。SQL 特性可以通过发送消息时的属性来进行计算。在 RocketMQ 定义的语法下,可以实现一些简单的逻辑。

2、SQL 语法过滤

2.1 RocketMQ 只定义了一些基本语法来支持这个特性。你也可以很容易地扩展它。
  • 数值比较,比如:**>,>=,<,<=,BETWEEN,=;活活
  • 字符比较,比如:=,<>,IN;
  • IS NULL 或者 IS NOT NULL;
  • 逻辑符号 AND,OR,NOT;
2.2 常量支持类型为:
  • 数值,比如:123,3.1415;
  • 字符,比如:‘abc’,必须用单引号包裹起来:
  • NULL,特殊的常量
  • 布尔值,TRUE 或 FALSE
2.3 只有使用 push 模式的消费者才能使用 SQL92 标准的 sql 语句,接口如下:

public void subscribe(finalstring topic, final Messageselector messageselector)

二、RocketMQ :Tag 过滤

1、在工程 rocketmq_demo (模块)中,创建 Tag 过滤 生产 类 Producer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\tag\Producer.java
 *
 *   2024-5-24  创建 Tag 过滤 生产 类 Producer.java
 */
package djh.it.mq.rocketmq.filter.tag;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

import java.util.concurrent.TimeUnit;


public class Producer {

    public static void main(String[] args) throws Exception {

        //1.创建消息生产者 producer,并制定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer("group1");

        //2.指定 Nameserver 地址(集群配置)
        //producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

        //2.指定 Nameserver 地址(非集群配置)
        producer.setNamesrvAddr("172.18.30.110:9876");

        //3.启动 producer
        producer.start();

        for(int i=0; i<3; i++){
            //4.创建消息对象,指定主题 Topic、Tag 和消息体
            //参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容
            //Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());
            Message msg = new Message("FilterTagTopic", "Tag2", ("Hello World"+i).getBytes());

            //5.发送消息
            SendResult result = producer.send(msg);

            System.out.println("发送结果:"+result);
            TimeUnit.SECONDS.sleep(1);  //线程睡1秒
        }
        //6.关闭生产者 producer。
        producer.shutdown();
    }
}

2、在工程 rocketmq_demo (模块)中,创建 Tag 过滤 消费 类 Consumer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\tag\Consumer.java
 *
 *   2024-5-24  创建 Tag 过滤 消费 类 Consumer.java
 */
package djh.it.mq.rocketmq.filter.tag;

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 org.apache.rocketmq.common.protocol.heartbeat.MessageModel;

import java.util.List;

public class Consumer {

	public static void main(String[] args) throws Exception {

		//1.创建消费者 Consumer,制定消费者组名
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");

		//2.指定 Nameserver 地址(集群配置)
		//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

		//2.指定 Nameserver 地址(非集群配置)
		consumer.setNamesrvAddr("172.18.30.110:9876");

		//3.订阅主题 Topic 和 Tag
		//consumer.subscribe("FilterTagTopic", "Tag1");  //接收同步消息
		//consumer.subscribe("FilterTagTopic", "Tag2");  //接收异步消息前,可以让先发送异步消息。
		consumer.subscribe("FilterTagTopic", "Tag1 || Tag2");  //接收同步消息 和 异步消息
		//consumer.subscribe("FilterTagTopic", "*");  //接收所有消息。

		//添加消费模式
		//consumer.setMessageModel(MessageModel.CLUSTERING);  //默认是负载均衡模式消费
		//consumer.setMessageModel(MessageModel.BROADCASTING);  //广播模式消费

		//4.设置回调函数,处理消息
		consumer.registerMessageListener(new MessageListenerConcurrently(){
			//接受消息内容
			public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){
				//System.out.println(msgs); //接收到的消息是未转换的字节码

				for(MessageExt msg : msgs){
					System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息
				}

				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		});

		//5.启动消费者 consumer。
		consumer.start();

		System.out.println("消费者启动");
	}
}

3、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

在这里插入图片描述

三、RocketMQ :SQL 语法过滤

1、RocketMQ :SQL 语法过滤

1.1 RocketMQ 只定义了一些基本语法来支持这个特性。你也可以很容易地扩展它。
  • 数值比较,比如:**>,>=,<,<=,BETWEEN,=;活活
  • 字符比较,比如:=,<>,IN;
  • IS NULL 或者 IS NOT NULL;
  • 逻辑符号 AND,OR,NOT;
1.2 常量支持类型为:
  • 数值,比如:123,3.1415;
  • 字符,比如:‘abc’,必须用单引号包裹起来:
  • NULL,特殊的常量
  • 布尔值,TRUE或 FALSE
1.3 只有使用 push 模式的消费者才能用使用 SQL92 标准的 sql 语句,接口如下:

public void subscribe(finalstring topic, final Messageselector messageselector)

1.4 注意:使用 SQL92 标准的 sql 语句,需要在 broker 配置文件 添加支持 SQL92 标准的 sql 语句。

# 单机模式下,在 ./conf/broker.conf 中,添加支持 SQL92 标准的 sql 语句  
enablePropertyFilter=true

# 集群模式下,修改 broker-m.conf 和 broker-s.conf。然后重启 broker 。
enablePropertyFilter=true

2、在工程 rocketmq_demo (模块)中,创建 SQL 过滤 生产 类 Producer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\sql\Producer.java
 *
 *   2024-5-24  创建 SQL 过滤 生产 类 Producer.java
 */
package djh.it.mq.rocketmq.filter.sql;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

import java.util.concurrent.TimeUnit;


public class Producer {

    public static void main(String[] args) throws Exception {

        //1.创建消息生产者 producer,并制定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer("group1");

        //2.指定 Nameserver 地址(集群配置)
        //producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

        //2.指定 Nameserver 地址(非集群配置)
        producer.setNamesrvAddr("172.18.30.110:9876");

        //3.启动 producer
        producer.start();

        for(int i=0; i<10; i++){
            //4.创建消息对象,指定主题 Topic、Tag 和消息体
            //参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容
            //Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());
            Message msg = new Message("FilterSQLTopic", "Tag1", ("Hello World"+i).getBytes());

            //设置一个用户属性
            msg.putUserProperty("i", String.valueOf(i));

            //5.发送消息
            SendResult result = producer.send(msg);

            System.out.println("发送结果:"+result);
            TimeUnit.SECONDS.sleep(1);  //线程睡1秒
        }
        //6.关闭生产者 producer。
        producer.shutdown();
    }
}

3、在工程 rocketmq_demo (模块)中,创建 SQL 过滤 消费 类 Consumer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\sql\Consumer.java
 *
 *   2024-5-24  创建 SQL 过滤 消费 类 Consumer.java
 */
package djh.it.mq.rocketmq.filter.sql;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.MessageSelector;
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 Consumer {

	public static void main(String[] args) throws Exception {

		//1.创建消费者 Consumer,制定消费者组名
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");

		//2.指定 Nameserver 地址(集群配置)
		//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

		//2.指定 Nameserver 地址(非集群配置)
		consumer.setNamesrvAddr("172.18.30.110:9876");

		//3.订阅主题 Topic 和 Tag
		//注意:需要在 broker 配置文件 ./conf/broker.conf 中,# 添加支持 SQL92 标准的 sql 语句  //enablePropertyFilter=true
		consumer.subscribe("FilterSQLTopic", MessageSelector.bySql("i>5"));  //接收同步消息 和 异步消息

		//4.设置回调函数,处理消息
		consumer.registerMessageListener(new MessageListenerConcurrently(){
			//接受消息内容
			public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){
			//System.out.println(msgs); //接收到的消息是未转换的字节码

			for(MessageExt msg : msgs){
				System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息
			}

			return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		});

		//5.启动消费者 consumer。
		consumer.start();

		System.out.println("消费者启动");
	}
}

4、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

在这里插入图片描述

四、RocketMQ :事务消息的流程分析

1、事务消息的大致方案分为两个流程:正常事务消息的发送及提交、事务消息的补偿流程。

在这里插入图片描述

1.1 事务消息发送及提交
  • 发送消息 ( half 消息 )。
  • 服务端响应消息写入结果。
  • 根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)。
  • 根据本地事务状态执行Commit或者Rollback(Commit操作生成消息索引,消息对消费者可见)。
1.2 事务补偿
  • 对没有 Commit/Rollback 的事务消息 ( pending 状态的消息),从服务端发起一次“回查。
  • Producer 收到回查消息,检查回查消息对应的本地事务的状态。
  • 根据本地事务状态,重新 Commit 或者 Rollback。

其中,补偿阶段用于解决消息 Commit 或者 Rollback 发生超时或者失败的情况。

2、事务消息共有三种状态,提交状态、回滚状态中间状态。

  • TransactionStatus.commitTransaction : 提交事务,它允许消费者消费此消息不允许被消费。
  • TransactionStatus.RollbackTransaction : 回滚事务,它代表该消息将被删除,
  • TransactionStatus.Unknown : 中间状态,它代表需要检查消息队列来确定状态。

五、RocketMQ :事务消息的实现

1、在工程 rocketmq_demo (模块)中,创建 事务消息 生产 类 Producer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\transaction\Producer.java
 *
 *   2024-5-24  创建 事务消息 生产 类 Producer.java
 */
package djh.it.mq.rocketmq.transaction;

import io.netty.util.internal.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.producer.*;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.concurrent.TimeUnit;


public class Producer {

    public static void main(String[] args) throws Exception {

        //1.创建消息生产者 producer,并制定生产者组名
        //DefaultMQProducer producer = new DefaultMQProducer("group1");
        TransactionMQProducer producer = new TransactionMQProducer("group2");

        //2.指定 Nameserver 地址(集群配置)
        //producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

        //2.指定 Nameserver 地址(非集群配置)
        producer.setNamesrvAddr("172.18.30.110:9876");

        //添加事务监听器
        producer.setTransactionListener(new TransactionListener() {
            //在该方法中执行本地事务
            public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
                if(StringUtils.equals("TAGA", msg.getTags())){
                    return LocalTransactionState.COMMIT_MESSAGE;
                }else if(StringUtils.equals("TAGB", msg.getTags())){
                    return LocalTransactionState.ROLLBACK_MESSAGE;
                }else if(StringUtils.equals("TAGC", msg.getTags())){
                    return LocalTransactionState.UNKNOW;
                }

                return LocalTransactionState.UNKNOW;
            }

            //在该方法中 MQ 进行消息事务状态的回查
            public LocalTransactionState checkLocalTransaction(MessageExt msg) {
                System.out.println("消息的Tag:"+msg.getTags());
                return LocalTransactionState.COMMIT_MESSAGE;
            }
        });

        //3.启动 producer
        producer.start();

        String[] tags = {"TAGA", "TAGB", "TAGC"};

        for(int i=0; i<3; i++){
            //4.创建消息对象,指定主题 Topic、Tag 和消息体
            //参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容
            //Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());
            Message msg = new Message("TransactionTopic", tags[i], ("Hello World"+i).getBytes());

            //5.发送消息
            SendResult result = producer.sendMessageInTransaction(msg, null);

            //发送状态
            SendStatus status = result.getSendStatus();

            System.out.println("发送结果:"+result);

            TimeUnit.SECONDS.sleep(1);  //线程睡1秒
        }
        //6.关闭生产者 producer。
        //producer.shutdown();
    }
}

2、在工程 rocketmq_demo (模块)中,创建 事务消息 消费 类 Consumer.java


/**
 *   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\transaction\Consumer.java
 *
 *   2024-5-24  创建 事务消息 消费 类 Consumer.java
 */
package djh.it.mq.rocketmq.transaction;

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 Consumer {

	public static void main(String[] args) throws Exception {

		//1.创建消费者 Consumer,制定消费者组名
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");

		//2.指定 Nameserver 地址(集群配置)
		//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");

		//2.指定 Nameserver 地址(非集群配置)
		consumer.setNamesrvAddr("172.18.30.110:9876");

		//3.订阅主题 Topic 和 Tag
		//consumer.subscribe("FilterTagTopic", "Tag1");  //接收同步消息
		//consumer.subscribe("FilterTagTopic", "Tag2");  //接收异步消息前,可以让先发送异步消息。
		//consumer.subscribe("TransactionTopic", "Tag1 || Tag2");  //接收同步消息 和 异步消息
		consumer.subscribe("TransactionTopic", "*");  //接收所有消息。

		//添加消费模式
		//consumer.setMessageModel(MessageModel.CLUSTERING);  //默认是负载均衡模式消费
		//consumer.setMessageModel(MessageModel.BROADCASTING);  //广播模式消费

		//4.设置回调函数,处理消息
		consumer.registerMessageListener(new MessageListenerConcurrently(){
			//接受消息内容
			public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){
				//System.out.println(msgs); //接收到的消息是未转换的字节码

				for(MessageExt msg : msgs){
					System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息
				}

				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		});

		//5.启动消费者 consumer。
		consumer.start();

		System.out.println("消费者启动");
	}
}

3、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

1) Producer.java 输出 三条记录 和 消息的Tag:TAGC

在这里插入图片描述

3) Consumer.java 输出 2 条记录,其中一条回滚了。

在这里插入图片描述

上一节关联链接请点击:
# 全面解剖 消息中间件 RocketMQ-(4)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

FPGA Verilog模块化设计入门篇一

随着电子技术的快速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;已成为现代电子系统设计中不可或缺的一部分。FPGA的灵活性、可重构性和高性能使得它成为处理复杂算法、加速数据处理和实现特定功能的理想选择。然而&#xff0c;随着系统复杂性的增加&#xf…

抢拍寄售模式:引领行业潮流的新商业引擎

在如今竞争激烈的市场中&#xff0c;企业的成功不仅依赖于产品和服务的质量&#xff0c;更在于能否把握市场趋势&#xff0c;采用创新的商业模式来推动增长。今天&#xff0c;我将详细介绍一种新兴的商业模式——抢拍寄售模式。这种模式以其独特的业务流程和逻辑&#xff0c;正…

让企业自己掌握数据主权,可道云teamOS让企业数据私有化不再是难题,让企业数据更安全、更可控

越来越多的企业开始意识到&#xff0c;仅仅依赖公共云存储服务可能无法满足其对于数据安全性的高标准要求。 毕竟每年都会有不同程度的数据泄露问题爆出&#xff0c;导致大家在使用企业网盘的时候也总是惴惴不安。一旦数据泄露或被非法获取&#xff0c;企业将面临巨大的经济损…

github将默认分支main改为master

github将默认分支main改为master 1.进入github&#xff0c;点击setting 2.在setting中&#xff0c;选择Respositories&#xff0c;更新默认分支为master 3.选择要更新的项目&#xff0c;在项目中选择setting->general->切换默认分支

PPT设置为本框的默认格式以及固定文本框

调整文本框固定位置 双击文本框之后勾选如下三个位置 设置文本框为默认 在调整好文本框的基本性质后&#xff0c;设置为默认即可

【2024PythonPycharm详细安装教程】

1.打开官网 https://www.python.org/ downloads——>Windows 2.找到 Download Windows installer (64-bit) 下载 3.下载完成双击安装包 勾选Add python.exe to PATH(自动配置系统变量) 点击Install Now&#xff08;默认安装&#xff09; 然后看到安装成功&#xff0…

C# 校验Json格式

错误json&#xff1a;错误值 -2146.379 [{"Key": "surface_heights_average","Value": "-2122.739nm","Description": "surface_heights_average"}, {"Key": "surface_heights_max","V…

python语句执行不了

文章目录 问题解决方案小结 问题 执行命令 python install -r .\requirements.txt出现问题如下&#xff1a; D:\soft\Python310\python.exe: cant open file G:\\Area\\C\\Fay\\install: [Errno 2] No such file or directory (.venv) PS G:\Area\C\Fay> pip install -r .…

微软AI PC革命Windows,游戏竟带头开挂

在购物节到来之际&#xff0c;各个厂家都摩拳擦掌&#xff0c;除了手机那边搞得热火朝天&#xff0c;当然电脑这边也没闲着。 微软就趁着 520 这味儿&#xff0c;召开了自己的 Build 2024 开发者大会&#xff0c;同时还发布了最新一代的 Surface Pro 和 Surface Laptop&#xf…

【ROS】mp4转rosbag

前言 工作中遇到域控中无中间件&#xff0c;无法采用rosbag等中间件的形式同时采集感知结果与视频流&#xff0c;只能通过外接摄像头采集视频流&#xff0c;以及使用can报文或者bin文件形式存储路测数据&#xff1b;导致本地回放时&#xff0c;无法通过视频流观察真实情况&…

年刊文量激增破1000+,但3个月即可录用,这本2区TOP SSCI在你的考虑之列吗

【SciencePub学术】今天小编给大家推荐一本经济金融领域的SSCI&#xff0c;JCR1区&#xff0c;中科院2区TOP&#xff0c;影响因子高达10.4&#xff0c;最重要的是审稿周期较短&#xff0c;对急投的学者较为友好&#xff0c;同领域的作者不妨考虑一下这本期刊&#xff01; Finan…

ERPNext - 用Python打造您的企业资源规划解决方案

文章目录 ERPNext - 用Python打造您的企业资源规划解决方案第一部分&#xff1a;背景第二部分&#xff1a;ERPNext是什么&#xff1f;第三部分&#xff1a;如何安装ERPNext&#xff1f;第四部分&#xff1a;ERPNext基本使用方法第五部分&#xff1a;场景应用示例第六部分&#…

STM32高级控制定时器应用之检测输入PWM周期和占空比

目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…

使用element的小弹框并修改css

使用el-popover来做弹框&#xff1a; 滑动或点击元素要加插槽slot"reference"来展示弹框&#xff1b; <el-popoverplacement"top"width"166"trigger"hover"popper-class"popover"><div><div><div>…

关于大模型多轮问答的两种方式

前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图&#xff0c;而在常见的使用大模型进行多轮对话方式中&#xff0c;我接触到的只有两种方式&#xff1a; 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型&#xff0c…

AIGC笔记--DDIM的简单实现

1--DDIM介绍 原论文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS 2--核心代码 # ddim的实现 def compute_alpha(beta, t):beta torch.cat([torch.zeros(1).to(beta.device), beta], dim0) # beta -> [1, beta]# 先通过cumprod计算累乘结果&#xff0c;即: alpha_(t)…

微软找腾讯接盘,Windows直接安装手机APP体验起飞了

熟悉微软的同学都知道微软有个传统艺能——什么好用砍什么。 比如 Win10 砍掉了还算方便的小娜&#xff0c;推出 Win11 砍掉了 Win10 上面好用的磁贴功能等。 上一秒用户还在夸奖点赞。 下一秒就给你砍掉&#xff0c;顺带还塞一堆 BUG 给你。 但没办法&#xff0c;PC 近乎垄断…

【WEEK15】 【DAY1】Swagger第四部分【中文版】

2024.6.3 Monday 接上文【WEEK14】 【DAY5】Swagger第三部分【中文版】 目录 16.9.拓展&#xff1a;其他皮肤16.9.1.修改pom.xml16.9.2.重启并分别访问对应的网址16.9.2.1.swagger-ui16.9.2.2.bootstrap-ui16.9.2.3.Layui-ui16.9.2.4.mg-ui 16.9.拓展&#xff1a;其他皮肤 16.…

【K8s】专题四(4):Kubernetes 控制器之 StatefulSet

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、工作原理 三、相关特性 四、资源清单&#xff08;示例&#xff09; 五…