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

RocketMQ Learning(一)

目录

一、RocketMQ

0、RocketMQ的产品发展

1、RocketMQ安装

1.1、windows下的安装

注意事项

1.2、Linux下的安装

1.3、源码的安装

1.4、控制台

2、消息发送方式

2.1、发送同步消息

2.2、发送异步消息

2.3、单向发送

3、消息消费方式

3.1、负载均衡模式(集群消费)

3.2、广播消费


一、RocketMQ

0、RocketMQ的产品发展

        MetaQ:2011年,阿里基于Kafka的设计使用Java完全重写并推出了MetaQ 1.0版本 。
        2012年,阿里对MetaQ的存储进行了改进,推出MetaQ 2.0,同年阿里把Meta2.0从阿里内部开源出来,取名RocketMQ,为了命名上的规范以及版本上的延续,对外称为RocketMQ3.0。
        2016年,阿里宣布将开源分布式消息中间件RocketMQ捐赠给Apache,同时RocketMQ3也升级为RocketMQ4,现在RocketMQ主要维护的是4.x的版本,也是大家使用得最多的版本。
        2021年,RocketMQ在github上发布5.0预览版。RocketMQ 5.0定义为云原生的消息、事件、流的超融合平台。

RocketMQ源码链接

RocketMQ官网下载地址

1、RocketMQ安装

1.1、windows下的安装

1.确保安装好了JDK1.8&64位系统

2.解压运行版本(Binary)

3.配置环境变量

变量名:ROCKETMQ_HOME
变量值:MQ解压路径\MQ文件夹名

4.启动

在RocketMQ的架构中,都是需要先启动NameServer再启动Broker的。所以先启动NameServer。
启动NameServer
使用cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行‘start mqnamesrv.cmd’,启动NameServer。成功后会弹出提示框,此框勿关闭。

启动Broker
使用cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行‘start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true’,启动Broker。成功后会弹出提示框,此框勿关闭。

注意事项

弹出提示框‘错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_202\lib\tools.jar;C:\Program’的处理
打开‘MQ文件夹\bin’下的runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。保存并重新执行start语句。

 再次启动

1.2、Linux下的安装

...

1.3、源码的安装

1.解压源码版本(Source)

2.导入idea中,maven编译通过

3.创建目录D盘创建文件夹RocketMQ

        1.把源码下的distribution下的conf文件夹拷贝到RocketMQ下面

        2.再创建logs和store文件夹

 

4、启动RocketMQ源码

4.1、启动NameServer

namesrv工程下NamesrvStartup启动类,启动前需要配置环境变量

ROCKETMQ_HOME=D:\RocketMQ

4.2、启动Broker
在broker模块找到broker模块,同时找到启动类BrokerStartup.java

需要修改配置文件broker.conf

#配置如下:
#nameServer
namesrvAddr=127.0.0.1:9876
autoCreateTopicEnable = true
storePathRootDir = D:\\RocketMQ\\store
#commitLog存储路径
storePathCommitLog = D:\\RocketMQ\\store\\commitlog
#消费队列存储路径
storePathConsumeQueue =D:\\RocketMQ\\store\\consumequeue
#消息索引存储路径
storePathindex = D:\\RocketMQ\\store\\index
#checkpoint文件存储路径
storeCheckpoint = D:\\RocketMQ\\store\\checkpoint
#abort文件存储路径
abortFile = D:\\RocketMQ\\store\\abort

配置环境变量

ROCKETMQ_HOME=D:\RocketMQ

配置参数

-c D:\RocketMQ\conf\broker.conf

 

 启动成功,检查下数据文件

1.4、控制台

Rocketmq老版本下载

Rocketmq新版本下载

这里下载的新版本rocketmq-dashboard启动项目下面如下

浏览器中输入‘http://localhost:8080’,成功后即可进行管理端查看。

运维页面
你可以修改这个服务使用的namesrv的地址
你可以修改这个服务是否使用VIPChannel(如果你的mq server版本小于3.5.8,请设置不使用)

驾驶舱
查看broker的消息量(总量/5分钟图)
查看单一主题的消息量(总量/趋势图)

集群
查看集群的分布情况:cluster与broker关系、broker
查看broker具体信息/运行信息
查看broker配置信息

 

主题页面
展示所有的主题,可以通过搜索框进行过滤
筛选 普通/重试/死信 主题
添加/更新主题
        clusterName 创建在哪几个cluster上
        brokerName 创建在哪几个broker上
        topicName 主题名
        writeQueueNums 写队列数量
        readQueueNums 读队列数量
        perm //2是写 4是读 6是读写
状态 查询消息投递状态(投递到哪些broker/哪些queue/多少量等)
路由 查看消息的路由(现在你发这个主题的消息会发往哪些broker,对应broker的queue信息)
CONSUMER管理(这个topic都被哪些group消费了,消费情况何如)
topic配置(查看变更当前的配置)
发送消息(向这个主题发送一个测试消息)
重置消费位点(分为在线和不在线两种情况,不过都需要检查重置是否成功)
删除主题 (会删除掉所有broker以及namesrv上的主题配置和路由信息)

消费者页面
展示所有的消费组,可以通过搜索框进行过滤
刷新页面/每隔五秒定时刷新页面
按照订阅组/数量/TPS/延迟 进行排序
添加/更新消费组
        clusterName 创建在哪几个集群上
        brokerName 创建在哪几个broker上
        groupName 消费组名字
        consumeEnable //是否可以消费 FALSE的话将无法进行消费
        consumeBroadcastEnable //是否可以广播消费
        retryQueueNums //重试队列的大小
        brokerId //正常情况从哪消费
        whichBrokerWhenConsumeSlowly//出问题了从哪消费
终端 在线的消费客户端查看,包括版本订阅信息和消费模式
消费详情 对应消费组的消费明细查看,这个消费组订阅的所有Topic的消费情况,每个queue对应的消费client查看(包括Retry消息)
配置 查看变更消费组的配置
删除 在指定的broker上删除消费组

生产者页面
通过Topic和Group查询在线的消息生产者客户端
信息包含客户端主机 版本

消息查询页面
根据Topic和时间区间查询由于数据量大 最多只会展示2000条,多的会被忽略
根据Topic和Key进行查询
最多只会展示64条
根据消息主题和消息Id进行消息的查询
消息详情可以展示这条消息的详细信息,查看消息对应到具体消费组的消费情况(如果异常,可以查看具体的异常信息)。可以向指定的消费组重发消息

2、消息发送方式

2.1、发送同步消息

同步发送是指消息发送方发出数据后,同步等待,直到收到接收方发回响应之后才发下一个请求。这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。

RocketMQ源码中的example模块的org.apache.rocketmq.example.quickstart.Producer

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;public class Producer {public static final int MESSAGE_COUNT = 1000;public static final String PRODUCER_GROUP = "please_rename_unique_group_name";public static final String DEFAULT_NAMESRVADDR = "127.0.0.1:9876";public static final String TOPIC = "TopicTest";public static final String TAG = "TagA";public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);producer.start();for (int i = 0; i < MESSAGE_COUNT; i++) {try {Message msg = new Message(TOPIC /* Topic */,TAG /* Tag */,("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */);SendResult sendResult = producer.send(msg);System.out.printf("%s%n", sendResult);} catch (Exception e) {e.printStackTrace();Thread.sleep(1000);}}producer.shutdown();}
}

发送结果分析

SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFB90000, offsetMsgId=C0A8380100002A9F0000000000046F14, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=3], queueOffset=275]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFCD0001, offsetMsgId=C0A8380100002A9F0000000000047003, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=0], queueOffset=275]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFD10002, offsetMsgId=C0A8380100002A9F00000000000470F2, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=1], queueOffset=275]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFD30003, offsetMsgId=C0A8380100002A9F00000000000471E1, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=2], queueOffset=275]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFD50004, offsetMsgId=C0A8380100002A9F00000000000472D0, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=3], queueOffset=276]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFD60005, offsetMsgId=C0A8380100002A9F00000000000473BF, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=0], queueOffset=276]
SendResult [sendStatus=SEND_OK, msgId=C0A800AB34BC18B4AAC228E6CFD90006, offsetMsgId=C0A8380100002A9F00000000000474AE, messageQueue=MessageQueue [topic=TopicTest, brokerName=MS-TGOOFNKABBOB, queueId=1], queueOffset=276
....

msgId
消息的全局唯一标识(RocketMQ的ID生成是使用机器IP和消息偏移量的组成),由消息队列 MQ 系统自动生成,唯一标识某条消息。
sendStatus
发送的标识:成功,失败等
queueId
queueId是Topic的分区;Producer发送具体一条消息的时,对应选择的该Topic下的某一个Queue的标识ID。
queueOffset
Message queue是无限长的数组。一条消息进来下标就会涨1,而这个数组的下标就是queueOffset,queueOffset是从0开始递增。

2.2、发送异步消息

        异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。消息发送方在发送了一条消息后,不等接收方发回响应,接着进行第二条消息发送。发送方通过回调接口的方式接收服务器响应,并对响应结果进行处理。

RocketMQ源码中的example模块的org.apache.rocketmq.example.quickstart.Producer

package org.apache.rocketmq.example.simple;import java.io.UnsupportedEncodingException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;public class AsyncProducer {public static void main(String[] args) throws MQClientException, InterruptedException, UnsupportedEncodingException {DefaultMQProducer producer = new DefaultMQProducer("Jodie_Daily_test");producer.setNamesrvAddr("127.0.0.1:9876");producer.start();// suggest to on enableBackpressureForAsyncMode in heavy traffic, default is falseproducer.setEnableBackpressureForAsyncMode(true);producer.setRetryTimesWhenSendAsyncFailed(0);int messageCount = 100;final CountDownLatch countDownLatch = new CountDownLatch(messageCount);for (int i = 0; i < messageCount; i++) {try {final int index = i;Message msg = new Message("Jodie_topic_1023","TagA","OrderID188","Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));producer.send(msg, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {countDownLatch.countDown();System.out.printf("%-10d OK %s %n", index, sendResult.getMsgId());}@Overridepublic void onException(Throwable e) {countDownLatch.countDown();System.out.printf("%-10d Exception %s %n", index, e);e.printStackTrace();}});} catch (Exception e) {e.printStackTrace();}}countDownLatch.await(5, TimeUnit.SECONDS);producer.shutdown();}
}

2.3、单向发送

        这种方式主要用在不特别关心发送结果的场景,例如日志发送。单向(Oneway)发送特点为发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。

package org.apache.rocketmq.example.simple;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;public class OnewayProducer {public static void main(String[] args) throws Exception {//Instantiate with a producer group name.DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");// Specify name server addresses.producer.setNamesrvAddr("localhost:9876");//Launch the instance.producer.start();for (int i = 0; i < 100; i++) {//Create a message instance, specifying topic, tag and message body.Message msg = new Message("TopicTest" /* Topic */,"TagA" /* Tag */,("Hello RocketMQ " +i).getBytes(StandardCharsets.UTF_8) /* Message body */);//Call send message to deliver message to one of brokers.producer.sendOneway(msg);}//Wait for sending to completeThread.sleep(5000);producer.shutdown();}
}

3、消息消费方式

3.1、负载均衡模式(集群消费)

        消费者采用负载均衡方式消费消息,一个分组(Group)下的多个消费者共同消费队列消息,每个消费者处理的消息不同。一个Consumer Group中的各个Consumer实例分摊去消费消息,即一条消息只会投递到一个Consumer Group下面的一个实例。例如某个Topic有3个队列,其中一个Consumer Group 有 3 个实例,那么每个实例只消费其中的1个队列。集群消费模式是消费者默认的消费方式。

package org.apache.rocketmq.example.quickstart;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;public class Consumer {public static final String CONSUMER_GROUP = "please_rename_unique_group_name_4";public static final String DEFAULT_NAMESRVADDR = "127.0.0.1:9876";public static final String TOPIC = "TopicTest";public static void main(String[] args) throws MQClientException {//实例化消息生产者,指定组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);//指定Namesrv地址信息consumer.setNamesrvAddr(DEFAULT_NAMESRVADDR);consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);//订阅Topicconsumer.subscribe(TOPIC, "*");//负载均衡模式消费(可以不设置,默认就是负载均衡模式)consumer.setMessageModel(MessageModel.CLUSTERING);//注册回调函数,处理消息consumer.registerMessageListener((MessageListenerConcurrently) (msg, context) -> {System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msg);return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});consumer.start();//启动消费者System.out.printf("Consumer Started.%n");}
}

3.2、广播消费

        广播消费模式中消息将对一个Consumer Group下的各个Consumer实例都投递一遍。即使这些 Consumer属于同一个Consumer Group,消息也会被Consumer Group 中的每个Consumer都消费一次。实际上,是一个消费组下的每个消费者实例都获取到了topic下面的每个Message Queue去拉取消费。所以消息会投递到每个消费者实例。

 

package org.apache.rocketmq.example.quickstart;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;public class Consumer {public static final String CONSUMER_GROUP = "please_rename_unique_group_name_4";public static final String DEFAULT_NAMESRVADDR = "127.0.0.1:9876";public static final String TOPIC = "TopicTest";public static void main(String[] args) throws MQClientException {//实例化消息生产者,指定组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);//指定Namesrv地址信息consumer.setNamesrvAddr(DEFAULT_NAMESRVADDR);consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);//订阅Topicconsumer.subscribe(TOPIC, "*");//广播消费模式consumer.setMessageModel(MessageModel.BROADCASTING);//注册回调函数,处理消息consumer.registerMessageListener((MessageListenerConcurrently) (msg, context) -> {System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msg);return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});consumer.start();//启动消费者System.out.printf("Consumer Started.%n");}
}

消息消费时的权衡
负载均衡模式:适用场景&注意事项 
        消费端集群化部署,每条消息只需要被处理一次。
        由于消费进度在服务端维护,可靠性更高。
        集群消费模式下,每一条消息都只会被分发到一台机器上处理。如果需要被集群下的每一台机器都处理,请使用广播模式。
        集群消费模式下,不保证每一次失败重投的消息路由到同一台机器上,因此处理消息时不应该做任何确定性假设。
广播模式:适用场景&注意事项 
        每条消息都需要被相同逻辑的多台机器处理。
        消费进度在客户端维护,出现重复的概率稍大于集群模式。
        广播模式下,消息队列 RocketMQ 保证每条消息至少被每台客户端消费一次,但是并不会对消费失败的消息进行失败重投,因此业务方需要关注消费失败的情况。
        广播模式下,客户端每一次重启都会从最新消息消费。客户端在被停止期间发送至服务端的消息将会被自动跳过,请谨慎选择。
        广播模式下,每条消息都会被大量的客户端重复处理,因此推荐尽可能使用集群模式。
目前仅 Java 客户端支持广播模式。
        广播消费模式下不支持顺序消息。
        广播消费模式下不支持重置消费位点。
        广播模式下服务端不维护消费进度,所以消息队列 RocketMQ 控制台不支持消息堆积查询、消息堆积报警和订阅关系查询功能。

不是你觉的悟到的东西给了你,你也接不住!

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

相关文章:

RocketMQ Learning(一)

目录 一、RocketMQ 0、RocketMQ的产品发展 1、RocketMQ安装 1.1、windows下的安装 注意事项 1.2、Linux下的安装 1.3、源码的安装 1.4、控制台 2、消息发送方式 2.1、发送同步消息 2.2、发送异步消息 2.3、单向发送 3、消息消费方式 3.1、负载均衡模式&#xff0…...

libmpv使用滤镜处理视频进行播放

一、前言 作为一个功能强大的多媒体框架,libmpv为开发者提供了广泛的功能和灵活的控制权。滤镜是libmpv的一个重要特性,允许开发者对视频进行各种实时处理和增强,从而满足用户对于个性化、创意化和高质量视频体验的需求。 滤镜是一种在视频渲染过程中应用特定效果的技术。…...

Harbor.cfg 配置文件参数详解

目录 Harbor.cfg 配置文件参数详解 所需参数&#xff1a; hostname&#xff1a; ui_url_protocol&#xff1a; max_job_workers&#xff1a; db_password&#xff1a; customize_crt&#xff1a; ssl_cert&#xff1a; ssl_cert_key&#xff1a; secretkey_path&#…...

模仿火星科技 基于cesium+ 贴地测量+可编辑

当您进入Cesium的编辑贴地测量世界&#xff0c;下面是一个详细的操作过程&#xff0c;帮助您顺利使用这些功能&#xff1a; 1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。在屏幕的一角&#xff0c;一个友好的提示窗将…...

模仿火星科技 基于cesium+角度测量+高度测量+可编辑

1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。 在屏幕的一角&#xff0c;一个友好的提示窗将呈现&#xff0c;随着您的操作&#xff0c;它会为您提供有用的信息和指导。 2. 绘制面积&#xff1a; 轻轻点击鼠标左键&a…...

Codeforces の 动态规划

Codeforces Round 785 (Div. 2) - C. Palindrome Basis dp(9/100) 题目链接 思路&#xff1a;整数划分基础上加一个判断回文的条件 整数划分思路&#xff1a;背包容量为n&#xff0c;物品有体积为1~n n种&#xff0c;每种无数个&#xff0c;求使背包恰好装满的方案数——完全背…...

数学建模-爬虫系统学习

尚硅谷Python爬虫教程小白零基础速通&#xff08;含python基础爬虫案例&#xff09; 内容包括&#xff1a;Python基础、Urllib、解析&#xff08;xpath、jsonpath、beautiful&#xff09;、requests、selenium、Scrapy框架 python基础 进阶&#xff08;字符串 列表 元组 字典…...

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制概述

ArkUI通过自定义组件的build()函数和builder装饰器中的声明式UI描述语句构建相应的UI。 在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条件渲染语句&#xff0c;基于数组数…...

【力扣刷题 | 第二十五天】

目录 前言&#xff1a; 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 总结: 前言&#xff1a; 今天我们依旧暴打动态规划 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集…...

GO学习之 函数(Function)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 文章目录 GO系列前言一、什么是…...

Jstack线上问题排查

1.top查找出哪个进程消耗的cpu高。执行top命令&#xff0c;默认是进程视图&#xff0c;其中PID是进程号&#xff08;记下进程号&#xff09; 2.top中shifth 或“H”查找出哪个线程消耗的cpu高 &#xff08;记下最高的几个线程号&#xff09; jstack 进程号 >> pid-cpu.…...

VIM 编辑器: Bram Moolenaar

VIM 用了很长时间&#xff0c; 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候&#xff0c; 编辑都用这个。 linux kernel&#xff0c; boost规模的代码都不在话下。现在虽然代码写的少了&#xff0c;依然是我打开文件的首选。 现在用手机了&#xff0c;配个蓝牙键…...

鸿蒙应用开发指南:从零开始构建一款智能音乐播放器

介绍 随着鸿蒙操作系统的发布&#xff0c;开发者们迫不及待地想要探索鸿蒙应用的开发。本篇博客将以构建一款智能音乐播放器为例&#xff0c;带你一步步了解鸿蒙应用开发的技术要点和实践。我们将使用HarmonyOS的开发环境和MarkDown进行排版&#xff0c;方便你快速上手。 准备…...

如何实现对主机的立体监控?

主机监控是保证系统稳定性和性能的重要环节之一&#xff0c;那应该如何实现对主机的立体监控&#xff1f; 本期EasyOps产品使用最佳实践&#xff0c;我们将为您揭晓&#xff1a; 主机应该如何分组和管理&#xff1f; 主机监控应该关注哪些关键性指标&#xff1f; 背 景 通…...

机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

1 两种大语言模型&#xff1a;GPT VS BERT 2 对于大语言模型的两种不同期待 2.1 “专才” 2.1.1 成为专才的好处 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭头方向指的是从哪个方向往哪个方向翻译 表格里面的数值越大表示翻译的越好 可以发现专门做翻…...

中电金信:逐数兴业 智启未来——“数据二十条”影响之解读 (下)

在逐数兴业 智启未来——“数据二十条”影响之解读&#xff08;上&#xff09;篇内容中&#xff0c;主要解读了有关于“数据二十条”发布的背景与意义、建立数据要素市场面临的挑战与应对。在今天的文章里&#xff0c;将继续解读“数据二十条”的主要内容以及对金融行业和金融科…...

54款宝藏级AIGC工具分享(claude,Midjourney,Stable Diffusion等)

随着ChatGPT的一波又一波高潮&#xff0c;生成式AI逐渐进入人们视野&#xff0c;并开始大行其道&#xff0c;正如人们所说&#xff1a;AI用的好&#xff0c;天天下班早&#xff01; 当然&#xff0c;有效的利用AI不但能下班早&#xff0c;还能在上班时间摸鱼&#xff0c;就如潘…...

bigemap如何添加在线地图源?

第一步 打开浏览器&#xff0c;找到你要访问的地图的URL地址&#xff0c;并且确认可以正常在浏览器中访问&#xff1b;浏览器中不能访问&#xff0c;同样也不能在软件中访问。 以下为常用地图源地址&#xff1a; 天地图&#xff1a; http://map.tianditu.gov.cn 包含&a…...

84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最…...

嘉楠勘智k230开发板上手记录(二)--hello world

上次成功在k230上烧录sdk&#xff0c;这次准备实现hello world和ssh scp远程k230 主要是按照K230 SDK 基础教程的K230_实战基础篇_hello_world.md 一、PC连接k230 1. 初步准备 首先下载串口工具PuTTY&#xff0c;这个我个人感觉比较方便。 准备两根USB type-C数据线&#…...

ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升

查看原文>>>ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合能力 本文将利用ArcGIS Pro 将您的 GIS 工作组织到工程中&#xff0c;您可以使用 ArcGIS Pro 映射 2D 和 3D 数据。借助 ArcGIS Pro&#xff…...

学习pytorch

学习pytorch 1. 环境安装配置镜像源conda命令记录图像相关代码遇到的问题1. torch.cuda.is_available() False 1. 环境安装 B站小土堆视频 配置镜像源 conda config --show channels conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main…...

动态SQL实现原理一-动态SQL的使用

在介绍MyBatis动态SQL实现原理之前&#xff0c;我们先来了解一下MyBatis动态SQL的使用。顾名思义&#xff0c;动态SQL指的是事先无法预知具体的条件&#xff0c;需要在运行时根据具体的情况动态地生成SQL语句。 假设我们有一个获取用户信息查询操作&#xff0c;具体的查询条件…...

MyBatis动态sql标签帮你轻松搞定sql拼接

动态sql介绍 由于在开发过程不同的业务中会用到不同的操作条件&#xff0c;如果每个业务都拼接不同sql语句的话会是一个庞大的工作量&#xff1b;此时动态sql就能解决这个问题&#xff0c;可以针对不确定的操作条件动态拼接sql语句&#xff0c;根据提交的条件来完成业务sql的执…...

Java课题笔记~ 使用 Spring 的事务注解管理事务(掌握)

通过Transactional 注解方式&#xff0c;可将事务织入到相应 public 方法中&#xff0c;实现事务管理。 Transactional 的所有可选属性如下所示&#xff1a; propagation&#xff1a;用于设置事务传播属性。该属性类型为 Propagation 枚举&#xff0c; 默认值为 Propagation.R…...

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图&#xff1a; 4.交互图&#xff1a; 5.实现图&#xff1a; 概述: UML的视图是由九种视图组成的&#xff0c;分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…...

算法与数据结构-跳表

文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲&#xff0c;即便链表中存储的数据是有序的&#xff0c;如果我们要想在其中查找某个数据&#xff0c;也只能从头到尾遍历链表。这样查找效率…...

微信小程序nodejs+vue+uniapp校运会高校运动会报名管理系统

3.1小程序端 小程序登录页面&#xff0c;用户也可以在此页面进行注册并且登录等。 登录成功后可以在我的个人中心查看自己的个人信息或者修改信息等 在广播信息中我们可以查看校运会发布的一些信息情况。 在首页我们可以看到校运会具体有什么项目运动。 在查看具体有什么活动我…...

varint原理 - 负数的编码和解码

前一篇博客 varint原理 - 正数的编码和解码_YZF_Kevin的博客-CSDN博客我们讲了varint的实现原理&#xff0c;举例也分析对于正数的编码&#xff0c;解码过程 本篇博客&#xff0c;我们开始举例分析负数的编码和解码&#xff0c;因为负数有原码&#xff0c;反码&#xff0c;补码…...

大学生口才培训需求分析

标题&#xff1a;大学生口才培训需求分析 摘要&#xff1a; 本论文旨在分析大学生口才培训的需求&#xff0c;通过对大学生口才培训的重要性、现状和挑战进行研究&#xff0c;并结合相关理论和实践经验&#xff0c;提出相应的培训需求和解决方案。通过本论文的研究&#xff0c…...

网站模板如何优化/北京网络推广有哪些公司

最终实现效果 在图片上右键上传&#xff0c;自动生成图片URL到剪切板中&#xff0c;任意地方Ctrlv均可粘贴 在文件上右键上传&#xff0c;自动生成图片URL到剪切板中&#xff0c;任意地方Ctrlv均可粘贴 准备工作 COS 对象存储&#xff08;Cloud Object Storage&#xff0c;COS…...

泰州建站免费模板/无锡网站制作优化

学任何东西&#xff0c;你能坚持前三天&#xff0c;就至少超过一半的人&#xff0c;坚持到一周&#xff0c;就可以超过 80% 的人。这只是参与学习的群体&#xff0c;而剩余的大多数&#xff0c;根本没有参与到学习过程里来。 学一门新技术对有相关经验的人来说入门只需要一周时…...

网站如何做seo/app001推广平台

引言&#xff1a;最近在弄一个Vue的入门学习用项目&#xff0c;期间有用到 JavaScript 将中文转成拼音这个功能&#xff0c;这可真是为难人。想到了编码&#xff0c;但是没搞明白怎么将编码和拼音字母啥的联系起来。后来上网查询了才知道。声母韵母搭配的拼音&#xff08;早就忘…...

济南网站建设百家号/优化大师最新版下载

文章目录一、实验设计1、滤波前的准备2、函数设计二、实验过程三、结果分析一、实验设计 实验前的准备&#xff1a;傅里叶变换及反变换 opencv示例解读。 1、滤波前的准备 进行傅里叶逆变换需要知道原复数的实部和虚部&#xff0c;但是傅里叶变换后的图像显示的是幅度谱&…...

做公司网站的专业公司深圳/百度指数大数据

今年&#xff0c;几千万人因为疫情影响&#xff0c;失去了工作&#xff0c;说不紧张自己的工作、不担心自己的饭碗&#xff0c;都是假的。这年头&#xff0c;职场老人担心自己的体力精力拼不过年轻人&#xff0c;不努力就被替代&#xff1b;年轻人则担心自己经验能力不足&#…...

圣诞节网站模板/美国疫情最新消息

Python 交换变量以下实例通过用户输入两个变量&#xff0c;并相互交换&#xff1a;# -*- coding: UTF-8 -*-# Filename : test.py# 用户输入x input(输入 x 值: )y input(输入 y 值: )# 创建临时变量&#xff0c;并交换temp xx yy tempprint(交换后 x 的值为: {}.format(x…...