Kafka系统学习

2023-11-02

Kafka学习视频


一、Kafka 概述

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域

二、消息队列

传统消息队列的应用场景

MQ传统应用场景之异步处理
异步、削峰、解耦

在这里插入图片描述

使用消息队列的好处

1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

3)缓冲

有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况

4)灵活性 & 峰值处理能力

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5)异步通信

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

消息队列的 两种模式

(1 )点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)

消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
在这里插入图片描述

(2 )发布/ 订阅模式(一对多,消费者消费数据之后不会清除消息)

消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。(缺点:长连接浪费资源 consumer)

三、Kafka 基础架构

在这里插入图片描述

1 )Producer :消息生产者,就是向 kafka broker 发消息的客户端;

2 )Consumer :消息消费者,向 kafka broker 取消息的客户端;

3 )Consumer Group (CG ):消费者组,由多个 consumer 组成。 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个 组内 消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即 消费者组是逻辑上的一个订阅者。

4 )Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个topic。

5 )Topic :可以理解为一个队列, 生产者和消费者面向的都是一个 topic;

6 )Partition :为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;

7)Replica: :副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。

8 )leader :每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。

9 )follower :每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower。

四、Docker安装 Kafka

学习文档

1、集群规划
在这里插入图片描述

官网

启动docker
在这里插入图片描述
安装zookeeper

docker pull wurstmeister/zookeeper

安装kafka

docker pull wurstmeister/kafka

在这里插入图片描述
启动zookeeper容器
查询自己的虚拟机ip地址
在这里插入图片描述
启动kafka容器

docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.159.128:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.159.128:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka 

在这里插入图片描述

进入kafka容器的命令行

docker exec -it kafka /bin/bash

在这里插入图片描述

集群搭建

使用docker命令可快速在同一台机器搭建多个kafka,只需要改变brokerId和端口

docker run  -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.159.128:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.159.128:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka 
docker run  -d --name kafka2 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.159.128:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.159.128:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 -t wurstmeister/kafka 

启动三台kafka
在这里插入图片描述
进入kafka容器实例该目录下
在这里插入图片描述
创建Replication为2,Partition为2的topic

在这里插入图片描述

bin/kafka-topics.sh --create --zookeeper 192.168.159.128:2181 --replication-factor 2 --partitions 2 --topic partopic

查看topic的状态

bin/kafka-topics.sh --describe --zookeeper 192.168.159.128:2181 --topic partopic

在这里插入图片描述

Kafka命令行

查看当前服务器中的所有 topic

bin/kafka-topics.sh --zookeeper 192.168.159.128:2181 --list

创建topic

选项说明:
–topic 定义 topic 名

–replication-factor 定义副本数

–partitions 定义分区数
bin/kafka-topics.sh --zookeeper 192.168.159.128:2181 --create --replication-factor 3 --partitions 1 --topic first

在这里插入图片描述删除 topic

bin/kafka-topics.sh --zookeeper 192.168.159.128:2181 --delete --topic first

发送消息
在这里插入图片描述

bin/kafka-console-producer.sh --broker-list 192.168.159.128:9092 --topic first

消费消息
在这里插入图片描述
–from-beginning:会把主题中以往所有的数据都读取出来。

bin/kafka-console-consumer.sh  --zookeeper 192.168.159.128:2181 --topic first
bin/kafka-console-consumer.sh --bootstrap-server 192.168.159.128:9092 --topic first
bin/kafka-console-consumer.sh --bootstrap-server 192.168.159.128:9092 --from-beginning --topic first

查看某个 Topic 的详情

bin/kafka-topics.sh --zookeeper 192.168.159.128:2181 --describe --topic first

在这里插入图片描述
修改分区数

bin/kafka-topics.sh --zookeeper 192.168.159.128:2181 --alter --topic first --partitions 6

六、Kafka架构深入

Kafka 生产者

①发送原理
在消息发送的过程中,涉及到了 两个线程 ——main 线程和Sender 线程。

在 main 线程中创建了 一个 双端列队列 RecordAccumulator。

main线程将消息发送给RecordAccumulator,Sender线程不断从 RecordAccumulator 中拉取消息发送到 Kafka Broker。
在这里插入图片描述

异步送 发送 API

依赖

<dependencies>
	<dependency>
		<groupId>org.apache.kafka</groupId>
		<artifactId>kafka-clients</artifactId>
		<version>3.0.0</version>
	</dependency>
</dependencies>

package com.lzm.kafkademo.Producer;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

/**
 * @description:
 * @author: lzm
 * @create: 2022-03-11 01:43
 **/
public class CustomProducer {
    public  static  void  main(String[]  args)  throws InterruptedException {
        // 1. 创建 kafka 生产者的配置对象
        Properties properties = new Properties();
        // 2. 给 kafka 配置对象添加配置信息:bootstrap.servers
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "192.168.159.128:9092");
        // key,value 序列化(必须):key.serializer,value.serializer
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                "org.apache.kafka.common.serialization.StringSerializer");

        // 3. 创建 kafka 生产者对象
        KafkaProducer<String,  String> kafkaProducer  =  new
                KafkaProducer<String, String>(properties);

        // 4. 调用 send 方法,发送消息
        for (int i = 0; i < 5; i++) {
            kafkaProducer.send(new
                    ProducerRecord<>("first","lzm " + i));
        }

        // 5. 关闭资源
        kafkaProducer.close();
    }
}

在这里插入图片描述
②带回调函数的 异步发送
回调函数会在 producer 收到 ack 时调用,为异步调用,该方法有两个参数,分别是元
数据信息(RecordMetadata)和异常信息(Exception)

如果 Exception 为 null,说明消息发送成功,如果 Exception 不为 null,说明消息发送失败。
注意:消息发送失败会自动重试,不需要我们在回调函数中手动重试。

package com.lzm.kafkademo.Producer;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

/**
 * @description:
 * @author: lzm
 * @create: 2022-03-11 01:49
 **/
public class CustomProducerCallback {
    public  static  void  main(String[]  args)  throws InterruptedException {
        // 1. 创建 kafka 生产者的配置对象
        Properties properties = new Properties();

        // 2. 给 kafka 配置对象添加配置信息
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                " 192.168.159.128:9092");
        // key,value 序列化(必须):key.serializer,value.serializer
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                StringSerializer.class.getName());

        // 3. 创建 kafka 生产者对象
        KafkaProducer<String,  String> kafkaProducer  =  new KafkaProducer<String, String>(properties);

        // 4. 调用 send 方法,发送消息
        for (int i = 0; i < 5; i++) {
            // 添加回调
            kafkaProducer.send(new ProducerRecord<>("first","哈哈 " + i), new Callback() {
                // 该方法在 Producer 收到 ack 时调用,为异步调用
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    if (exception == null) {
                        // 没有异常,输出信息到控制台
                        System.out.println(" 主 题 : "  +
                                metadata.topic() + "->" + "分区:" + metadata.partition());
                    } else {
                        // 出现异常打印
                        exception.printStackTrace();
                    }
                }
            });
            // 延迟一会会看到数据发往不同分区
            Thread.sleep(2);
        }
        // 5. 关闭资源
        kafkaProducer.close();
    }
}

在这里插入图片描述
在这里插入图片描述

③同步发送 API
只需在异步发送的基础上,再调用一下 get()方法即可
在这里插入图片描述

七、生产者分区

分区好处

在这里插入图片描述

分区策略

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

自定义分区器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现步骤:

(1)定义类实现 Partitioner 接口。
(2)重写 partition()方法

package com.lzm.kafkademo.Producer;

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;

import java.util.Map;

/**
 * @description:
 * @author: lzm
 * @create: 2022-03-11 09:35
 **/
public class MyPartitioner implements Partitioner {
    /**
     * 返回信息对应的分区
     *
     * @param topic      主题
     * @param key        消息的 key
     * @param keyBytes   消息的 key 序列化后的字节数组
     * @param value      消息的 value
     * @param valueBytes 消息的 value 序列化后的字节数组
     * @param cluster    集群元数据可以查看分区信息
     * @return
     */
    @Override
    public int partition(String topic, Object key, byte[]
            keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        // 获取消息
        String msgValue = value.toString();
        // 创建 partition
        int partition;
        // 判断消息是否包含 lzm
        if (msgValue.contains("lzm")) {
            partition = 0;
        } else {
            partition = 1;
        }
        // 返回分区号
        return partition;
    }

    // 关闭资源
    @Override
    public void close() {
    }

    // 配置方法
    @Override
    public void configure(Map<String, ?> configs) {
    }
}

生产者 如何提高吞吐量

在这里插入图片描述
在这里插入图片描述

八、数据可靠性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

九、数据去重

在这里插入图片描述
在这里插入图片描述
如何使用幂等性
开启参数 enable.idempotence 默认为 true,false关闭。

kafka事务

在这里插入图片描述
事务api

// 1 初始化事务
void initTransactions();

// 2 开启事务
void beginTransaction() throws ProducerFencedException;

// 3 在事务内提交已经消费的偏移量(主要用于消费者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets, String  consumerGroupId) throws ProducerFencedException;

// 4 提交事务
void commitTransaction() throws ProducerFencedException;

// 5 放弃事务(类似于回滚事务的操作)
void abortTransaction() throws ProducerFencedException;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
public class CustomProducerTransactions {
	public  static  void  main(String[]  args)  throws InterruptedException {
	// 1. 创建 kafka 生产者的配置对象
	Properties properties = new Properties();
	
	// 2. 给 kafka 配置对象添加配置信息
	properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
	"hadoop102:9092");
	// key,value 序列化
	properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
	StringSerializer.class.getName());
	properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
	StringSerializer.class.getName());
	
	// 设置事务 id(必须),事务 id 任意起名
	properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,
	"transaction_id_0");
	
	// 3. 创建 kafka 生产者对象
	KafkaProducer<String,  String>  kafkaProducer  =  new KafkaProducer<String, String>(properties);
	
	// 初始化事务
	kafkaProducer.initTransactions();
	
	// 开启事务
	kafkaProducer.beginTransaction();
	
	try {
		// 4. 调用 send 方法,发送消息
		for (int i = 0; i < 5; i++) {
			// 发送消息
			kafkaProducer.send(new  ProducerRecord<>("first",
			"atguigu " + i));
		}
		// int i = 1 / 0;
		
		// 提交事务
		kafkaProducer.commitTransaction();
		
	} catch (Exception e) {
		// 终止事务
		kafkaProducer.abortTransaction();
	} finally {
	
		// 5. 关闭资源
		kafkaProducer.close();
		}
	}
}

十、数据顺序

在这里插入图片描述
在这里插入图片描述

十一、Kafka Broker

在这里插入图片描述
启动 Zookeeper 客户端:

bin/zkCli.sh

通过 ls命令可以查看 kafka 相关信息:

ls /kafka

prettyZoo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改ip地址和主机名
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kafka系统学习 的相关文章

  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • SpringBoot+SpringMVC+Mybatis+Swagger实现用户注册、登录功能

    SpringBoot Mybatis Swagger实现用户注册 登录功能 文章目录 1 实现流程图 2 后台业务开发 3 启动项目 测试结果 1 实现流程图 2 后台业务开发 添加实体类 entity beans pojo 使用Easy
  • set_multicycle_path

    set multicycle path的语法 保持关系与建立关系相关联 使用以下公式计算最常见情况下的保持周期数 默认情况下 setup path multiplier 是用对应的目的时钟定义的 要修改有关源时钟的setup需求 使用 st
  • js中类数组对象以及类数组转换的方法(ES6, ES5)

    js中类数组对象以及类数组转换的方法 ES6 ES5 类数组 Array like 对象 通常我们可以把拥有一个length属性和非负整数属性的对象称为类数组对象 JavaScript 数组与一般对象的区别 当有新元素添加到列表中时 自动更
  • 企业网络规划和设计方案(一)

    企业网络规划和设计方案 一 工程概况公司有一栋独立大楼 高4层 每层面积2000平方米 由研发技术部 成员60人 分成硬件 25 和软件 35 2大部门 生产部 主要产品是手持电子产品 110人 管理人员10人 和市场部 30个销售 10个
  • AV1生态系统更新:2019年6月

    Kay是热心的AV1关注者 他在blog上持续搜集了关于AV1的进展 很抱歉 我们延误了很久才发布这篇非常不错的blog 希望对你了解AV1有所帮助 文 Kay Singh 译 John 原文 https www singhkays com
  • 分享8个免费的超清背景图片下载网站

    想用免费的桌面背景图 还是前端开发做页面展示 下面推荐10个超清的免费背景图下载网站 1 wallhaven cc wallhaven cc拥有进1000万张高质量壁纸 无广告 支持名称搜索 像素搜索 整体色调搜索 不支持中文 采用IPV6
  • robot自动化测试实现多浏览器支持

    做自动化测试首先要保证的就是用例覆盖面完整 而UI测试首先保证就是浏览器覆盖率问题 robot支持的火狐和谷歌浏览器 IE都很好 当然IE可能有一点问题 不过10 11切换的用问题不大 目前用户大多用360浏览器进行上网 我们构建一下使36
  • 数据挖掘中常用的数据清洗方法有哪些?

    原文来自 https www zhihu com question 22077960 answer 24095218 从两个角度上看 数据清洗一是为了解决数据质量问题 二是让数据更适合做挖掘 不同的目的下分不同的情况 也都有相应的解决方式和
  • 网络编程 用代码创建进程

    创建进程的多种方式 1 鼠标双击启动图标 2 使用代码创建应用进程 如何用代码创建进程 python中有跟进程相关的模块multiprocessing 意思为多进程 from multiprocessing import Process i
  • Java 多线程写同一个文件实现

    最近项目中需要从网站上抓取大量的数据 采用了多线程技术 每个线程抓取的数据都需要保存到一个文件中 避免消耗大量的内存 思路 多个访问线程将需要写入到文件中的数据先保存到一个队列里面 然后由专门的 写出线程负责从队列中取出数据并写入到文件中
  • Activity启动源码分析

    我会思考的是 activity的启动过程是什么样的呢 是什么原理呢 有哪些好的地方 哪些不好的地方呢 可不可以更好呢 首先 是会执行到startActivityForResult 然后会执行Instrumention的execStartAc
  • GDB调试-小试牛刀

    This is the GNU debugger Usage gdb options executable file core file or process id gdb options args executable file infe
  • vue自定义组件+Dialog 对话框组件定制弹出框教程

    1 新建一个 vue页面 写一个Dialog组件 把弹出框上想要展示的内容放进去
  • 学习笔记(97):R语言入门基础-pairs绘图

    立即学习 https edu csdn net course play 24913 285841 utm source blogtoedu pairs函数 m matrix 1 16 nrow 4 pairs m 对应结果 df data
  • prettier 配置

    使用 VS Code 开发的时候会配合 prettier 来进行代码格式化 这里贴出一份 prettier 配置 所有的配置都是默认配置 注释中也有表明相关的网站 options 是使用 google 翻译的 可能有翻译的不准确的地方 不过
  • 使用tensorflow训练模型时可能出现nan的几种情况

    最近在做基于MTCNN的人脸识别和检测的项目 在训练模型的过程中总是会不定时地出现损失值为nan的情况 Debug了好久终于找到了问题所在 这里总结以下可能出现nan的几种情况 1 在分类问题中 我们经常使用到交叉熵损失函数 需要注意的是
  • thymeleaf加载数据失败

    在使用thymeleaf进行传送模型数据的时候 发现只有return数据 没有对应的页面 后台代码如下 前端代码如下 应该将 RestController 改成 Controller 测试成功 原因 如果使用 RestController注
  • idea如何开启Run Dashboard

    1 使用场景 IDEA开发工具中以 run 或 debug 方式启动多个 SpringBoot 应用时 日志控制台排开在窗口上方 服务间调用涉及日志追踪时 不方便快速切换来查看日志信息 如下图所示 IDEA提供了强大Dashboard功能
  • css的层叠顺序

    css中用z index来控制定位元素的层叠顺序 z index integer auto 整数值越大 元素离我们越近 一旦给一个定位元素设定了z index的值 不是auto 那么它就为它的所有后代建立了一个新的局部层叠上下文 如
  • Kafka系统学习

    Kafka学习视频 文章目录 一 Kafka 概述 二 消息队列 传统消息队列的应用场景 使用消息队列的好处 消息队列的 两种模式 三 Kafka 基础架构 四 Docker安装 Kafka Kafka命令行 六 Kafka架构深入 Kaf