Kafka核心原理之精准一次性投递

【kafka系列】At Least Once语义 通过合理配置和业务设计,At-Least-Once可平衡可靠性与性能,是大多数场景的推荐选择。若Broker写入成功但网络超时,生产者重试会导致消息重复发送到Topic。失败(如消费者崩溃),下次启动时会重新拉取并处理同一消息,导致积分重复增加。复杂(需生产者、Broker、消费者协同)允许重复的业务(如日志采集)高(事务与协调开销) 阅读详情

精准一次性投递

在Kafka中,精准一次性投递(Exactly Once)=至少投递一次(At Least Once)+幂等性。

至少投递一次(At Least Once):将生产端参数acks设置为-1(all),可以保证生产端发送到Broker的消息不会丢失,即:至少投递一次(At Least Once)。

幂等性:

  • 幂等生产者幂保证单分区单会话内精准一次性投递消息。
  • 事务生产者保证跨分区跨会话精准一次性投递消息。

幂等生产者

幂等生产者指的是当发送同一条消息时,消息在Broker端只会被持久化一次,消息不丢失也不重复,它在底层设计架构中引入了ProducerID和SequenceNumber:

  • ProducerID:每个生产者启动时,Kafka会为生产者分配一个唯一标识ProducerID(注意:生产者重启时会重新分配ProducerID);
  • SequenceNumber :针对每个生产者(即:每个ProducerID),发送到指定Topic中某个分区内的消息都会为其生成一个从0开始单调递增的SequenceNumber值。

幂等性配置:生产端设置参数enable.idempotence为true。

注意:开启幂等性后,retries(重试次数)配置将默认为Integer.MAX_VALUE,acks配置将默认为-1,如果此时手动将acks设置为0,会报错。

幂等生产者实现原理

生产者在初始化时会被分配一个唯一的ProducerID(凡是开启幂等性生产者都需要生成全局唯一的ProducerID,如开启事务,则由TransactionCoordinator节点生成ProducerID,未开启事务,则由Broker自身生成ProducerID),该ProducerID对用户完全透明。

Leader所在的Broker会按<ProducerID, Topic, Partition>维度缓存SequenceNumber,对于接收的每条消息:

  • 如果消息序列号比Broker缓存中的序列号大1,则接受该消息,否则丢弃该消息。
  • 如果消息序列号比Broker缓存中的序列号大1以上,说明中间有数据尚未写入(即:乱序),此时Broker拒绝该消息。
  • 如果消息序列号小于等于Broker缓存中的序列号,说明该消息已被保存(即:重复消息),Broker丢弃该消息。

注意:生产端是以批次的方式发送消息,每个批次包含了多条消息,因此,生产端发送消息时,只会设置该批次第一条消息的序列号,该批次中其他消息的序列号是根据第一条消息的序列号计算得来。

ProducerID生产机制:

  • ProducerID通过ProducerIdManager的generateProducerId()方法获取,每个Broker都会在本地维护一个ProducerID段,当本地的ProducerID段用完后,会去Zookeeper上申请(节点:/latest_producer_id_block,每次申请1000个)。
  • 当Broker向Zookeeper申请ProducerID段时,会先获取Zookeeper中保存的当前ProducerID段最大值,然后尝试将要申请的ProducerID段写回ZK,这样其他Broker在尝试申请时,不会出现ProducerID段重复的情况。
  • 若开启事务,则由TransactionCoordinator节点生成全局唯一的ProducerID。

重新选举Leader后生产者幂等性是否有效?

有效。因为Leader分区所在的Broker缓存了PID、SequenceNumber等信息,而Leader分区中所有消息都会被复制到Followers中,当ISR中某个Follower被选举为新的Leader时,新Leader内部的消息中已经存储了PID、SequenceNumber等信息信息,因此,新Leader接收生产者消息时仍能实现消息幂等。

事务生产者

Kafka的幂等生产者只能保证单分区单会话内精准一次性投递消息,不能解决跨会话跨分区的问题。Kafka0.11版本开始引入了事务生产者,事务生产者保证Kafka在幂等生产者的基础上,实现跨分区跨会话精准一次性投递消息。

事务场景

事务生产者使用场景:

  • Producer发送多条消息组成一个事务,这些消息需要对Consumer同时可见或者同时不可见 。
  • Producer可能会给多个Topic、多个Partition发消息,这些消息需要能放在一个事务中,这是典型的分布式事务场景。
  • Kafka的应用场景经常是需要先消费一个Topic,处理后再发到另一个Topic,这个Consume-Transform-Produce过程需要放到一个事务中,比如:在消息处理或者发送的过程中失败,消费偏移量不能提交。
  • Producer或者Producer所在的应用可能会挂掉,新的Producer启动以后需要处理之前未完成的事务 。
  • 流式处理的拓扑可能会比较深,如果下游只有等上游消息事务提交以后才能读到,可能会导致RT非常长吞吐量也随之下降很多,所以需要实现Read Committed和Read Uncommitted两种事务隔离级别。

注意:当事务中仅存在Consumer消费消息的操作时,消费事务消息和Consumer手动提交Offset并没有区别。因此单纯的消费消息并不是Kafka引入事务机制的原因,单纯的消费消息也没有必要存在于一个事务中。

事务生产者实现原理

Kafka为了支持事务特性,引入一个新的组件:Transaction Coordinator,主要负责为生产者分配PID,记录事务状态等操作。

如图所示:

生产者事务执行流程:

  • 1)初始化事务:生产者向事务协调器发送InitProducerIdRequest请求,为生产者生成对应的PID。
  • 2)开启事务:生产者调用KafkaProducer#beginTransaction()方法开启事务。
  • 3)发送事务消息:
    • 生产者发送消息前,向事务协调器发送AddPartitionsToTxnRequest请求,增量记录事务关联的TopicPartition列表。
    • 生产者向Broker发送事务消息。
    • 生产者向事务协调器发送AddOffsetsToTxnRequest请求,增量记录Offsets提交前,Group Coordinator(消费者组协调器)对应的TopicPartition列表。
    • 生产者向消费者组协调器发送TxnOffsetCommitRequest请求,将生产者提交的Offsets放置在事务性待确认列表。
  • 4)提交或回滚事务:生产者向事务协调器发送EndTxnRequest请求:
    • 将Prepare消息写入 __transaction_state。
    • 事务协调器向事务关联的TopicPartitions主副本和__transaction_state中写入EndTransactionMarker标记。
  • 5)超时事务中止:事务协调器以10s/次的频率轮询检测进行中的事务是否已超时,若事务已超时,则推进Epoch、中止当前事务。后续再次收到老的生产者(Epoch小于当前Epoch)消息将抛出ProducerFencedException异常。

开启事务配置

对于生产者,通过KafkaProducer的beginTransaction()方法可以开启一个事务,调用该方法后,生产者本地会标记已经开启了一个新的事务,只有在生产者发送第一条消息之后TransactionCoordinator才会认为该事务已经开启。同时,需要设置transactional.id属性,设置了transactional.id属性后,enable.idempotence属性会自动设置为true。

对于消费者,需要设置isolation.level = read_committed,这样Consumer只会读取已经提交了事务的消息。另外,需要设置enable.auto.commit = false来关闭自动提交Offset功能。

生产者事务

为了实现跨分区跨会话的事务,需要引入一个全局唯一的TransactionID,并将生产者的PID与TransactionID绑定,这样当生产者重启后,就可以通过生产者绑定的TransactionID获得原来的PID。

为了管理事务,Kafka引入了一个新的组件Transaction Coordinator(事务协调器,事务协调器为Leader分区所在的Broker节点),生产者就是通过与Transaction Coordinator交互获得TransactionID对应的任务状态,Transaction Coordinator负责将事务操作写入Kafka的一个内部Topic(__transaction_state(默认分区数:50)),这样即使Transaction Coordinator宕机重启,由于事务状态得到保存,未完成的事务状态可以得到恢复。

消费者事务

对于消费者而言,事务能保证的语义相对较弱,无法保证已提交事务中的消息都能被消费。原因如下:

  • 对采用日志压缩策略的主题而言,事务中的某些消息有可能被清理(相同Key的消息,后写入的消息会覆盖前面写入的消息)。
  • 事务中的消息可能分布在同一个分区的多个日志分段(Segment)中,当旧的日志分段被删除时,对应的消息可能会丢失。
  • 消费者可以通过seek()方法访问任意offset的消息,从而可能遗漏事务中的部分消息。
  • 消费者在消费时可能没有分配到事务内的所有分区,因此不能读取事务中的所有消息。

消费端有一个isolation.level参数,该参数用来配置消费者的事务隔离级别(类型为字符串),有效值为read_uncommitted和read_committed,表示消费者消费到的位置,如果设置为read_committed,那么消费者会忽略事务未提交的消息,即:只能消费到LSO(Last Stable Offset,即:最后稳定偏移)的位置。默认值为read_uncommitted,即:可以消费到HW处的位置,注意:Follower副本的事务隔离级别为read_uncommitted,且不可修改。

在开启Kafka事务时,生产者发送了message1、message2、message3、message4四条消息到Broker中,如果生产者没有提交事务,对于read_committed隔离级别的消费者而言,是看不到这些消息的,设置为read_uncommitted隔离级别则可以看到。事务中第一条消息的位置标记为firstUnstableOffset(即:message1的位置)。

LSO会影响Kafka消息滞后量(Kafka Lag,即:消息堆积量)的计算。如图所示:

图中:在read_uncommitted(默认)隔离级别下,Consumer Offset表示当前的消费位置(针对普通消息的情况),Kafka Lag = HW - Consumer Offset,即:Kafka Lag计算方式不受影响(即使引入事务消息)。在read_committed隔离级别下,如果引入事务消息,Kafka Lag计算需要引入LSO来进行计算。如图所示:

图中:对于未完成的事务,LSO的值等于事务中第一条消息的位置(即:firstUnstableOffset),对于已完成的事务,LSO的值与HW相同,因此,LSO<=HW<=LEO。如下图所示:

图中:在read_committed隔离级别下,Kafka Lag = LSO - Consumer Offset。注:ControlBatch为控制消息,控制消息一共有两种类型:COMMIT和ABORT,分别用来表示事务已经成功提交或已经被成功终止。KafkaConsumer可以通过控制消息来判断对应的事务已提交或已中止,再结合参数isolation.level配置的隔离级别来决定是否将相应的消息返回给消费端。

事务恢复保证

为了实现有状态的应用也可以保证重启后从断点处继续处理(即:事务恢复)。应用程序必须提供一个稳定的(重启后不变)唯一的ID(即:Transaction ID)。Transactin ID与PID可能一一对应。区别在于Transaction ID由用户提供,而PID是内部的实现对用户透明。

另外,为了保证新的生产者启动后,旧的具有相同Transaction ID的生产者失效,生产者通过Transaction ID拿到PID的同时,还会获取一个单调递增的epoch。由于旧的生产者的epoch比新生产者的epoch小,Broker会拒绝其请求。

有了Transaction ID和epoch后,Kafka可保证:

  • 跨Session的数据幂等发送。当具有相同Transaction ID的新的生产者实例被创建且工作时,旧的且拥有相同Transaction ID的生产者将不再工作。
  • 跨Session的事务恢复。如果某个应用实例宕机,新的实例可以保证任何未完成的旧的事务要么Commit要么Abort,使得新实例从一个正常状态开始工作。

事务原子性保证

事务原子性是指生产者将多条消息作为一个事务批量发送,要么全部成功要么全部失败。 引入了一个服务器端的模块,名为Transaction Coordinator,用于管理生产者发送的消息的事务性。

该Transaction Coordinator维护Transaction Log,该Log存于一个内部的Topic内(__transaction_state(默认分区数:50))。由于Topic数据具有持久性,因此事务的状态也具有持久性。

生产者并不直接读写Transaction Log,它与Transaction Coordinator通信,然后由Transaction Coordinator将该事务的状态插入相应的Transaction Log。

Transaction Log的设计与Offset Log用于保存Consumer的Offset类似。

事务中Offset提交保证

在Kafka Stream应用中同时包含Consumer和Producer(即Consumer-Transform-Producer),前者负责从Kafka中获取消息,后者负责将处理完的数据写回Kafka的其它Topic中。

为了实现该场景下的事务原子性,Kafka需要保证对Consumer Offset的Commit与Producer对发送消息的Commit包含在同一个事务中。否则,如果在二者Commit中间发生异常,根据二者Commit的顺序可能会造成数据丢失和数据重复:

  • 如果先Commit Producer发送数据的事务,再Commit Consumer的Offset,即:At Least Once语义,可能造成数据重复。
  • 如果先Commit Consumer的Offset,再Commit Producer数据发送事务,即At Most Once语义,可能造成数据丢失。

拒绝僵尸实例(Zombie fencing)

在分布式系统中,一个实例宕机或失联,集群会启动一个新的实例来代替该实例。此时若旧实例恢复,集群中就会存在两个相同的实例(即:TransactionID和PID相同的实例),此时旧实例就被称为“僵尸实例”。

在Kafka中,两个相同的生产者实例同时处理消息并生产重复消息,这就是僵尸实例问题。

Kafka事务特性通过TransactionID属性来解决僵尸实例问题。所有具有相同TransactionID的生产者会分配相同的PID,同时,每个生产者还会分配一个递增的epoch(纪元)。Broker收到事务提交请求时,如果检查当前事务提交者的epoch不是最新值,就会拒绝该生产者的请求,从而达成拒绝僵尸实例的目标。

用于事务特性的控制型消息

为了区分写入Partition的消息被Commit还是Abort,Kafka引入了一种特殊类型的消息(即:Control Message)。该类消息的Value内不包含任何应用相关的数据,并且不会暴露给应用程序。它只用于Broker与Client间的内部通信。

对于Producer端事务,Kafka以Control Message的形式引入一系列的Transaction Marker。Consumer即可通过该标记判定对应的消息被Commit了还是Abort了,然后结合该Consumer配置的隔离级别决定是否应该将该消息返回给应用程序。

注意:

Kafka事务的回滚,并不是删除已写入的数据,而是将写入数据的事务标记为Rollback/Abort,从而在读数据时过滤该数据。

流处理平台Kafka--消息队列 1 Kafka是什么 Kafka是一个基于ZooKeeper协调的流处理平台,它由Scala和Java开发,可以实时处理大量数据,并且可以方便的扩展。Kafka由LinkedIn开发,并由LinkedIn在2010年贡献给Apache基金会,成为顶级开源项目。这篇文章主要是一些关于其核心组件消息队列的内容。 2 Kafka的特性 持久化:Kafka的消息实时持久化,允许数据在不同的broker上做备份,提高了安全性,并且不会因为消息已消费而被删除。 高吞吐量:Kafka每秒可以处理数十万条消息。 可扩展: 阅读详情

相关推荐

Kafka Exactly-Once语义实现原理深度解读

在分布式系统中,消息中间件就像"数据公交车",负责在不同服务间传递信息。但这辆"公交车"经常出问题:有时消息"坐过站"(丢失),有时"重复上车"(重复传递)。Kafka作为主流消息中间件,从0.11.0.0版本开始支持Exactly-Once语义,承诺"消息既不丢失也不重复,只被处理一次"。解释什么是Exactly-Once语义,以及它与另外两种语义(At-Least-Once、At-Most-Once)的区别;

AI架构全栈开发实战笔记 306

Kafka之精确一次处理语义

文章目录精确一次处理语义幂等性实现原理 精确一次处理语义 消息处理语义 最多一次(at most once):消息可能丢失也可能被处理,但最多只会处理一次 至少一次(at least once):消息不会丢失,但可能被处理多次 精确一次(exactly once):消息被处理且只会被处理一次 producer: 在0.11.0.0之前,kafka producer默认提供至少一次...

jannal专栏 1407

kafka性能测试工具

技术能力 通常,「技术能力」这个部分将紧接着你的个人简介之后,放在简历的核心版面。这样设计是有道理的,因为它能够帮助雇主更快的判断你的技能是否与需求相吻合。 因此在制作这一部分内容时,你应该考虑以下两点: ┃写什么? 应聘者在技术能力的描述上通常会犯两个错误:要么无用的东西写的太多,要么有用的东西写的太少。这里的多和少是相对于「雇主的招聘需求」而言的。 我建议每个应聘者在撰写简历的这部分时,都能够精心设计所需展示的技能,将自己熟练掌握的技能中与雇主需求重合的部分放在醒目的位置,如果竟然还有富余,那当然可以骄

m0_57431076的博客 451

Kafka 消息重复问题

数据重复这个问题其实也是挺正常,全链路都有可能会导致数据重复。通常,消息消费时候都会设置一定重试次数来避免网络波动造成的影响,同时带来副作用是可能出现消息重复。遇到异常,基本解决措施都是。leader分区不可用了,抛异常,等待选出新leader分区。Controller所在Broker挂了,抛异常,等待Controller重新选举。场景三:网络异常、断网、网络分区、丢包等,抛异常,等待网络恢复。poll一批数据,处理完毕还没提交offset,机子宕机重启了,又会poll。

z_ssyy的博客 1116

【Kafka】Kafka 实现 Exactly-once (ack机制、高水位)

这个acks参数在kafka的使用中,是非常核心以及关键的一个参数,决定了很多东西。Kafka producer有三种ack机制 初始化producer时在config中进行配置ack等于0:意味着producer不等待broker同步完成的确认,继续发送下一条(批)信息提供了最低的延迟。但是最弱的持久性,当服务器发生故障时,就很可能发生数据丢失。例如leader已经死亡,producer不知情,还会继续发送消息broker接收不到数据就会数据丢失。ack等于1(默认)

九师兄 1447

蚂蚁金服可靠消息投递原理与实践

作者:禅与计算机程序设计艺术 1.背景介绍 可靠消息投递(Reliable Message Delivery)的作用是确保消息的最终一致性到达消费者。在分布式系统中,由于网络原因、机器故障等各种因素导致消息传输可能出现延迟或丢失,可靠消息投递的目标就是保证消息至少被消费一次。本文将从多方面阐述可靠消

AI天才研究院 848

【Kafka】kafka消费者的三种模式(最多/最少/恰好消费一次)&生产者幂等性

文章目录概述回顾ack配置幂等性参考 概述 at most once(消费者最多收到一次消息,0--1次):acks = 0 可以实现。 acks=0 保证producer往leader只发送一次,不管是否发送成功,因此可能丢数据,但不会重复发送 at least once(消费者至少收到一次消息,1--多次):ack = all 或-1可以实现。 exactly once(消费者刚好收到一次消息):at least once 加上消费者幂等性可以实现,还可以用kafka生产者的幂等性来实现。

m0_45406092的博客 1万+

消息延迟队列自研实现:时间轮算法多层级设计,精准定时投递,解决Redis延迟队列精度不足、内存溢出问题

在分布式系统中,延迟队列是支撑核心业务的关键基础设施 —— 从电商超时订单自动关闭、分布式任务调度,到流程类消息定时推送,几乎所有需要 “对任务执行时机做精准管控” 的场景,都依赖延迟队列的可靠落地。

网络工程师|十多年企业级运维实战|精通 ‌BGP、OSPF、VLAN、SDN、MPLS、ACL、NetFlow、SNMP、 101

【Kafka核心】消息投递语义、Exactly-Once实现、幂等性、事务消息

本文系统梳理Kafka消息一致性核心体系:以「不丢不重」为目标,详解At-Most-Once、At-Least-Once、Exactly-Once三类投递语义;深入剖析幂等性(单会话单分区去重)与事务机制(跨分区/跨会话原子性)的原理与配置;最终整合生产者、Broker、消费者三方协同,实现端到端Exactly-Once。附最佳实践与避坑指南。

小江的记录本 533

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 222

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

技术人必看!3步让简历通过率翻倍的投递技巧

作为技术人,你是否也经历过投了几十份简历却石沉大海?收到面试邀请却发现自己根本匹配不上岗位需求?今天我要用技术人的方式告诉你:​​。掌握这3步核心技巧,让你的简历通过率翻倍!

2501_93135581的博客 1084

HDMI调试避坑指南:从AVI InfoFrame到通用控制包,这些DataIsland Packet细节千万别忽略

本文深入解析HDMI调试中DataIsland数据包的关键细节,包括AVI InfoFrame、通用控制包和音频时钟再生包(ACR)的配置与故障排查。通过实际案例和寄存器配置示例,帮助工程师快速定位显示异常、色彩失真和音频中断等问题,提升HDMI接口调试效率。

weixin_30897233的博客 637

详解Kafka重平衡与分区重分配,核心差异、原理及实操辨析

要辨析重平衡与分区重分配,首先要明确二者的核心定位,一个聚焦消费端,一个聚焦服务端,操作对象、核心目标完全不同,这是区分二者的基础。Kafka架构分为生产端、服务端(Broker集群)、消费端三层;分区重分配是服务端(Broker+Controller)的操作,核心管控副本分布;重平衡是消费端(Consumer Group)的操作,核心管控消费者与分区的映射;二者通过“Leader副本”深度关联,消费者最终仅连接分区的Leader副本进行读写。

小程故事多的博客 1267

逆向实战:如何绕过iTunes 12.6.5.3的反调试机制(附X64dbg插件配置)

本文深入剖析了iTunes 12.6.5.3的反调试机制与登录协议。通过X64dbg动态调试与IDA静态分析,详细演示了如何绕过其反调试检测,并定位到核心的登录协议加密函数,揭示了其请求签名(X-Apple-ActionSignature)的生成逻辑与依赖关系,为客户端安全研究与协议分析提供了实战思路。

weixin_29202213的博客 742

基于Python的异步爬虫实战:高效抓取同花顺概念板块数据

本文将详细介绍如何使用Python最新异步爬虫技术(requests-html+aiohttp+selenium)高效抓取同花顺概念板块数据。内容涵盖:反爬机制破解、动态页面渲染处理、数据解析存储等完整流程,并提供可复用的高性能爬虫代码实现。高性能:异步并发处理,QPS可达50+高可用:完善的异常处理机制可扩展:支持分布式部署增加历史数据回溯功能集成机器学习识别验证码构建实时数据推送系统。

2201_76125261的博客 1535

kafka和rabbitMQ

看吞吐量需求:若需每秒处理数十万条消息(如日志采集、大数据流),选 Kafka;若仅需每秒数千条,且需低延迟,选 RabbitMQ。看可靠性需求:若消息不允许丢失(如支付、金融),优先选 RabbitMQ;若允许少量丢包(或可通过重试弥补),Kafka 更合适。看路由复杂度:若需复杂路由(如按规则过滤、广播),选 RabbitMQ;若仅需简单 Topic 订阅,Kafka 足够。看生态适配:若与大数据组件(Spark、Flink、ELK)集成,选 Kafka;

chenfengxiu的博客 1003

新手必读!2025最全AI智能体入门手册,50个问题全讲透

感知(Perception):能读取环境,比如读取网页数据、识别用户输入、接入 API;思考(Reasoning/Planning):理解任务目标,规划出行动步骤;行动(Action):调工具、查资料、发消息、写入数据库……直接执行任务。有了这三步,智能体才不是“一个会说话的大模型”,而是真正的“能落地执行的工作代理人”。多个 Agent 分工协作,每个智能体负责一个角色或任务节点,像一个“虚拟团队”。一个爬数据的 Agent,一个提炼要点的 Agent,一个撰写报告的 Agent,

互联网架构师笔记 1969

Apache Kafka 实现原理深度解析:生产、存储与消费全流程

设计原则实现手段收益顺序读写分区日志追加写高吞吐(百万级 QPS)零拷贝低延迟(毫秒级)分布式共识ZooKeeper/KRaft 协调高可用(99.99% SLA)批量处理消息批次 + 压缩高网络效率掌握 Kafka 的核心实现原理,有助于在业务场景中做出合理架构决策,充分发挥其在大规模实时数据流处理中的威力。

代码时光 1285

C#上位机+国产PLC+AI:构建自主可控的智能生产线解决方案

全栈国产化智能产线方案并非遥不可及,基于成熟的国产硬件、丰富的.NET生态、快速发展的国产大模型,完全可以搭建出稳定可靠且具备智能能力的生产系统。落地建议采用三步走策略:基础国产化阶段:替换PLC与上位机,实现基础监控与控制功能,解决卡脖子问题,快速验证国产化方案稳定性数据沉淀阶段:完善数据采集与存储,建立设备台账、故障库、工艺库,积累高质量领域数据智能升级阶段:引入国产大模型与知识库,落地故障诊断、工艺优化、预测性维护等智能应用,持续提升产线效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 522

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1932

Kafka如何实现延迟队列?

如果采⽤每秒定时推进, 那么获取到第⼀个超时的任务列表时执⾏的200次推进中有199次属于“空推进”,⽽获取到第⼆个超时任 务时有需要执⾏639次“空推进”,这样会⽆故空耗机器的性能资源,这⾥采⽤DelayQueue来辅助以少量空间换时间,从⽽做到了“精准推进”。Kafka中的定时器真可谓是“知⼈善⽤”,⽤TimingWheel做最擅⻓的任务添加和删除操作,⽽⽤DelayQueue做最擅⻓的时间推进⼯作,相辅相成。Kafka中的定时器借助了JDK中的DelayQueue来协助推进时间轮。

完全体 1940

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Kafka核心4大组件|小白也能懂的知识点

摘要:Kafka核心组件解析:1)Topic是消息分类文件夹,通过分区实现扩展和有序性;2)Producer负责消息发送,支持灵活分区策略和批量发送;3)Consumer组成消费组拉取消息,利用offset机制跟踪进度;4)Broker集群存储中转消息,通过副本保障高可用。四者协同实现高吞吐消息传递,类比快递中转站系统。新手学习时需注意分区顺序性、消费者组平衡等关键特性。

ericthz的博客 882

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LoongCollector一次性文件采集:从ETL原理到阿里云SLS迁移实战

在数据处理领域,ETL(Extract, Transform, Load)是构建数据管道的基础技术,负责从异构数据源抽取、转换并加载数据至目标系统。其核心原理在于通过可配置的流程实现数据的自动化流动与标准化。这一技术对于数据仓库初始化、历史数据迁移及离线分析等场景具有重要价值,能够显著提升数据处理的效率与可靠性。以文件采集为例,传统脚本方式在面对海量、分散的日志文件时,往往面临效率低下和运维复杂的挑战。LoongCollector的一次性文件采集功能,正是针对这一痛点,提供了批量化、自动化的解决方案。它深度

weixin_34364071的博客 311

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Kafka 与 RabbitMQ 全方位详细对比

本质不同:Kafka 是分布式日志流平台;RabbitMQ 是AMQP 业务消息 Broker。吞吐:Kafka 百万级远超 RabbitMQ 万级,源于顺序写、零拷贝、分区并行。路由:RabbitMQ 路由极强,Kafka 路由极简。消息留存:Kafka 消息可回溯、长期存储;RabbitMQ 消费即删。消费模式:Kafka 拉模式;RabbitMQ 推模式。功能:RabbitMQ 原生延时、死信、事务完善;Kafka 原生缺失需业务改造。运维:RabbitMQ 简单;

2301_80557823的博客 323

Kafka全套学习知识手册

Apache Kafka是一款分布式实时流式事件平台,兼具消息收发、数据流传输、事件存储和流式计算调度能力,适用于日志采集、用户行为埋点、数据库同步等高吞吐场景。其核心优势包括超高吞吐(依托顺序写、零拷贝等技术)、高可用(多副本机制)、数据可回溯和强大生态兼容性。 文档系统梳理了Kafka知识体系: 基础认知:核心概念(Topic/Partition/ISR等)、应用场景、优缺点分析 架构原理:生产者发送流程、消费者Rebalance机制、副本同步与HW水位线 高阶特性:幂等生产者、事务实现、延迟队列解决方

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 646
上一篇: Kafka核心原理之消费端
下一篇: 「一发入魂」一文切底搞懂快速排序算法
南秋同学
博客等级 码龄7年 64粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值