Kafka基础概念

看完这篇Kafka,你也许就会了Kafka Kafka学习 文章目录Kafka学习1. Kafka简介1.1 Kafka消费模式1.2 Kafka的基础架构1.3 Kafka的安装和使用2. Kafka高级2.1 工作流程2.2 文件存储2.3 生产者分区策略2.4 生产者ISR2.4.1 副本数据同步策略2.4.2 ISR(同步副本集)2.5 生产者ack机制2.6 数据一致性问题2.7 ExactlyOnce3. 消费者分区分配策略3.1 分区分配策略3.2 消费者offset的存储3.3 消费者组案例4. 高效读写&Zookeeper作 阅读详情

 

 

1. 楔子

公司项目开发用到了kafka,可是某个菜鸟不会,于是不得不进行的为期一周的晚自习去恶补相关知识。

但是恶补来知识很零散,所以趁这次周末写一篇博客,总结一下得失,顺便查缺补漏。

2. Kafka

2.1 Kafka是什么

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

2.2 kafka相关概念

Broker:即Kafka的服务器,用户存储消息,Kafa集群中的一台或多台服务器统称为 broker。

Producer:消息的生产者,是消息的产生的源头,负责生成消息并发送到Kafka服务器上。

Consumer:消息消费者,是消息的使用方,负责消费Kafka服务器上的消息。

Group:消费者分组,用于归组同类消费者,在Kafka中,多个消费者可以共同消息一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有同一个分组名称,通常也被称为消费者集群。group下订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以被分配给其他group)

Offset:消息存储在Kafka的Broker上,消费者拉取消息数据的过程中需要知道消息在文件中的偏移量,这个偏移量就是所谓的Offset。

Topic:主题,由用户定义并配置在Kafka服务器,用于建立生产者和消息者之间的订阅关系:生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。

Partition:消息分区,一个Topic下面会分为很多分区,例如:“kafka-test”这个Topic下可以分为6个分区,分别由两台服务器提供,那么通常可以配置为让每台服务器提供3个分区,假如服务器ID分别为0、1,则所有的分区为0-0、0-1、0-2和1-0、1-1、1-2。Topic物理上的分组,一个 topic可以分为多个 partition,每个 partition 是一个有序的队列。partition中的每条消息都会被分配一个有序的 id(offset)。

2.2 kafka的优缺点

优点:
高吞吐量
低延迟
分布式
消息代理能力
高并发
批处理能力(ETL之类的功能)
实时处理

缺点 

没有完整的监控工具集 
消息调整的问题
不支持使用通配符选择主题
缺乏一致性
性能降低 
表现笨拙

 

2.3 kafka和其他MQ对比
 

参考:https://blog.youkuaiyun.com/yunfeng482/article/details/72856762

 

2.4 kafka集成springboot

假设你已经安装好自己的kafka了

引入依赖和设置application.yml,版本号根据自己的kafka版本决定

<dependency>
	<groupId>org.springframework.kafka</groupId>
	<artifactId>spring-kafka</artifactId>
</dependency>
kafka:
  bootstrap_servers_config: 192.168.75.128:9092
  retries_config: 0
  batch_size_config: 16384
  buffer_memory_config: 33554432
  topic: one,two,three
  group_id: asdf
  auto_offset_reset: earliest
  enable-auto-commit: true
  auto_commit_interval: 100
  consumeOneTopic: one
  consumeTwoTopic: two

 

编写kafka生产者配置类 KafkaConsumerConfig.java

package com.example.demokafka.config;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * className: KafkaConfig <br/>
 * packageName:com.example.demokafka.config <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-7 22:44 <br/>
 */
@Configuration
@EnableKafka
public class KafkaProducerConfig {
    @Value("${kafka.bootstrap_servers_config}")
    private String bootstrap_servers_config;

    @Value("${kafka.retries_config}")
    private String retries_config;

    @Value("${kafka.batch_size_config}")
    private String batch_size_config;

    @Value("${kafka.buffer_memory_config}")
    private String buffer_memory_config;

    @Value("${kafka.group_id}")
    private String groupId;

    @Value("${kafka.auto_offset_reset}")
    private String autoOffsetReset;

    @Value("${kafka.enable-auto-commit}")
    private String enableAutoCommit;

    @Value("${kafka.auto_commit_interval}")
    private String autoCommitInterval;

    @Bean
    public Map<String, Object> producerConfigs() {
        HashMap<String, Object> configs = new HashMap<>();
        // 生产者
        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers_config);
        configs.put(ProducerConfig.RETRIES_CONFIG, retries_config);
        configs.put(ProducerConfig.BATCH_SIZE_CONFIG, batch_size_config);
        configs.put(ProducerConfig.BUFFER_MEMORY_CONFIG, buffer_memory_config);
        configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        return configs;
    }

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        //注意这个 不要把auto flush设置成true,会非常低效率
        KafkaTemplate<String, String> stringStringKafkaTemplate = new KafkaTemplate<>(producerFactory());
        return stringStringKafkaTemplate;
    }
}

 

编写消费者配置类 KafkaConsumerConfig.java

package com.example.demokafka.config;

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.*;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;

import java.util.HashMap;
import java.util.Map;

/**
 * className: KafkaConfig <br/>
 * packageName:com.example.demokafka.config <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-7 22:44 <br/>
 */
@Configuration
@EnableKafka
public class KafkaConsumerConfig {
    @Value("${kafka.bootstrap_servers_config}")
    private String bootstrap_servers_config;

    @Value("${kafka.retries_config}")
    private String retries_config;

    @Value("${kafka.batch_size_config}")
    private String batch_size_config;

    @Value("${kafka.buffer_memory_config}")
    private String buffer_memory_config;

    @Value("${kafka.group_id}")
    private String groupId;

    @Value("${kafka.auto_offset_reset}")
    private String autoOffsetReset;

    @Value("${kafka.enable-auto-commit}")
    private String enableAutoCommit;


    @Value("${kafka.auto_commit_interval}")
    private String autoCommitInterval;

    @Bean
    public Map<String, Object> consumerConfigs() {
        HashMap<String, Object> configs = new HashMap<>();
        //消费者
        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers_config);
        configs.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        configs.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
        configs.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
        configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);

        return configs;
    }

    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        factory.getContainerProperties().setPollTimeout(1000);
        return factory;
    }

    @Bean
    public Consumer<String, String> consumer() {
        return consumerFactory().createConsumer();
    }

    public ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }
}

编写kafka的消息发送者  KafkaSender.java

package com.example.demokafka.producer;

import com.alibaba.fastjson.JSON;
import com.example.demokafka.entity.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.UUID;
import java.util.concurrent.Executors;

/**
 * className: KafkaSender <br/>
 * packageName:com.example.demokafka.producer <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-7 22:45 <br/>
 */
@Component
@Slf4j
public class KafkaSender {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    //发送消息方法
    public void send(String topic) {
        Executors.newSingleThreadExecutor().submit(() -> {
            while (true) {
                Message message = new Message();
                message.setId(System.currentTimeMillis());
                message.setMsg(UUID.randomUUID().toString());
                kafkaTemplate.send(topic, JSON.toJSONString(message));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.info("send success");
            }
        });
    }

}

 

接下类编写消费者的代码,

1.新建一个消费者父类 MsgConsume,所有的消费者需要实现这个父类的抽象方法

package com.example.demokafka.consumer.base;

import lombok.Data;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.stereotype.Component;

/**
 * className: MsgConsumer <br/>
 * packageName:com.example.demokafka.consumer.base <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-8 22:21 <br/>
 */

@Component
@Data
public abstract class MsgConsumer {

    public abstract String getTopic();

    public abstract void doWork(ConsumerRecord consumerRecord);

}

2.编写一个消费者去继承他

package com.example.demokafka.consumer;

import com.example.demokafka.consumer.base.MsgConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * className: ConsumeOne <br/>
 * packageName:com.example.demokafka.consumer <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-25 13:38 <br/>
 */
@Component
public class ConsumeOne extends MsgConsumer {

    @Value("${kafka.consumeOneTopic}")
    private String topic;

    @Override
    public String getTopic() {
        return topic;
    }

    @Override
    public void doWork(ConsumerRecord consumerRecord) {
        System.out.println("it is one");
    }
}

3.然后新建一个消费者group,这个group中有很多消费者,消费到消息时,group循环消费者list,每个消费者消费自己topic下的消息

package com.example.demokafka.consumer.base;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * className: ConsumerGroup <br/>
 * packageName:com.example.demokafka.consumer.base <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-25 13:35 <br/>
 */

@Component
@Data
public class ConsumerGroup {

    private List<MsgConsumer> consumerList= new ArrayList<>();

}

4.以上好了以后,建立 KafkaReceive.java 用于消费消息

package com.example.demokafka.consumer;

import com.example.demokafka.consumer.base.ConsumerGroup;
import com.example.demokafka.consumer.base.MsgConsumer;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.Arrays;
import java.util.concurrent.Executors;

/**
 * className: KafkaConsumer <br/>
 * packageName:com.example.demokafka.consumer <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-8 22:14 <br/>
 */

@Component
public class KafkaReceive {

    @Autowired
    private Consumer consumer;

    @Value("${kafka.topic}")
    private String topic;

    public void consumer(ConsumerGroup consumerGroup) {
        Executors.newSingleThreadExecutor().submit(() -> {
            try {
                // 订阅主题
                consumer.subscribe(Arrays.asList(topic.split(",")));
                while (true) {
                    ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofMillis(1000));
                    for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                        for (MsgConsumer msgConsumer : consumerGroup.getConsumerList()) {
                            if (msgConsumer.getTopic().contains(consumerRecord.topic())) {
                                msgConsumer.doWork(consumerRecord);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}

5.最后在项目启动时候,加上 kafka 的消费任务

package com.example.demokafka.start;

import com.example.demokafka.consumer.ConsumeOne;
import com.example.demokafka.consumer.ConsumeTwo;
import com.example.demokafka.consumer.KafkaReceive;
import com.example.demokafka.consumer.base.ConsumerGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;

/**
 * className: KafkaTask <br/>
 * packageName:com.example.demokafka.start <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-25 19:10 <br/>
 */
@Configuration
public class KafkaTask implements CommandLineRunner{

    @Autowired
    private ConsumerGroup consumerGroup;

    @Autowired
    private KafkaReceive kafkaReceive;

    @Autowired
    private ConsumeOne consumeOne;

    @Autowired
    private ConsumeTwo consumeTwo;

    @Override
    public void run(String... args) throws Exception {
        startConsume();
    }

    /**
     * kafka消费
     */
    public void startConsume(){
        consumerGroup.getConsumerList().add(consumeOne);
        consumerGroup.getConsumerList().add(consumeTwo);
        kafkaReceive.consumer(consumerGroup);
    }

}

ok,到此为止基本上就结束了,编写一个接口去测试一下是否可以消费,

package com.example.demokafka.controller;

import com.example.demokafka.producer.KafkaSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * className: KafkaController <br/>
 * packageName:com.example.demokafka.controller <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-7 22:51 <br/>
 */
@RestController
public class KafkaController {

    @Autowired
    private KafkaSender kafkaSender;

    @GetMapping("/send")
    public String send(@RequestParam(name = "topic") String topic) {
        kafkaSender.send(topic);
        return "SUCCESS";
    }
}

 

浏览器发送http请求:http://localhost:8080/send?topic=one

控制台打印信息如下:

 

 

 

除了上面的那种消费方法,还可以使用注解监听的方式消费消息,如下 KafkaListen.java

package com.example.demokafka.consumer;

import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * className: KafkaReceiver <br/>
 * packageName:com.example.demokafka.consumer <br/>
 * description:  <br/>
 *
 * @author yuwen <br/>
 * @date: 2020-4-7 22:48 <br/>
 */
@Component
@Slf4j
public class KafkaListen {

    @KafkaListener(topics = {"yuwen"})
    public void listen(ConsumerRecord<?, ?> record) {

        Optional<?> kafkaMessage = Optional.ofNullable(record.value());

        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            log.info("----------------- record =" + record);
            log.info("------------------ message =" + message);
        }

    }

}

 

3. 最后

kafka初步的学习已经达成目标,处于会用阶段,至于kafka原理什么的,这些需要深入了解才能写出博客,不然就是误己误人。因此在这里就暂告一段落吧。

写了一篇博客,算是一个小小的学习产物吧,而且以后再次回顾kakfa也非常的方便。

 

end

深入浅出理解kafka原理系列之:发送消息的缓冲区机制buffer.memory、batch.size、linger.ms 深入理解kafka原理:发送消息的缓冲区机制buffer.memory、batch.size、linger.ms一、buffer.memory二、batch.size三、linger.ms kafka默认会创建一个消息缓冲区,用来存放要发送的消息,缓冲区是32M kafka本地线程会去缓冲区中一次拉16k的数据,发送到broker 如果线程拉不到16k的数据,间隔10ms也会将已拉到的数据发送到broker 一、buffer.memory 设置发送消息的本地缓冲区,如果设置了该缓冲区,消息会先发送到本 阅读详情

相关推荐

【Kafka】Kafka生产者producer相关参数详解batch.size linger.ms 等参数

在消息发送的过程中,涉及到了两个线程 — main 线程和Sender线程。在main线程中创建了一个双端队列 RecordAccumulator。main线程将消息发送给ResordAccumlator,Sender线程不断从 RecordAccumulator 中拉去消息发送到 Kafka Broker彩图灰色图。

九师兄 4512

参数 中_Kafka中Producer关键参数配置说明

生产环境中使用Kafka,参数调优非常重要,而Kafka参数众多,下面介绍一些经常设置的重要参数。一、buffer.memoryKafka的客户端发送数据到服务器,不是来一条就发一条,而是经过缓冲的,也就是说,通过KafkaProducer发送出去的消息都是先进入到客户端本地的内存缓冲里,然后把很多消息收集成一个一个的Batch,再发送到Broker上去的,这样性能才可能高。buffer.memo...

weixin_34404808的博客 557

kafka基础概念

为了保证高可靠性,kafka采用了副本备份存储消息机制,副本存在的唯一目的就是放置数据丢失。副本面向的对象是partition,而不是面向具体的消息。在kafka中,replication分为两类:leader replication和follower replication。根据follower与leader副本的消息同步状态可以将副本分为:ISR与OSR【AR】:所有副本【ISR】:副本同步队列【OSR]:副本掉队队列3.5.3.2、ISR简介。

上好佳的博客 648

大数据与Kafka系列之kafka生产者各种启动参数说明

首先是启动一个生产者, final String kafkazk="localhost:9092"; String topic="testAPI"; Properties properties = new Properties() {{ put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkazk); ...

跋跋寒的博客 1万+

通过JLink下载实现工控MCU批量烧录实战案例

利用JLink下载工具实现高效稳定的工控MCU批量烧录,提升产线效率。案例详细解析了脚本配置与自动化流程,突出jlink下载的可靠性和可扩展性,适用于大规模嵌入式部署场景。

weixin_30205153的博客 814

RK3588开发板DDR频率上不去?手把手教你用ddrbin_tool降频调优(附完整配置流程)

本文详细介绍了RK3588开发板DDR频率调优的完整解决方案,重点使用ddrbin_tool工具进行降频配置。从硬件原理分析到实战操作,包括参数导出、频率调整、二进制生成及烧录验证,帮助开发者解决DDR高频不稳定问题,提升系统可靠性。适用于嵌入式开发、工业控制等场景。

weixin_42713608的博客 548

【Kafka】Kafka基础概念笔记

【代码】【Kafka】Kafka基础操作笔记。

Decade_Faiz的博客 1436

大模型技术驱动智慧矿山数字化转型

多模态大模型作为AI领域的前沿技术,通过融合视觉、传感器等多源数据,构建了强大的环境理解与决策能力。其核心价值在于打破数据孤岛,实现实时分析与智能响应,特别适用于工业场景中的复杂系统优化。在智慧矿山建设中,该技术通过数字孪生、设备自诊断和智能调度等模块,显著提升了安全生产效率和资源利用率。典型应用包括基于强化学习的采掘路径规划、多层级灾害预警体系构建,以及可自我更新的矿山知识图谱系统,这些创新正在推动传统矿业向数字化、智能化方向转型。

weixin_29061531的博客 223

Kafka 中的核心概念

Kafka 中的核心概念

学习笔记! 1810

Ubuntu 22.04下GNU Radio 3.10全家桶编译避坑实录:从UHD、VOLK到WiFi收发模块gr-ieee802-11

本文详细介绍了在Ubuntu 22.04系统下编译安装GNU Radio 3.10全家桶的完整流程,包括UHD驱动、VOLK优化库以及WiFi信号处理模块gr-ieee802-11的集成。通过逐步指导解决版本兼容性和依赖问题,帮助研究人员快速搭建高效的软件定义无线电开发环境,特别适合使用USRP设备进行无线通信研究的开发者。

weixin_30825199的博客 447

kafka基础-什么是kafka以及kafka中的一些基本概念

在之前的文章中已经介绍了什么是消息队列以及为什么使用消息队列。本篇文章就来介绍一下当今市面上比较流行的一款消息队列-kafka,虽然是基础内容但对后续的学习非常重要。kafka是⼀种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语⾔编写,目前是 Apache 的开源项目。⾼性能:以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。持久性:消息最终被持久化到磁盘,且提供数据备份机制防止数据丢失。

qq_52173163的博客 854

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限,烦请指出~IPM变换(逆透视变换),顾名思义,即将正常透视效应消除的变换,变换结果为鸟瞰图BEV(俯视图);AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图(也是俯视),其使用的单应矩阵将四个相机转到同一个俯视坐标系。

mxdsdo09的博客 4175

Kafka—核心概念总结

本文主要介绍了Kafka的架构和核心概念

qq_29356529的博客 1079

【AutoSAR】【以太网】TCP/IP 栈详述与配置

目录 一、TCP/IP栈架构 二、TCP\IP栈的可扩展性 三、以太网协议V4 四、以太网协议 V6 五、基于IP的协议 六、函数调用序列图 一、TCP/IP栈架构 根据以上架构图,该栈主要包括:UPD\TCP\DHCP\ICMP\IPV4\IPV6\ARP; 二、TCP\IP栈的可扩展性 TCP\IP栈为适应不同的应用场景需求,将分为三类: 配置工程里的配置项: 三、以太网协议V4 1 IPV4 Internet Protocol (IP)是T.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 5697

国产上位机软件突围:适配统信UOS/麒麟OS的跨平台开发技术与实践(2026年信创实战指南)

(航天科技集团CTO):“在信创战场上,1ms的延迟意味着1个卫星的控制失效。2026年,C#/.NET MAUI不是选择,而是我们守护卫星的‘生命线’。

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

Kafka的基本概念

Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。Kafka的基本架构由生产者、消费者和主题(topic)组成。生产者可以将数据发布到指定的主题,而消费者可以订阅这些主题并消费其中的数据。同时,Kafka还支持数据流的处理和转换,可以在管道中通过Kafka Streams API进行流式计算,例如过滤、转换、聚合等。

m0_45164511的博客 1584

Devexpress16.2.6破解工具

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

Kafka的这些重要概念,不管啥时候都得牢记

今天分享一波Kafka的重点概念,让大家对 Kafka有个整体的认识和感知或者重温一下,后面还会详细的解析每一个概念的作用以及更深入的原理。

技术专家 433

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

kafka核心概念

一、Kafka核心概念 1、Broker(数据节点) 在Kafka集群里面,一台服务器里面的一个kafka进程,就算是一个Broker。 2、Topic(数据主题) 是一个逻辑概念,将数据往不同的主题上发,一个主题包含了多个分区,一个分区 又有多个副本,每个副本都存在于不同的Broker上,所以往topic上发送的数据,最终会发送到 某个分区副本(leader)上(也就是某个Broker的log文件中) 3、Partition(数据分区) 每个Topic有一个或者多个分区,这些分区有一个或者多个副本,

zhangCheng的博客 308

数学建模模型总结

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

消息队列kafka的基础概念和部署

消息队列(Message Queue,简称 MQ)本质是一个 FIFO(先入先出)的队列,存储单元为 “消息”,主要用于不同服务、进程、线程间的通信。

m0_74186706的博客 1118

Kafka 中的几个概念

转自:https://www.cnblogs.com/mengyou0304/p/4836555.html 基本概念 下面的概念中有部分逻辑概念,部分实体概念。 Broker 物理概念,指服务于Kafka的一个node。 topic MQ中的抽象概念,是一个消费标示。用于保证Producer以及Consumer能够通过该标示进行对接。可以理解为一种Naming方式。 partitio...

【欢迎关注公众号:冬瓜白】 679

Kafka的核心概念

&nbsp;&nbsp;&nbsp;&nbsp;Kafka 是一个分布式的流处理平台,在 kafka0.8.x 版本的时候,kafka 主要是作为一个分布式的、可分区的、具有副本数的日志服务系统(Kafka™ is a distributed, partitioned, replicated commit log service), 具有高水平扩展性、高容错性、访问速度快、分布式等特性;主要应用场...

生活,本身就是一场“知行合一”的修行。 1041

【kafka】基本概念

Kafka 会持久化存储消息,并非消费后立即删除,即使消费者离线,重启后仍可消费离线期间的消息(只要未被清理)。,也是流式计算的核心组件。必须属于一个消费者组。

qq_52200849的博客 760
上一篇: logback集成springboot框架、集成ssm框架小结
下一篇: Java 遍历 HashSet 为什么输出是有序的
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值