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

2023-03-15 RabbitMQ

RabbitMQ整合

官网erlang版本 : 20.3.8.x

官方rabbitMq版本: rabbitmq-server-generic-unix-3.7.14.tar.xz

1.安装

1.1 安装erlang

1.安装环境

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

2.在/usr/local/下创建erlangapp文件夹,创建erlang文件夹

mkdir /usr/local/erlangapp
mkdir /usr/local/erlang

2.将erlang安装包上传到该目录

3.解压

tar -zvxf 

4.进入erlang解压目录中

5.由于是configure.in,所以需要使用autoconf生成配置

./otp_build autoconf 

如果报错autoconf找不到,则需要安装

yum -y install autoconf

6.进入文件,编译安装

./configure
make  
make install  

7.配置环境变量

/*进入环境变量配置文件*/
vim /etc/profile
//在底部添加环境变量
export ERLANG_HOME=/usr/local/lib/erlang  
export PATH=$PATH:$ERLANG_HOME/bin 

8.重新加载环境变量

source /etc/profile

9.输入erl查看

erl
halt().//退出

1.2 RabbitMQ安装

1.创建rabbitMQ文件夹上传

mkdir /usr/local/rabbitmq/

2.解压

 xz -d rabbitmq-server-generic-unix-3.7.14.tar.xz tar -vxf rabbitmq-server-generic-unix-3.7.14.tar 

3.配置环境变量

 vim /etc/profile
向文件添加export PATH=$PATH:/usr/local/rabbitmq/rabbitmq/sbin
//重新加载source /etc/profile

4.启动

rabbitmq-server -detached   【开启rabbitmq服务】
rabbitmqctl status      【查看服务状态】
rabbitmqctl start_app    【启动应用】
rabbitmq-plugins enable rabbitmq_management   【开启web管理插件】

5.添加管理员

rabbitmqctl add_user 用户名 密码
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"  //配置权限
rabbitmqctl set_user_tags 用户名 administrator  //修改用户角色,将用户设为管理员
rabbitmqctl list_users   //查看所有用户
rabbitmqctl delete_user guest   //删除guest用户

6.启动

http://ip:15672

2.RabbitMQ原生使用

1.pom依赖

	   <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version></dependency>

2.连接工具类

package com.li.direct.util;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;import java.io.IOException;public class RabbitMQUtil {private static final String HOST_ADDRESS="192.168.25.102";private static final Integer PORT=5672;private static final String VIRTUAL_HOST="/";private static final String USER_NAME="root";private static final String PASSWORD="root";public static Connection getConnection() throws IOException {com.rabbitmq.client.ConnectionFactory factory=new com.rabbitmq.client.ConnectionFactory();factory.setHost(HOST_ADDRESS);factory.setPort(PORT);factory.setVirtualHost(VIRTUAL_HOST);factory.setUsername(USER_NAME);factory.setPassword(PASSWORD);Connection connection=factory.newConnection();return connection;}public static void main(String[] args) {Connection connection = null;try {connection = getConnection();Channel channel = connection.createChannel();System.out.println(channel);} catch (IOException e) {e.printStackTrace();}finally {try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

2.1 消息生产者

//消息提供者
public class MqProvider {//声明交换机public static final String EXCHANGE_NAME="changTest1";//声明队列public static final String QUEUE_NAME="quTest1";public static void main(String[] args) {System.out.println("消息提供者运行。。。");//获取连接Connection connection = null;Channel channel = null;try {connection = RabbitMQUtil.getConnection();//创建信道channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_NAME,"direct",false,false,false,null);//声明队列channel.queueDeclare(QUEUE_NAME,false,false,false,null);//进行队列绑定channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"test1");String msg = "这是一条消息";int i = 0;//发布消息while (i<100){channel.basicPublish(EXCHANGE_NAME,"test1",null,(msg+i).getBytes(StandardCharsets.UTF_8));i++;}} catch (IOException e) {e.printStackTrace();}finally {if(channel!=null){try {channel.close();} catch (IOException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (IOException e) {e.printStackTrace();}}}}
}

2.2 消息消费者

//消费测试/*** 当设置自动应答时,如果一个队列有多个消费者,则会平均分配* 如果要按能者多劳,需要设置手动应答,并设置ack流速*/
public class MqConsumer {//声明队列public static final String QUEUE_NAME="quTest1";public static void main(String[] args) {System.out.println("消费者1运行。。。。");//获取连接Connection connection = null;Channel channel = null;try {connection = RabbitMQUtil.getConnection();//创建信道channel = connection.createChannel();//创建消费方QueueingConsumer queueingConsumer = new QueueingConsumer(channel);//控制ack流速,表示每次进行ack确认前只会处理一条消息channel.basicQos(1);//设置自动应答channel.basicConsume(QUEUE_NAME,false,queueingConsumer);//获取消息while (true){QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();byte[] msg = delivery.getBody();//获取消息标识(序号)long tag = delivery.getEnvelope().getDeliveryTag();System.out.println(new String(msg));//消息确认,根据消息序号(false只确认当前一个消息收到,true确认所有比当前序号小的消息(成功消费,消息从队列中删除 ))channel.basicAck(tag,false);}} catch (Exception e) {e.printStackTrace();}finally {if(channel!=null){try {channel.close();} catch (IOException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (IOException e) {e.printStackTrace();}}}}
}

3.Spring整合RabbitMQ

pom依赖

   	 <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.7.1.RELEASE</version></dependency>

3.1 消息生产者

核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"><bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"><!-- username,访问RabbitMQ服务器的账户,默认是guest --><property name="username" value="root" /><!-- username,访问RabbitMQ服务器的密码,默认是guest --><property name="password" value="root" /><!-- host,RabbitMQ服务器地址,默认值"localhost" --><property name="host" value="192.168.25.102" /><!-- port,RabbitMQ服务端口,默认值为5672 --><property name="port" value="5672" /></bean><rabbit:admin connection-factory="connectionFactory" /><bean id="jsonMessageConverter"class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /><!-- queue 队列声明 --><rabbit:queue  durable="false" auto-delete="false" exclusive="false" name="logQueue" /><rabbit:queue  durable="false" auto-delete="false" exclusive="false" name="NewsQueue" /><!-- exchange queue binging key 绑定 --><rabbit:direct-exchange name="logExchange" durable="false" auto-delete="false"><rabbit:bindings><rabbit:binding queue="logQueue" key="admin:logs" /></rabbit:bindings></rabbit:direct-exchange><rabbit:direct-exchange name="searchExchange" durable="false" auto-delete="false"><rabbit:bindings><rabbit:binding queue="NewsQueue" key="admin:news" /></rabbit:bindings></rabbit:direct-exchange><bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate"><constructor-arg name="connectionFactory" ref="connectionFactory"/><property name="messageConverter" ref="jsonMessageConverter"/></bean></beans>

消息发送

    @Autowiredprivate AmqpTemplate amqpTemplate;//给消息队列amqpTemplate.convertAndSend("logExchange","admin:logs",logsVo);

3.2 消息消费者

核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"><bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"><!-- username,访问RabbitMQ服务器的账户,默认是guest --><property name="username" value="root" /><!-- username,访问RabbitMQ服务器的密码,默认是guest --><property name="password" value="root" /><!-- host,RabbitMQ服务器地址,默认值"localhost" --><property name="host" value="192.168.25.102" /><!-- port,RabbitMQ服务端口,默认值为5672 --><property name="port" value="5672" /></bean><rabbit:admin connection-factory="connectionFactory" /><bean id="jsonMessageConverter"class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /><bean id="newsSearchConsumerListener" class="com.li.search.listener.NewsSearchConsumerListener"/><!-- queue 队列声明 --><rabbit:queue  durable="false" auto-delete="false" exclusive="false" name="NewsQueue" /><!-- 消息监听 --><rabbit:listener-container connection-factory="connectionFactory" ><rabbit:listener ref="newsSearchConsumerListener" queues="NewsQueue"/></rabbit:listener-container></beans>

消息消费

public class NewsSearchConsumerListener implements MessageListener {@Autowiredprivate ElasticSearchConfig elasticSearchConfig;@Overridepublic void onMessage(Message message) {System.out.println("消息消费。。。。。");//获取消息byte[] msg = message.getBody();try {//反序列化NewsVo newsVo = JSONObject.parseObject(msg, NewsVo.class);//创建要索引的对象NewsIndexVo newsIndexVo = new NewsIndexVo();newsIndexVo.setId(new Long(newsVo.getId()));//添加索引//获取创建的索引IndexRequest indexRequest = new IndexRequest("news");indexRequest.id(newsIndexVo.getId()+"");//HttpRest方式请求,所以请求体必须以http方式进行请求,格式符合http规范String jsonString = JSONObject.toJSONString(newsIndexVo);//设置请求的参数为json数据indexRequest.source(jsonString, XContentType.JSON);//对数据进行索引操作elasticSearchConfig.esRestClient().index(indexRequest,ElasticSearchConfig.COMMON_OPTIONS);} catch (IOException e) {e.printStackTrace();}}
}

4.SpringBoot整合RabbitMQ

pom依赖

	 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

1.yml核心配置

 #配置rabbitmq
spring: rabbitmq:host: 192.168.25.102 #主机地址port: 5672  #端口号username: root #用户名password: root #密码virtual-host: /  #虚拟主机地址listener:  #消息监听配置simple:acknowledge-mode: manual #手动确认消息  auto自动确认

2.核心配置类

@Configuration
public class RabbitMQConfig {//声明交换机@Beanpublic DirectExchange newsExchange(){return new DirectExchange("newsExchange");}//声明队列@Beanpublic Queue newsRemoteQueue(){return new Queue("newsRemoteQueue");}//交换机队列绑定@Beanpublic Binding springExchangeBindSpringQueue(){return  BindingBuilder.bind(newsRemoteQueue()).to(newsExchange()).with("admin:news");}}

3.消息队列监听

@Component
public class RabbitMQListener {@Autowiredprivate NewsMapper newsMapper;@Autowiredprivate NewsRemoteNewsMapper newsRemoteNewsMapper;//将新闻数据存到新闻表@RabbitListener(queues = "xxx")@RabbitHandlerpublic void addNews(Channel channel, Message message){String newsStr = new String(message.getBody());NewsRemoteNews newsRemoteNews = JSONObject.parseObject(newsStr, NewsRemoteNews.class);}}

5.常见场景应用

5.1 死信队列

消息生产


//死信
public class DlxProvider {//声明死信队列public static final String DLX_EXCHANGE_NAME = "dlx_exchange";public static final String DLX_QUEUE_NAME="dlx_queue";//声明普通队列public static final String EXCHANGE_NAME = "exchange_test";public static final String QUEUE_NAME = "queue_test";public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtil.getConnection();Channel channel = connection.createChannel();//声明死信交换机channel.exchangeDeclare(DLX_EXCHANGE_NAME,"direct",false,false,false,null);//声明死信队列channel.queueDeclare(DLX_QUEUE_NAME,false,false,false,null);//绑定死信队列channel.queueBind(DLX_QUEUE_NAME,DLX_EXCHANGE_NAME,"");//声明普通交换机channel.exchangeDeclare(EXCHANGE_NAME,"direct",false,false,false,null);//设置参数Map<String,Object> map = new HashMap<>();//map.put("x-message-ttl",6000);//超时时间map.put("x-dead-letter-exchange",DLX_EXCHANGE_NAME);//要去的死信队列map.put("x-dead-letter-routing-key","");//死信队列路由key//声明队列channel.queueDeclare(QUEUE_NAME,false,false,false,map);//绑定队列channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"abc");//发送消息channel.basicPublish(EXCHANGE_NAME,"abc",null,"这是一条消息".getBytes());channel.close();connection.close();}
}

死信队列

//死信队列消费者
public class DlxQueueConsumer {public static final String DLX_QUEUE_NAME="dlx_queue";public static void main(String[] args) throws Exception {System.out.println("死信队列消费运行。。。。");//获取连接Connection connection = RabbitMQUtil.getConnection();//创建信道Channel channel = connection.createChannel();//创建消费方QueueingConsumer queueingConsumer = new QueueingConsumer(channel);//控制ack流速,表示每次进行ack确认前只会处理一条消息channel.basicQos(1);//设置自动应答channel.basicConsume(DLX_QUEUE_NAME, true, queueingConsumer);while (true){QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();//获取消息byte[] msg = delivery.getBody();//获取消息标识(序号)long tag = delivery.getEnvelope().getDeliveryTag();System.out.println(new String(msg));}}
}

死信消费者

//消费者(测试死信队列)
public class DlxConsumer {//声明队列public static final String QUEUE_NAME = "queue_test";public static void main(String[] args) throws Exception {System.out.println("消费者运行。。。。");//获取连接Connection connection = RabbitMQUtil.getConnection();//创建信道Channel channel = connection.createChannel();//创建消费方QueueingConsumer queueingConsumer = new QueueingConsumer(channel);//控制ack流速,表示每次进行ack确认前只会处理一条消息channel.basicQos(1);//设置自动应答channel.basicConsume(QUEUE_NAME, false, queueingConsumer);QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();//获取消息byte[] msg = delivery.getBody();//获取消息标识(序号)long tag = delivery.getEnvelope().getDeliveryTag();try {System.out.println(new String(msg));//业务正常时,消息确认channel.basicAck(tag, false);}catch (Exception e){//如果业务出现异常,服务器异常,拒绝确认消息,第三个参数代表是否重新入队//拒绝重新入队和拒绝不确认时,会进入死信队列,//如果允许重新入队则需保证rabbit集群,否则会死循环channel.basicNack(tag,false,false);}channel.close();connection.close();}
}

5.2 延迟消息处理

第一种是使用普通队列和死信队列来模拟实现延迟的效果。将消息放入一个没有被监听的队列上,设置TTL(一条消息的最大存活时间)为延迟的时间,时间到了没有被消费,直接成为死信,进入死信队列。后监听私信队列来消息消费

第二种是使用rabbitmq官方提供的delayed插件来真正实现延迟队列。

相关文章:

2023-03-15 RabbitMQ

RabbitMQ整合 官网erlang版本 : 20.3.8.x 官方rabbitMq版本&#xff1a; rabbitmq-server-generic-unix-3.7.14.tar.xz 1.安装 1.1 安装erlang 1.安装环境 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel2.在/usr/local/下创建erlangapp文件…...

二叉树链式结构的实现

文章目录1.二叉树的遍历1.1前序、中序以及后序遍历1.2代码测试1.3层序遍历1.4二叉树遍历习题2.节点个数以及高度2.1二叉树节点个数2.2叶子节点个树2.3第k层节点个数2.4树的高度1.二叉树的遍历 1.1前序、中序以及后序遍历 学习二叉树结构&#xff0c;最简单的方式就是遍历。所…...

蓝桥杯刷题冲刺 | 倒计时28天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.卡片2.数字三角形3.购物单4.回文日期1.卡片 题目 链接&#xff1a; 卡片 - 蓝桥云课 (lanqiao…...

一文带你吃透操作系统

文章目录1. 进程、线程管理2. 内存管理3. 进程调度算法4. 磁盘调度算法5. 页面置换算法6. 网络系统7. 锁8. 操作系统知识点文章字数大约1.9万字&#xff0c;阅读大概需要65分钟&#xff0c;建议收藏后慢慢阅读&#xff01;&#xff01;&#xff01;1. 进程、线程管理 进程和线程…...

计算机网络英文简称汇总

分类名词全拼汉译概述B2CBusiness-to-Consumer商对客概述P2PPeer-to-Peer对等概述C/SClient-Server服务器-客户机概述ITUInternational Telecommunication Union国际电信联盟概述IEEEInstitute of Electrical and Electronics Engineers电气与电子工程师协会概述ICCCInternatio…...

腾讯云云服务器标准型S5性能配置简单测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;标准型S5云服务器基于全新优化虚拟化平台&#xff0c;配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…...

RK3568平台开发系列讲解(Linux系统篇)消息队列

🚀返回专栏总目录 文章目录 一、创建消息队列二、发送和接收消息三、内核结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢消息队列在如下两个方面上比管道有所增强: 消息队列中的数据是有边界的,发送端和接收端能以消息为单位进行交流,而不再是无分隔的字节流…...

2021电赛国一智能送药小车(F题)设计报告

2021电赛国一智能送药小车&#xff08;F题&#xff09;设计报告 【写在前面的话】 电赛是一个很奇妙的过程&#xff0c;可能有些人觉得电赛的门槛太高&#xff0c;那便意味着&#xff0c;当你决定要参加电赛的那一刻起&#xff0c;这一段路、这些日子就注定不会太轻松&#xf…...

刚工作3天就被裁了....

前言 还有谁&#xff1f;刚上三天班就被公司公司的工作不适合我&#xff0c;叫我先提升一下。 后面我也向公司那边讨要了一个说法&#xff0c;我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事上记录一下&#xff0c;一是记录一下自己的成长轨迹&#xff0c;二是…...

docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎

默认已经有docker环境 下载与安装 elasticsearch &#xff0c;从hub.docker里面可以看到最新版本的镜像&#xff0c;选择你想要的版本 本教程是以 7.17.7 为案例&#xff0c;为啥不适用最新的&#xff0c;首先个人一般需用最新的版本&#xff0c;如果有亢很难填&#xff0c;其次…...

蓝桥冲刺31天之315

没有一个冬天不可逾越 也没有一个春天不会来临 所有美好的食物&#xff0c;都会有一个等待的过程 低谷时蛰伏&#xff0c;静默时沉淀 做三四月的事&#xff0c;在八九月自有答案 目录 A&#xff1a;0的个数 题目描述: 输入格式 输出格式 样例输入 样例输出 评测用例规模与…...

常见排序算法

/懂了和写出来是两码事啊啊......orz./ Talk is cheap, show me the code 一、快速排序 直接背模板就能过&#xff1a; 当xq[lr>>1]的边界情况 此时x取的是序列中间靠左的位置(如果序列个数为奇,则取正中间,如果为偶,则取中间靠左),此时如果元素个数为2, 则中间靠左就…...

C语言实现学生成绩管理系统思考

学生成绩管理系统思考 作业要求&#xff1a; 目录 思路 基本函数 学习理解大佬的代码&#xff1a; 完成作业&#xff1a; 思路 学生成绩管理系统&#xff0c;首先要初始化系统&#xff0c; 用C语言做学生实验管理系统要求实现对某班学生3门课程&#xff08;包括语文、数…...

C++11中Lambda新特性

1.定义 lambda匿名函数的语法格式&#xff1a; [外部变量访问方式说明符](参数)mutablenoexcept/throw()->返回值类型 {函数体; };其中各部分的含义分别为&#xff1a; a.[外部变量方位方式说明符] []方括号用于向编译器表明当前是一个lambda表达式&#xff0c;其不能被省略…...

【jvm系列-01】初识虚拟机与java虚拟机

初识虚拟机与java虚拟机一&#xff0c;虚拟机与java虚拟机1&#xff0c;虚拟机2&#xff0c;java虚拟机3&#xff0c;jvm整体结构图4&#xff0c;jvm的架构模型5&#xff0c;jvm的生命周期6&#xff0c;jvm的种类划分6.1&#xff0c;Sun Classic Vm6.2&#xff0c;Exact VM6.3&…...

「Python 基础」数据库应用编程

Python 定义了一套 DB-API&#xff0c;任何数据库要连接到 Python&#xff0c;只需要提供符合 Python 标准的数据库驱动即可&#xff1b; 文章目录1. 连接 SQLite1. 建表、插入数据2. 查询数据2. 连接 MySQL1. 安装驱动2. 演示连接3. SQLAlchemy1. 安装2. DBSession3. add4. qu…...

一个nginx的小项目,不写代码,实现在局域网内访问其他电脑的网页

准备工作 下载nginx //官网 https://nginx.org/en/download.html //直接下载 https://nginx.org/download/nginx-1.23.3.zip解压 下载一个html项目&#xff0c;或者自己随便写一个 我是直接下载的&#xff0c;然后使用的是第一个01 https://gitee.com/StarPort/HTML_CSSTe…...

23.3.14打卡 2022年江西省大学生程序设计竞赛(正式赛)ABL

就写了签到, 其他题没写, 这场好像3题就银了 纪念一下3.14原粥率日 比赛链接:https://ac.nowcoder.com/acm/contest/43898 A题 Special Adjustment Method 题意 给出非负整数x, y, z 你可以让其中两个数字-1, 另外一个2, 使得x2y2z2x^2y^{2}z^{2}x2y2z2最大 题解 这题很容…...

用idea操作hbase数据库,并映射到hive

依赖条件&#xff1a;需要有Hadoop&#xff0c;hive&#xff0c;zookeeper&#xff0c;hbase环境映射&#xff1a;每一个在 Hive 表中的域都存在于 HBase 中&#xff0c;而在 Hive 表中不需要包含所有HBase 中的列。HBase 中的 RowKey 对应到 Hive 中为选择一个域使用 :key 来对…...

手机解锁方法:8个顶级的 Android 手机解锁软件

一般来说&#xff0c;太简单的密码是不安全的&#xff0c;所以我们设置一个安全的密码&#xff0c;可能会稍微复杂一点。然而&#xff0c;我们可能经常会忘记复杂的密码并锁定我们的 Android 智能手机。 8个顶级的 Android 手机解锁软件 如果您遇到过这种情况并且正在寻找一种…...

ARM PMCCNTR寄存器:性能监控与时钟周期计数详解

1. ARM PMCCNTR寄存器深度解析在现代处理器架构中&#xff0c;性能监控单元(PMU)是系统调优和性能分析的关键组件。作为ARM架构性能监控的核心&#xff0c;PMCCNTR寄存器提供了精确的处理器时钟周期计数能力。这个64位寄存器在AArch32和AArch64执行模式下具有架构映射关系&…...

手把手教你用Gstreamer和V4L2在Zynq MPSoC上搭建视频流Pipeline(HDMI IN to DP OUT)

从HDMI到DP&#xff1a;Zynq MPSoC视频流处理全链路实战指南 当你的Zynq MPSoC开发板已经完成硬件设计&#xff0c;Petalinux系统也顺利启动&#xff0c;却发现HDMI输入的视频信号无法正确显示在DP接口的显示器上——这种"最后一公里"的集成问题往往最令人抓狂。本文…...

构建可复用技能库:从代码片段到自动化工作流的工程实践

1. 项目概述&#xff1a;从零构建一套可复用的“副爪”技能库在技术社区里&#xff0c;我们常常会看到一些零散的代码片段、脚本工具或者临时的解决方案&#xff0c;它们像散落的“爪子”一样&#xff0c;能解决特定问题&#xff0c;但不成体系&#xff0c;难以复用和传承。我自…...

从‘仿真’到‘半虚拟化’:一文读懂VMware虚拟网卡(E1000/E1000E/VMXNET3)的工作原理与演进史

从仿真到半虚拟化&#xff1a;虚拟网卡技术演进与设计哲学深度解析 虚拟化技术已经成为现代计算架构的基石&#xff0c;而网络虚拟化则是其中最为关键的组成部分之一。在虚拟化环境中&#xff0c;虚拟网卡作为连接虚拟机与外部世界的桥梁&#xff0c;其设计理念直接影响着整个…...

AAAI‘2026 模型记错了,检索也救不了?KG+TruthfulRAG想解决这个死结

背景介绍 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在生成与理解任务上表现突出&#xff0c;但其内部“参数化知识”具有静态、滞后的特点&#xff1a; 面对时效性知识、专业知识、隐私知识等&#xff0c;模型可能缺乏覆盖&#xff1b;即便检索增强生成&#…...

从Distributed到Lumped:三种SPEF寄生模型,你的芯片时序分析该选哪一个?

芯片时序分析中的SPEF模型选择&#xff1a;精度与效率的终极权衡 在28nm以下工艺节点&#xff0c;互连线寄生效应导致的时序偏差可能占到整体时钟周期的30%以上。面对动辄数千万个net的现代SoC设计&#xff0c;工程师们不得不在模型精度与运行时间之间做出艰难抉择。就像一位资…...

【AI原生架构黄金法则】:SITS 2026现场实录的7条反直觉设计铁律(仅限首批参会专家内部流出)

AI原生应用架构设计&#xff1a;SITS 2026技术专家实战经验分享 更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;SITS 2026现场共识与AI原生架构范式跃迁 在SITS 2026全球智能系统技术峰会上&#xff0c;来自37个国家的架构师、AI平台工程师与标准化组…...

在MacBook Pro上构建工业物联网数据采集:libmodbus实战指南

1. 为什么选择MacBook Pro作为工业物联网开发平台 工业物联网开发通常需要频繁的现场调试和设备对接&#xff0c;传统工控机笨重且不便携。MacBook Pro凭借其出色的性能表现和稳定的macOS系统&#xff0c;正在成为工程师们的新宠。我去年参与一个智慧农业项目时&#xff0c;就深…...

nlux框架:快速构建可定制AI对话界面的JavaScript解决方案

1. 项目概述&#xff1a;一个面向未来的对话式AI集成框架如果你最近在关注AI应用开发&#xff0c;尤其是想在自己的产品里快速集成一个类似ChatGPT那样的智能对话界面&#xff0c;那你很可能已经听说过或者搜索过“nlux”或“nlkitai/nlux”这个项目。简单来说&#xff0c;nlux…...

CANN/ge 图引擎资源释放

aclgrphBuildFinalize 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、Tens…...