消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品,各自拥有独特的功能特性与适用场景。
本博客旨在深入剖析这四种消息队列的适用场景,通过详细阐述与丰富实例,为技术人员在架构选型时提供清晰且实用的参考。无论你是初涉分布式开发领域的新手,还是经验丰富的架构师,都能从中获取到有价值的信息,帮助你在面对复杂的业务需求时,做出最适合的技术选择。
此前,我已发布了Kafka的搭建手册,在接下来的日子里,我将持续发力,陆续推出ActiveMQ、RabbitMQ以及RocketMQ这三大消息中间件的详细搭建与应用指南,以助力大家更全面、深入地掌握这些关键技术,满足不同业务场景下的需求。

一、什么是消息队列?

消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储。一个消息队列可以被一个或多个消费者消费,包含以下三个元素:

  • Producer:消息生产者,负责产生和发送消息到Broker。
  • Broker:消息处理中心,负责消息存储、确认、重试等,一般其中会包含多个Queue。
  • Consumer:消息消费者,负责从Broker中获取消息,并进行相应处理。

二、消息队列模式

  • 点对点模式:多个生产者可以向同一个消息队列发送消息,一个具体的消息只能由一个消费者消费。
  • 发布/订阅模式:单个消息可以被多个订阅者并发地获取和处理。

三、MQ 与 Kafka 的典型适用场景剖析

1、消息队列应用场景

  • 应用解耦
    • 消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。例如,在电商系统中,订单服务、库存服务和物流服务之间通过消息队列传递信息,当库存服务需要升级时,不会影响订单服务和物流服务的正常运行。
  • 异步处理
    • 消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息。比如在用户注册场景中,注册成功后系统会发送欢迎邮件,但邮件发送可能耗时较长,将邮件发送任务放入消息队列,用户注册流程无需等待邮件发送完成,即可快速返回给用户注册成功的结果。
  • 流量削峰
    • 当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的 “载体”,在下游有能力处理的时候,再进行分发与处理。以电商促销活动为例,瞬间大量的订单请求涌入,通过消息队列将这些订单请求暂存,下游订单处理系统按照自身处理能力从队列中逐步获取订单进行处理,避免系统因高并发请求而崩溃。
  • 日志处理
    • 日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。在大型分布式系统中,各个服务产生的海量日志可通过Kafka进行收集、传输和存储,方便后续的日志分析和系统监控。
  • 消息通讯
    • 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯,比如实现点对点消息队列,或者聊天室等。像即时通讯软件中,用户发送的消息可通过消息队列进行高效传递,保证消息的实时性和可靠性。
  • 消息广播
    • 如果没有消息队列,每当一个新的业务方接入,我们都要接入一次新接口。有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。例如在数据共享平台中,数据生产者将数据发送到消息队列,多个不同的业务方作为消费者从队列中订阅所需数据,无需为每个业务方单独开发和对接数据传输接口。

2、三大MQ 与 Kafka 的典型适用场景

ActiveMQ:

  • 企业应用集成:可用于在不同的应用程序之间进行可靠的消息传递,实现系统之间的集成和通信。比如在企业内部,不同部门的业务系统之间需要进行数据交互和协同工作,ActiveMQ可以作为消息中间件来保障消息的可靠传递。
  • 分布式系统:其可扩展性和高可用性特点,使其能够支持分布式系统的构建。在一些分布式架构中,各个节点之间需要进行消息的同步和通信,ActiveMQ可以满足这一需求,确保系统整体的稳定运行。
  • 大消息传输:相较于RabbitMQ在高并发短消息处理上的优势,ActiveMQ在大消息传输方面表现更好。当系统中需要传输较大的数据包,如文件传输、大数据量的报表数据等场景时,ActiveMQ能够更高效地处理。

RabbitMQ:

  • 异步处理:适用于多种异步处理任务,如用户注册后的邮件发送、订单处理等。在电商平台中,用户下单后,订单处理涉及库存管理、支付确认等多个步骤,通过RabbitMQ异步传递订单信息,可提高处理效率,避免用户等待。
  • 应用解耦:支持多种通信模式,如点对点、发布/订阅等,能帮助系统各部分保持低耦合度,便于独立扩展和维护。在微服务架构中,各个微服务之间可通过RabbitMQ进行消息交互,减少服务间的直接依赖。
  • 流量削峰:在面对高并发请求时,RabbitMQ可以作为缓冲层,将请求消息暂存于队列中,然后由后端服务逐步处理。例如在秒杀活动等场景下,大量用户同时发起请求,RabbitMQ能够有效缓解后端服务的压力,避免系统崩溃。
    对消息传递要求较高的业务场景:由于其采用AMQP协议,具备丰富的功能特性,如灵活的消息过滤、异步RPC调用、事务支持以及定时消息等,因此适合在线交易等对消息传递的可靠性、顺序性等要求较高的业务。

RocketMQ:

  • 实时消息处理:设计之初就是为了支持互联网在线业务,非常适合对实时性要求很高的应用场合,如金融交易系统、在线支付等。能够快速地将消息传递给消费者,保障业务的实时性。
  • 顺序消息处理:对于一些要求消息严格按照发送顺序进行消费的应用,如订单状态更新、电商业务中的Binlog消息分发等,RocketMQ通过其独特的设计保证了消息的顺序性。
    事务消息处理:支持分布式事务消息,这对于确保跨多个服务或数据库操作的一致性非常关键,例如在电子商务平台中完成订单创建的同时扣减库存的操作。
  • 大数据分析:虽然Kafka更常被提到用于大数据流处理,但RocketMQ同样可以应用于日志收集、监控数据上报等领域,为后续的数据分析提供支持。
    移动互联网与物联网:鉴于其高效的消息传递能力及可扩展性,广泛应用于移动互联网服务,如即时通讯,以及物联网设备间的通信。其对MQTT协议的支持,使其成为连接海量设备的理想选择之一。
    社交网络活动流:在社交平台中,用户行为产生的大量事件流可以通过RocketMQ快速传播给相关订阅者。

Kafka:

  • 大数据领域的实时计算、日志采集等场景:Kafka是业内标准的选择,社区活跃度高,已成为许多实时数据架构中不可或缺的部分,用于处理数据缓冲与分发任务。其基于磁盘顺序写入与读取的方式优化了I/O操作效率,能够在保持较低硬件成本的同时实现非常高的吞吐量。
  • 大规模数据流处理:其设计初衷就是为了解决大规模数据流处理中的挑战,如日志收集、事件源系统等。在需要处理大量数据的场景下,Kafka的高吞吐量特点尤为突出,能够轻松应对海量数据的持续摄入和处理。
  • 与其他大数据工具集成:Kafka拥有广泛的数据处理框架集成,如Spark、Flink等,这使其成为了构建高效数据管道的强大工具,便于简化整个数据管道架构的设计与实现过程。
    消息系统替代者:可作为传统消息系统的替代品,与传统消息系统相比,Kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。

四、MQ和Kafka的架构、工作原理和优缺点

ActiveMQ

  • 架构
    包含 Producer、Broker、Consumer 等基本组件。Broker 是消息处理中心,可独立部署或嵌入应用。支持多种协议如 STOMP、OpenWire、AMQP 等,可通过这些协议与不同系统交互。
  • 工作原理
    Producer 产生消息并发送到 Broker,Broker 存储消息,Consumer 从 Broker 获取消息进行处理。支持点对点和发布/订阅模式,在点对点模式下,消息被特定消费者接收;发布/订阅模式中,消息可被多个订阅者获取。
  • 优点
    成熟产品,在许多公司有应用(非大规模场景);有多重语言的成熟客户端;支持多种协议,文档丰富。
  • 缺点
    目前社区对 5.x 维护减少,不适合大规模吞吐场景;据用户反馈会出现莫名问题且可能丢失消息;在大规模应用中存在性能瓶颈,如上千个队列的应用场景表现不佳。

RabbitMQ

  • 架构
    基于 AMQP 协议,主要组件有 Producer、Consumer、Broker(包含 Exchange、Queue、Channel 等),由生产者、消费者和服务端组成。Exchange 接收消息并按路由规则将消息路由到 Queue,Channel 是消息读写的操作通道,客户端可建立多个 Channel 进行不同会话任务。生产者连接到Server,建立连接并开启信道,声明交换器和队列,设置属性并通过路由键绑定。消费者也需建立连接和信道以接收消息。
  • 工作原理
    生产者连接到Server,建立连接并开启信道。
    生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。
    消费者建立连接,开启信道,便于接收消息。
    生产者发送消息到服务端中的虚拟主机。
    虚拟主机中的交换器根据路由键选择路由规则,将消息发送到不同的消息队列中。
    订阅了消息队列的消费者获取到消息并进行消费。常用交换器类型有 direct、topic、fanout、headers 四种。
  • 优点
    支持几乎所有受欢迎的编程语言,如Java、C、C++、C#、Ruby、Perl、Python、PHP等。
    支持消息路由,可通过不同交换器支持不同种类的消息路由。
    支持消息时序,可通过延时队列指定消息的延时时间和过期时间TTL等。
    支持容错处理,通过交付重试和死信交换器(DLX)来处理消息处理故障。
    提供易用的用户界面,方便用户监控和管理消息Broker。
    社区活跃度高。
  • 缺点
    用 Erlang 用Erlang开发,源码难以理解,不利于二次开发和维护,基本依赖开源社区维护和修复bug。
    吞吐量相对较低,实现机制较重。
    不支持消息有序、持久化较差、不支持消息回溯、伸缩性一般。

RocketMQ

  • 架构
    技术架构中有四大角色NameServer、Broker、Producer和Consumer。NameServer充当注册中心,Broker用于存放Queue,一个Broker可配置多个Topic,一个Topic中存在多个Queue。Broker通过集群部署,提供master/slave结构,slave定时从master同步数据,master宕机时,slave提供消费服务但不能写入消息。
  • 工作原理
    消息模型按主题模型实现,包括Producer Group、Topic、Consumer Group三个角色。
    一个Topic包含多个Queue,生产者组根据主题将消息放入对应Topic,采用轮询等方式找到Queue。
    消费群组和Queue的关系类似Kafka中的消费群组和Partition,不同消费者组互不干扰,一个Queue只能被一个消费者消费,一个消费者可消费多个Queue,通过偏移量记录消费位置。
  • 优点
    高吞吐,借鉴Kafka设计,单一队列有百万消息的堆积能力。
    高伸缩性,有灵活的分布式横向扩展部署架构,整体架构与Kafka类似。
    高容错性,通过ACK机制保证消息正常消费。
    消息可持久化到磁盘中,支持消息回溯。
    在一个队列中能可靠地实现先进先出(FIFO)和严格的顺序传递。
    支持发布/订阅和点对点消息模型,支持拉、推两种消息模式。
    提供docker镜像用于隔离测试和云集群部署,提供配置、指标和监控等功能丰富的Dashboard。
  • 缺点
    不支持消息路由。
    支持的客户端语言不多,目前主要是Java和C++,且C++版本不成熟。
    部分支持消息有序,需将同类消息hash到同一Queue中才能支持顺序,若散落到不同Queue则不能保证顺序。
    社区活跃度一般。

Kafka

  • 架构
    一个典型的Kafka集群包含Producer、broker、Consumer Group、Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
  • 工作原理
    消息经序列化后,通过不同分区策略(顺序轮询、随机轮询和 key hash 等)找到对应分区,相同主题和分区的消息存放在同一批次里,由独立线程发送到Kafka Broker上。
    分区是Kafka读写数据的最小粒度,可通过分区实现伸缩性。主题的分区可部署在多个不同机器上,消费者通过消费群组完成消费,一个消费者可消费多个分区,但一个分区只能被一个消费者消费。消费者增加会触发Rebalance,不同消费群组互不干涉。
    优点
    高吞吐、低延迟,每秒可处理几十万条消息,最低延迟仅几毫秒。
    高伸缩性,每个主题含多个分区,分区可分布在不同主机的broker中。
    高稳定性,是分布式系统,数据有多个副本,某节点宕机时集群仍能正常工作。
    消息可持久化存储,支持数据备份防丢失,能保证所有消息被消费且仅被消费一次,支持消息回溯。
    有优秀的第三方Kafka Web管理界面Kafka-Manager,在日志领域较成熟,被多家公司和多个开源项目使用。
  • 缺点
    单机超过64个队列/分区时,Load会明显飙高,队列越多,load越高,发送消息响应时间变长。
    不支持消息路由、延迟发送和消息重试。
    社区更新较慢。

五、MQ 与 Kafka 适用场景实例展示:

  • ActiveMQ:适用于企业级应用集成,对多种消息协议兼容,支持分布式事务,消息持久化能力强。例如,在一个银行系统中,涉及多个子系统之间的交互,如账户系统、交易系统、清算系统等,当进行一笔跨行转账时,需要保证各个系统之间的数据一致性,ActiveMQ可以通过支持XA事务来确保整个转账过程的原子性和完整性。
  • RabbitMQ:适合高并发异步处理、微服务通信及分布式任务调度,具备灵活的路由机制和强大的消息队列管理能力。例如,在一个电商网站中,当用户提交订单后,系统需要同时进行库存扣减、订单状态更新、积分计算等多个操作,这些操作可以通过RabbitMQ将任务异步发送到不同的队列中,由相应的消费者进行处理,从而提高系统的响应速度和吞吐量。
  • RocketMQ:常用于电商、金融等大型分布式系统,支持分布式事务消息和消息顺序性。例如,在电商系统的订单处理流程中,从订单创建、支付、发货到确认收货等环节,需要保证消息的顺序性,RocketMQ可以确保这些消息按照正确的顺序被处理,避免出现订单状态混乱的情况。
  • Kafka:主要用于大规模数据实时处理、流计算平台以及数据共享和交换,具有高吞吐量和可扩展性。例如,在一个互联网公司的日志收集系统中,每天会产生大量的用户访问日志、系统日志等,Kafka可以快速地接收和存储这些日志数据,并将其分发给不同的消费者进行实时分析,如统计用户行为、监控系统性能等。

六、MQ 与 Kafka 适用场景总结归纳

  • ActiveMQ 常用于企业级应用集成,它支持多种协议以及分布式事务。以银行多系统转账场景为例,在涉及储蓄系统、支付系统、清算系统等多个系统间的资金流转时,ActiveMQ 能够确保各环节数据的一致性。
  • RabbitMQ 适用于高并发异步处理场景。在电商业务中,当用户下单后,系统需同时执行如库存扣减、生成订单快照、发送下单通知邮件等多个任务。借助 RabbitMQ 灵活的路由策略,以及其对直连、主题、扇出等多种消息模式的支持,系统可以将不同类型的任务消息精准分发给对应的处理模块,高效实现复杂业务逻辑下的消息分发。例如,通过主题模式,将库存相关消息发送到库存管理模块,将邮件通知消息发送到邮件服务模块。
  • RocketMQ 在顺序消息处理和事务消息支持方面表现突出,在电商、金融等大型分布式系统中优势显著。在电商订单流程里,从用户下单、支付成功到商家发货、物流配送及最终的订单完成确认,每个环节都需要严格按照顺序处理消息。以支付成功后的流程为例,RocketMQ 能确保先发送资金到账消息给商家账户系统,再触发库存减少消息给仓储系统,保证整个流程有条不紊。在金融交易系统中,如股票买卖,RocketMQ 的事务消息支持可以保证交易的原子性,确保买卖双方资金和股票的交割准确无误。
  • Kafka 则擅长处理大规模数据实时处理场景。互联网公司每天会产生海量的用户行为日志、系统运行日志等数据。Kafka 凭借其强大的吞吐量和扩展性,能够快速收集这些日志数据,并将其高效分发给实时分析系统。比如,通过 Kafka 将用户在网站上的浏览、点击等行为日志实时传输给数据分析平台,用于实时统计热门商品、用户活跃度等信息,为运营决策提供及时支持。在这里插入图片描述在这里插入图片描述
消息队列技术
├── ActiveMQ
│   ├── 企业应用集成
│   │   ├── 多协议支持
│   │   └── 分布式事务
│   ├── 分布式系统
│   │   ├── 可扩展性
│   │   └── 高可用性
│   └── 大消息传输
│       ├── 文件传输
│       └── 大数据量报表数据
├── RabbitMQ
│   ├── 异步处理
│   │   ├── 用户注册邮件发送
│   │   └── 订单处理
│   ├── 应用解耦
│   │   ├── 点对点通信
│   │   └── 发布/订阅模式
│   ├── 流量削峰
│   │   └── 秒杀活动请求缓冲
│   └── 高要求业务场景
│       ├── 消息过滤
│       ├── 异步RPC调用
│       ├── 事务支持
│       └── 定时消息
├── RocketMQ
│   ├── 实时消息处理
│   │   ├── 金融交易系统
│   │   └── 在线支付
│   ├── 顺序消息处理
│   │   ├── 订单状态更新
│   │   └── Binlog消息分发
│   ├── 事务消息处理
│   │   └── 订单创建与库存扣减
│   ├── 大数据分析
│   │   ├── 日志收集
│   │   └── 监控数据上报
│   ├── 移动互联网与物联网
│   │   ├── 即时通讯
│   │   └── 物联网设备通信
│   └── 社交网络活动流
│       └── 用户行为事件流传播
└── Kafka├── 大数据实时计算│   ├── 日志采集│   └── 数据缓冲与分发├── 大规模数据流处理│   ├── 高吞吐量│   └── 海量数据持续摄入├── 大数据工具集成│   ├── Spark│   └── Flink└── 消息系统替代├── 高吞吐量└── 高可用性

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子: (1)Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核,分别用于计…

C语言编程笔记:文件处理的艺术

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、为什么要用文件二、文件的分…

头歌答案--爬虫实战

目录 urllib 爬虫? 第1关:urllib基础 任务描述 第2关:urllib进阶? 任务描述 requests 爬虫 第1关:requests 基础 任务描述 第2关:requests 进阶 任务描述 网页数据解析 第1关:XPath解析网页? 任务描述…

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下:2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…

Sqlmap入门

原理 在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。 当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏 分类 按注入类型 常见的sql注入…

RabbitMQ基础篇

文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式(Simple Queue)2.2 工作队列模式(Work Queues)2.3 发布/订阅模式(Publish/Subscribe)2.4 路由模式(R…

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦,保证给大家讲懂嗷; 1,线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的,或者即将工作,正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们主要来学习单个函数的声明与定义,static和extern… 这里写目录标题 一、单个函数…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景:当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景:有一天,你在王国里担任“首席审判官”。你面前站着一位嫌疑人,有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的,还是他是被冤枉的&…

HTML应用指南:利用GET请求获取全国特斯拉充电桩位置

随着电动汽车的普及,充电基础设施的建设变得至关重要。作为电动汽车领域的先驱,特斯拉不仅在车辆技术创新上持续领先,还积极构建广泛的充电网络,以支持其不断增长的用户群体。为了提升用户体验和服务质量,开发人员和数…

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量:质量评估与改进策略 引言:数据质量的概念 在大数据时代,数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途,确保数据的准确性、完整性、一致性和及时性是数据质量的…

OpenVela——专为AIoT领域打造的开源操作系统

目录 一、系统背景与开源 1.1. 起源 1.2. 开源 二、系统特点 2.1. 轻量化 2.2. 标准兼容性 2.3. 安全性 2.4. 高度可扩展性 三、技术支持与功能 3.1. 架构支持 3.2. 异构计算支持 3.3. 全面的连接套件 3.4. 开发者工具 四、应用场景与优势 4.1. 应用场景 4.2. …

寒假1.18

web(报错注入) [第一章 web入门]SQL注入-2 题解: 打开是个403界面,还以为没开成 通过题目提示,访问/login.php /user.php 合在一起访问屁都没有,分开访问,/login.php回显: /user.p…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者:来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排(schedule)和监控工作流的平台。它用于编排 ETL(Extract-Transform-Load&#xff0…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG(检索增强生成)技术应用不断发展的背景下,掌握文本相似算法不仅能够助力信息检索&…

Jenkins-Pipeline简述

一. 什么是Jenkins pipeline: pipeline在jenkins中是一套插件,主要功能在于,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多,这里面有高、中、低档,开发方式也不相同。之所以会这样,有价格的因素&am…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

6、原来可以这样理解C语言_函数(1/8)函数的概念

目录 一、函数的概念 一、函数的概念 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 ykxb ,k和b都是常数,给⼀个任意的x,就 得到⼀个y值。 其实在C语⾔也引⼊函数(function)的概念&#xff0c…

Excel 技巧10 - 如何检查输入重复数据(★★)

本文讲了如何在Excel中通过COUNTIF来检查输入重复数据。 当输入重复数据时,显示错误提示。 1,通过COUNTIF来检查输入重复数据 比如下面是想检查不要输入重复的学号。 选中C列,点 Menu > 数据 > 数据验证 在数据验证页面&#xff0c…