您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

一文带您快速入门Kafka

时间:2023-07-07 12:29:33  来源:51CTO  作者:
作者 | 蔡柱梁
审校 | 重楼

目标

  1. 了解 Kafka 的重要概念
  2. 搭建 Kafka 服务端
  3. 使用SpringBoot 实现简单的 Demo

1 了解 Kafka 的重要概念

Kafka 是使用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统。目前,它的定位是一个分布式流式处理平台。
Kafka 在我们工作中最常扮演的三个角色:
  • 消息系统
Kafka 和传统的消息中间件一样具有系统解耦、冗余存储、流量削峰、异步通信等功能。
  • 存储系统
Kafka 会将消息持久化到磁盘,并且有多副本机制,有效降低了数据丢失的风险。有时,我们也可以使用它来存储数据,只需要把对应的数据保留策略设置成为“永久”即可。
  • 流式处理平台
Kafka 不仅为很多流式处理框架(如:Storm、Spark、Flink 等)提供了可靠的数据来源,还提供了一个完整的流式处理类库。

1.1 基本概念


上图(图出自于《深入理解Kafka核心设计与实践原理》)体现了 Kafka 的整体架构,Producer 发送消息,Kafka 将元数据存储在 ZK 中并交由ZK 管理,Consumer 通过拉模式获取消息。
  • Producer
生产者,消息的投递方,负责创建消息并投递到 Kafka 中。
  • Broker
Kafka 服务实例
  • Consumer
消费者,处理消息的一方
上面的概念都是物理层面上的,但是在实际使用过程中还有很多逻辑方面的定义,这些概念也是需要了解的。如果不了解,就算勉强写出了代码,但是自己还是一脸懵不知道自己都定义了什么,它们都有什么意义,估计离生产故障就不远了。
接下来我们再去了解三个重要的逻辑概念:
  • Topic(主题)
生产者创建消息是要发送给特定的主题的,而消费者拉取消息也是要指定主题的。消息就是通过主题来归类的。
  • Partition(分区)
一个Topic 可以有多个 Patition,而一个 Partition 只属于一个 Topic。同一个 Topic 下,不同 Partition 存储的消息是不同的。
  • Offset(偏移量)
Kafka 的消息是可以持久化并反复消费的,这是因为在每个分区中,当有消息写入就会像追加日志那样顺序写入(顺序IO的写入性能是十分好的),通过Offset 来记录对应消息所在的位置。因此,Offset 是消息在 Partition 中的唯一标识,并且能看出同一个 Partition 内的消息的先后顺序,我们称之为 “Kafka 保证消息在分区内是有序的”。
为了更好,更直观体现上面三者的关系,我们先一起看下图(图出自于《深入理解Kafka核心设计与实践原理》)

该图展示了一个拥有4个 Partition 的 Topic,而分区里面的阿拉伯数字就是 Offset(也表示着一条消息),虚线部分代表新消息可以插入的位置。每条消息在发送到 Broker 之前,会先计算当前消息应该发送到哪个 Partition。因此,只要我们设置合理,消息可以均匀地分配在不同的 Partition 上,当发现请求数量激增时,我们也可以考虑通过适当增加 Partition(Broker 也要增加)的方式,从而降低每个 Broker 的 I/O 压力。
另外,为了降低消息丢失的风险,Kafka 为 Partition 引进了多副本(Replica)机制,通过增加副本数量来提高容灾能力。副本之间采用的是“一主多从”的设计,其中 Leader 负责读写请求,Follower 则仅负责同步 Leader 的消息(这种设计方式,大家应该要意识到会存在同步滞后的问题),并且副本处于不同的 Broker 中,当 Leader 出现故障(一般是因为其所在的 Broker 出现故障导致的)时,就从 Follower 中重新选举出新的 Leader 提供服务。当选出新的 Leader 并恢复服务后,Consumer 可以通过之前自己保存的 Offset 来继续拉取消息消费。
结合到目前为止我们所知道的知识点,一起看下 4 个 Broker 的 Kafka 集群中,某一个 Topic 有三个 Partition,其副本因子为 3(副本因子为3就是每个 Partition 有 3 个副本,一个 Leader,两个 Follower)的架构图(图出自于《深入理解Kafka核心设计与实践原理》)。

1.2 Message 与 Partition

在 1.1 小节中,我们已经知道一条消息只会存在一个 Partition中(只管 Leader,不管 Follower),而 Offset 则是消息在 Partition 中的唯一标识。而在本章节,我们将一起更深入地了解消息与 Partition 的关系,还有副本间同步数据所衍生的一些概念。
上面有提到 Kafka 的多副本机制是 Leader 提供读写,而 Flower 是需要同步 Leader 的数据的,那么具体是怎样的呢?请看下图(单主题单分区3副本):

当Producer 不断往 Leader 写入消息时,Flower 会不断去 Leader 拉取消息,但是每台机器的性能会有出入,所以同步也有差异,正如上图这般。对于 Consumer 而言,只有 HW 之前的消息是可见可拉取消费的,这样做有个好处就是当发生故障转移时,Consumer 的 Offset 也不会发生数组越界的问题。这种做法是 Kafka 权衡利弊后给出的数据可靠性性能平衡的方案,即不采取同步复制(性能差,对于高并发场景是灾难般的设计),也不采取异步复制(完全异步,数据丢失问题突出)。
当然,对于Producer 而言就是消息丢失了,有时我们需要确保消息百分百投递,这样不就有问题了吗?不急,Kafka 可以在 Producer 的配置上配置 acks=-1 + min.insync.replicas=n(n 大于 1),这样配置后,只有消息被写入所有副本后,Kafka 服务端才会返回 ack 给 Producer。
下面来梳理下上面提及的几个概念:
  • HW(Heigh Watermark)
它标识了Consumer 可以拉取消息的最高水位,客户端拉取的 Offset 必须小于 HW。
  • LEO(Log End Offset)
这个标记位标识下一条写入的消息应该存放的位置。
  • AR(Assigned Rplicas)
所有副本的统称
  • ISR(In-Syns Rplicas)
与Leader 保持一定程度同步的 Flower 集合。这个一定程度指的是在可容忍滞后范围内,这个可容忍范围可以通过配置修改。
  • OSR(Out-of-Sync Rplicas)
同步滞后超过了容忍范围的Flower 集合。

2 搭建 Kafka 服务端

这里仅以单节点为例,不配置集群。

2.1 安装 ZooKeeper

在第一章节,我们知道 Kafka 会将元数据交由 ZK 管理,所以我们要先安装好 ZK。
1.首先检查自己的linux 是否安装好了 yum 工具
rpm -qa|grep yum
 

使用 yum 安装好 wget
2.下载 ZK
wget https://archive.Apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz


3.解压
tar -zxvf zookeeper-3.4.6.tar.gz
 
4.为ZK 创建存放数据和日志的文件夹
mkdir data 
mkdir logs
 

5.修改ZK 配置文件
cd conf
cp zoo_sample.cfg zoo.cfg
 

vi zoo.cfg
修改配置内容具体如下:
# ZooKeeper 服务器心跳时间,单位:毫秒
tickTime=2000
# 投票选举新 Leader 的初始化时间
initLimit=10
# Leader 与 Flower 心跳检测最大容忍时间,响应超过 syncLimit*tickTime,就剔除 Flower
syncLimit=5
# 存放数据的文件夹
dataDir=/root/zookeeper-3.4.6/data
# 存放日志的文件夹
dataLogDir=/root/zookeeper-3.4.6/logs
# ZooKeeper提供给接入客户端的连接端口
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the mAIntenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
 
接着,到 /root/zookeeper-3.4.6/data 创建文件 myid(如果部署的是集群,那么这个 myid 必需唯一,不能重复)。
cat > myid
vi myid
 
具体如下:

6.配置环境变量
vi /etc/profile
 export ZOOKEEPER_HOME=/root/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin

再执行 source /etc/profile
至此,ZooKeeper 已经配置好了,我们可以启动看下是否有问题。

2.2 安装 Kafka

1.到官网下载安装包

2.使用 psftp 上传到服务器
# put dir remoteDir
put D:downloadskafka_2.13-3.5.0.tgz /root/kafka_2.13-3.5.0.tgz
 

3.解压
tar -zxvf kafka_2.13-3.5.0.tgz
4.修改配置
 
cd kafka_2.13-3.5.0cd config/
 由于 server.properties 比较大,就不全部贴上来了,只贴我修改的部分:
# 是Broker的标识,因此在集群中必需唯一
broker.id=0
# Broker 对外服务地址(我这里vmware的ip是192.168.226.140)
listeners=PLAINTEXT://192.168.226.140:9092
# 实际工作中,会分内网外网,当有需要提供给外部客户端使用时,我们一般 listeners 配置内网供 Broker 之间通信使用,而 advertised.listeners 配置走外网给接入的客户端使用
#advertised.listeners=PLAINTEXT://your.host.name:9092
# 存放消息日志文件地址
log.dirs=/root/kafka_2.13-3.5.0/logs
# ZK 的访问路径,我这里因为 ZK 和 Kafka 放在了同一个服务器上,所以就使用了 localhost
zookeeper.connect=localhost:2181
 
5.修改环境变量
vi /etc/profile
 export KAFKA_HOME=/root/kafka_2.13-3.5.0
export PATH=$PATH:$KAFKA_HOME/bin
再执行 source /etc/profile
6.进入bin目录,启动 Broker
kafka-server-start.sh ../config/server.properties &
ps -ef|grep kafka 看下进程,但是是否已经可以使用,要通过发送消息和消费消息来验证。

3 使用 Spring Boot 实现简单的 Demo

下面是示例代码:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!-- spring boot3.0+ 只支持jdk17,如果使用1.8出现包冲突需要自己处理 -->
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.czl</groupId>
    <artifactId>kafka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-kafka</name>
    <description>spring boot集成kafka demo</description>
    <properties>
        <JAVA.version>1.8</java.version>
        <MyBatis-plus.version>3.5.3.1</mybatis-plus.version>
        <velocity-engine-core.version>2.3</velocity-engine-core.version>
        <lombok.version>1.18.26</lombok.version>
        <guava.version>31.1-jre</guava.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

        <dependency>
            <groupId>com.MySQL</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>scala-library</artifactId>
                    <groupId>org.scala-lang</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>scala-reflect</artifactId>
                    <groupId>org.scala-lang</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity-engine-core.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>

    <!-- 对于一些特殊的依赖指定特定版本 -->
    <!--<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.yaml</groupId>
                <artifactId>snakeyaml</artifactId>
                <version>2.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>-->

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


Application.yml
spring:
  application:
    name: spring-boot-kafka
  profiles:
    active: dev

server:
  port: 8080
 
application-dev.yml
spring:
  datasource:
    url: "jdbc:mysql://***:***/***?useSSL=false&useUnicode=true&characterEncoding=utf8&ApplicationName=spring-boot-demo&serverTimezone=UTC&allowMultiQueries=true"
    username: "***"
    password: "***"
  kafka:
    bootstrap-servers: "192.168.226.140:9092" # 访问Kafka服务端的地址
    consumer:
      group-id: ${spring.application.name}-${spring.profiles.active} # 一条消息只会被订阅了该主题的同一个分组内的一个消费者消费

mybatis-plus:
  configuration:
    # 打印sql
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATH_HOME" value="./logs/spring-boot-kafka"/>
    <property name="LOG_LEVEL" value="INFO"/>

    <!-- 日志文件布局 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}(%L) - [%X{traceId}] %msg%n</pattern>
        </encoder>
        <!-- 按时间大小归档日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH_HOME}/log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <maxFileSize>200MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!-- 控制台日志布局 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}(%L) - [%X{traceId}] %msg%n</Pattern>
        </encoder>
    </appender>

    <logger name="org.springframework.web.filter.CommonsRequestLoggingFilter" level="INFO"/>
    <logger name="org.springframework" level="INFO"/>
    <logger name="com.czl.demo" level="${LOG_LEVEL}"/>
    <root level="${LOG_LEVEL}">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
 
ProducerDemo
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.util.concurrent.ListenableFutureCallback;

/**
 * @author CaiZhuliang
 * @date 2023/6/18
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ProducerDemo {
    private final KafkaTemplate<String, String> kafkaTemplate;

    /**
     * 发送消息
     * @param topic 主题
     * @param msg 消息
     * @param callback 钩子
     */
    public void send(String topic, String msg, ListenableFutureCallback<SendResult<String, String>> callback) {
        log.info("发送Kafka消息 - topic : {}, msg : {}", topic, msg);
        ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, msg);
        if (null != callback) {
            future.addCallback(callback);
        }
    }
}
 
ConsumerDemo
package com.example.czl.kafka.kafka.producer.consumer;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

/**
 * @author CaiZhuliang
 * @date 2023/6/18
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ConsumerDemo {
    @KafkaListener(topics = "test-topic-1")
    public void receivingMsg(String msg) {
        log.info("接收到Kafka消息 - msg : {}", msg);
    }
}
 
TestController
package com.example.czl.kafka.controller;

import com.example.czl.kafka.kafka.producer.ProducerDemo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author CaiZhuliang
 * @date 2023/6/18
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/test")
public class TestController {
    private final ProducerDemo producerDemo;

    @GetMapping("/send/kafka_msg")
    public Long sendMsg(String msg) {
        log.info("测试发送kafka消息 - msg : {}", msg);
        producerDemo.send("test-topic-1", msg, null);
        return System.currentTimeMillis();
    }
}
 
postman请求测试如下:

控制台信息如下:

作者介绍

蔡柱梁,51CTO社区编辑,从事Java后端开发8年,做过传统项目广电BOSS系统,后投身互联网电商,负责过订单,TMS,中间件等。
 


Tags:Kafka   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Kafka  点击:(86)  评论:(0)  加入收藏
如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
译者 | 李睿审校 | 重楼在当今竞争激烈的市场环境中,为了生存和发展,企业必须能够实时收集、处理和响应数据。无论是检测欺诈、个性化用户体验还是监控系统,现在都需要接近即时...【详细内容】
2024-01-26  Search: Kafka  点击:(47)  评论:(0)  加入收藏
深入浅出Kafka:高可用、顺序消费及幂等性
在我们旅行于数据海洋的途中,如果把 Kafka 比作是一艘承载无数信息航行的快船,前文《Kafka实战漫谈:大数据领域的不败王者》已经讲述了如何搭建起这艘快船,让它在起风的早晨开始...【详细内容】
2023-12-18  Search: Kafka  点击:(176)  评论:(0)  加入收藏
7k Star,一款开源的 Kafka 管理平台,功能齐全、页面美观!
Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控...【详细内容】
2023-12-15  Search: Kafka  点击:(133)  评论:(0)  加入收藏
利用Apache Kafka、Flink和Druid构建实时数据架构
译者 | 陈峻审校 | 重楼如今,对于使用批处理工作流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处理到分析,整个批处理工作流往往需要大量的等待,其中包括:等...【详细内容】
2023-12-11  Search: Kafka  点击:(232)  评论:(0)  加入收藏
运维兄弟!Kafka怎么又"超时"了?
现象凌晨,当运维刚躺下,就被业务研发的电话叫醒,"哥们!kafka服务又异常了?影响到业务了,快看看",业务研发给出的异常日志如下:基本分析 集群检查:立即确认kafka集群以及涉及到topic健...【详细内容】
2023-12-07  Search: Kafka  点击:(138)  评论:(0)  加入收藏
图解Kafka适用场景,全网最全!
消息系统消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka 可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处...【详细内容】
2023-11-29  Search: Kafka  点击:(183)  评论:(0)  加入收藏
Kafka有哪些应用场景?你能说上来几个?
下面我们来总结一下Kafka的一些应用场景:1、日志处理与分析(最常用的场景)下图显示了典型的 ELK(Elastic-Logstash-Kibana)堆栈。Kafka 有效地从每个实例收集日志流。ElasticSe...【详细内容】
2023-11-28  Search: Kafka  点击:(165)  评论:(0)  加入收藏
Kafka:解锁大数据时代的搜索与分析
在当今大数据时代,数据湖作为一种新兴的数据存储和分析解决方案,正受到越来越多企业的青睐。而作为一种高性能、可扩展的事件流平台,Kafka在数据湖领域发挥着重要的作用。本文...【详细内容】
2023-11-24  Search: Kafka  点击:(287)  评论:(0)  加入收藏
解密Kafka主题的分区策略:提升实时数据处理的关键
Kafka几乎是当今时代背景下数据管道的首选,无论你是做后端开发、还是大数据开发,对它可能都不陌生。开源软件Kafka的应用越来越广泛。面对Kafka的普及和学习热潮,哪吒想分享一...【详细内容】
2023-11-21  Search: Kafka  点击:(181)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条