9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

基于 Apache Kafka 的 Serverless 架构演进

  • 2023-08-17
    北京
  • 本文字数:6750 字

    阅读完需:约 22 分钟

基于Apache Kafka的Serverless架构演进

背景


随着大数据、互联网技术的发展,数据量爆发式增长。Apache Kafka通过架构创新和生态完善,具备高吞吐、低延迟和横向扩展能力,完美匹配了大数据的各种需求,成为消息、事件流领域的事实标准。

 

随着云计算的普及,近几年云原生成为最热门的技术趋势。云原生意味着云计算原生,面向云计算的特点来重新设计软件,释放云计算的红利。对于业务应用而言,云原生意味着摒弃传统的运维开发框架,通过微服务、容器化、DevOps 和持续交付,实现应用敏捷开发、弹性伸缩、自动化部署。对于基础软件而言,则是充分和云计算的基础设施层结合,重新设计,进一步提升关键技术指标。如这几年讨论得比较多的存算分离技术,存储计算一体的架构逐渐被云原生存储(存储托管化)+ 存储计算分离的云原生架构取代。在存算分离架构中,状态存储不再依赖于本地磁盘,摆脱了本地存储规格的限制,这使得计算资源与存储资源可以灵活配比,支持快速的扩缩容。同时状态下移到存储层,降低了基础软件的运维复杂度,提升运维效率。


云原生发展到今天,已经全面往 Serverless 的方向演进。因此我们希望能基于最新的云计算技术,对 Apache Kafka 存储引擎进行深度重构,使其能够实现真正的弹性 Serverless 架构形态。在云原生 Serverless 架构的基础上建设 Kafka 云服务,为客户提供按需弹性、按量计费的 Serverless 产品体验,把降本增效红利真正释放到客户侧。

设计

目标

 

Kafka 等消息队列是典型的存算不分离架构,基于本地文件系统和本地盘自建,这种架构主要有以下几个问题:

 

  1. 单盘热点吞吐能力和容量受限;

  2. 存算比例绑定,不能灵活调整适配,容易导致资源利用率低;

  3. 节点有状态,导致扩缩容涉及数据迁移,但迁移速度受到原始节点负载、数据量和磁盘吞吐等因素影响,一般 TB 级数据需要小时级迁移时长。因此整体风险高,运维压力大。

 

Kafka 社区的二级存储是典型的共享冷数据架构。由于对象存储无法匹配本地盘的低延时和高吞吐,仍然需要本地盘存储热数据和 S3、OSS 等对象存储来存储冷数据。这种架构主要有以下几个问题:

 

  1. 本地存储不能保证数据可靠,仍然需要多副本协议保证本地热数据不丢不错,而各计算节点之间同步副本会消耗网络带宽资源;

  2. 需要实现本地存储文件和二级存储文件逻辑映射机制,增加系统复杂度。

 

我们期望架构可以共享所有数据,且实现计算无状态化、计算容器化和存储托管化,从而充分发挥弹性和调度优势。故我们需要高性能分布式存储系统,提供对标本地盘的低延迟和高吞吐能力,同时支持冷热分层以提高存储性价比。

 

盘古是阿里云自研的高性能分布式文件系统,解决了超大规模下数据不丢不错和高可用的难题,兼顾更加稳定可靠的存储能力、更大的容量和更高的性能等优点,广泛部署在全球数十个大型数据中心,服务阿里云上数百万的客户,覆盖互联网、政企、金融、制造等全行业。盘古是阿里云关键的创新技术之一,满足数字经济对海量存储、快速存储和稳定存储的需求,并入选世界互联网领先科技成果。阿里云盘古 DFS 是构建在阿里云盘古分布式文件系统之上的存储产品,会在云上提供大数据文件存储服务,满足云上客户的高性能存储需求。

 

Kafka 是面向日志或流的架构,且本身也是 Append Only 语义,这些特点和盘古模型非常贴合。基于调研和性能验证,最终我们选择基于阿里云的盘古 DFS 分布式文件存储产品实现 Kafka 云原生化,通过把 Kafka 的存储全卸载到云原生存储,将实现公共云基础设施级的资源并池,也就是存储池化,我们将具备无限存储空间,同时也解决社区版 Kafka 饱受诟病的数据倾斜问题。横向对比业界某些消息系统的存算分离架构,其存储并非是使用池化的云存储资源,依然要自己运维分布式存储系统,自己预先承担存储成本,因此其不是真正的按量付费。

图 1 Serverless Kafka 架构图

 

数据高可靠

 

盘古 DFS 使用多副本以及 EC 等策略来保证数据极高的可靠性,不要求磁盘本身高可用,因此完全可以采用廉价的磁盘来实现数据的安全存储。将数据打散到不同的 rack 上,当某一台廉价的服务器发生故障时,仍然能够快速地恢复出数据的副本以保证数据安全,这种可靠性保证为有把握对上层承诺数据不丢失提供了稳固的基石,使得 Kafka 更加可靠,数据更加安全。盘古 DFS 支持跨数据中心的容灾策略,百微秒级平均延迟、毫秒级长尾延迟以及单存储节点打满 200Gbps 网络的 IOPS 处理能力,同时数据可靠性达到 12 个 9,可用性高达 5 个 9。

 

服务高可用

 

开源 Kafka 基于 ISR 机制实现服务高可用,ISR(in-sync replica)为某个分区维护的一组同步集合,处于 ISR 集合中的副本意味着 follower 副本与 leader 副本保持同步状态,只有处于 ISR 集合中的副本才有资格被选举为 leader。一条 Kafka 消息,只有被 ISR 中的副本都接收到,才被视为“已同步”状态,节点故障或者网络断连等会触发 ISR 选举,选出新 leader 并对外提供服务。ISR 机制复杂度高,问题调查难度大。存算分离后各计算节点无状态且共享存储,再配合我们设计的一套轻量级的故障切换机制,大大降低系统复杂度的同时还提升了可运维性。


图 2 示例 可用区-C 宕机不影响可用性

 

降低成本

 

计算成本。由于数据直接写入高可靠的盘古 DFS,计算层无流量复制,极大的降低了计算节点的 CPU 和网络带宽消耗,相同成本下拥有更高吞吐上限。Kafka 也在适配倚天 ARM 架构,通过软硬件协同进行全栈的深度优化,释放巨大技术红利,降低计算成本。

 

存储成本。依赖盘古 DFS 实现高可靠的数据存储,盘古 DFS 通过纠删码、冷热分层、基于 CIPU 软硬件协同优化等技术实现存储成本的降低,这种技术红利也会持续降低 Kafka 的存储成本。针对“把 Kafka 作为长期存储”的场景,可以极大的降低存储成本。

降低延迟

 

网络延迟。我们可能会质疑分布式文件系统性能不及本地文件系统,在上一代分布式文件系统中,这是一个比较明显的问题,但是随着用户态协议栈、高性能 RDMA 网络、NVMe SSD 和新型软硬融合存储技术的持续发展,分布式文件存储进入微秒延迟时代。

 

计算延迟。针对平均延迟,计算层无复制流量可以充分降低网络吞吐以避免拥塞。针对长尾延迟,开源 Redpanda 用 c++重写 kafka 避免 gc 延迟,它带来的挑战是如何做到 100%兼容开源 Kafka 并能保持很高的迭代效率。我们使用主流编程语言领域最顶尖的内存管理技术,即新一代分代无暂停 GC(generational pauseless GC),仅设置堆大小和并发线程数就使得 GC 停顿时间小于 2ms,大大降低了系统长尾延时。

 

存储延迟。通过 2-3 异步写、Backup 读、精细 QoS 控制和慢盘规避等技术保障了性能的稳定性,极大减少了性能的抖动,为客户提供了高质量可预期的平滑服务保障。

弹性伸缩

 

阿里云容器服务通过硬件结构体系、操作系统、分布式调度配合,实现了面向 SLO 的资源精细化管理和弹性调度:VPA,弹性,超卖等调度技术,提升了资源弹性能力和资源的利用率。节点资源自动弹性结合调度能力提供了丰富的资源弹性能力:块资源弹性,resource limit 阈值弹性,定时弹性等。通过调度和节点弹性技术大幅度提升了容器部署密度和部署效率。


图 3 弹性扩容 Broker-4

支持 RDMA 网络访问加速

 

传统的 TCP/IP 一直是业界主流的网络通信协议,众多应用都是基于 TCP/IP 构建的,但随着数据中心相关的业务蓬勃发展,应用对于网络的性能需求(如高并发、低延迟、高吞吐)越来越高。在 Kafka 中网络传输是一个关键的性能瓶颈,传统的 TCP/IP 协议会对网络传输带来一定的开销和延迟,尤其是在高并发、低延迟、高吞吐的数据传输场景下,TCP 协议的开销和延迟会更加明显。

 

从图 4 上半部分可以看出在传统 TCP/IP 网络协议栈的通信过程中,存在若干次的数据拷贝过程,甚至在部分场景下,数据拷贝的 CPU 开销占比可达 50%以上。而且对于一次通信的过程,发送端和接收端均需要经历上述的数据拷贝过程。随着云计算时代对数据中心算力的需求逐渐提高,TCP/IP 协议栈逐渐遇到瓶颈,不再能够满足数据中心对于网络的性能需求。


图 4 传统 TCP/IP 协议栈与 RDMA 协议栈

 

 为了解决 TCP/IP 遇到的性能问题,一种高性能网络通信技术——RDMA(Remote Direct Memory Access)逐渐成为云计算时代的秘密武器,并逐渐在数据中心的业务中被广泛应用。简单来说,RDMA 是一种基于硬件加速的网络传输技术,可以实现无 CPU 参与的数据传输,从而提高传输效率和性能。从图 4 下半部分可以看出 RDMA 技术通过在网络适配器和内存之间建立直接的数据传输通道,绕过了操作系统内核和 CPU 的介入,直接在内存中进行数据传输。另外 RDMA 在远端节点 CPU 不参与通信的情况下对内存进行读写,以实现 CPU 卸载,再配合零拷贝技术,使得 RDMA 具有低延迟、高吞吐和低 CPU 开销的特点。

 

我们希望借助 RDMA 打造云产品差异化竞争力同时具备可扩展性。最终需要解决以下问题:实现真正的零拷贝通信,避免中间缓冲;RDMA 和 TCP 数据路径在 Kafka 中共存而不妨碍其可用性和性能;共享内存避免直接分配大块内存;使用 RDMA FAA 加速偏移请求的提交。

实现

整体架构

图 5 Serverless Kafka 整体大图

核心存储

 

图 6 单机存储

 

Apache Kafka 生产者发送的消息首先写入 PageCache,操作系统异步持久化到存储介质,通过在 broker 层面实现副本机制保证数据可靠性。云原生 Kafka 采用盘古 DFS 作为存储底座,消息数据(CheckPoint 和 index 文件依然写入分布式文件系统)写入盘古 DFS 便可保证可靠性。然而也面临新挑战:盘古 DFS 与本地文件系统有本质区别,无法直接利用操作系统的 PageCache 机制,如果数据直接写穿盘古 DFS,可能导致写延迟增加和吞吐量下降。

 

为解决这一问题,我们基于堆外内存实现了用户态 HotCache。生产者发送的消息首先写入 HotCache,持久化到盘古 DFS 便可保证数据可靠性,然后响应生产者发送成功。针对数据持久化到盘古 DFS 的过程,我们进行了以下优化:首先在 HotCache 中批量聚合数据,然后用时间、空间和频率等多种策略触发持久化至盘古 DFS,减少网络抖动毛刺同时更快地推进 HighWaterMarker,使消费者及时读取消息,降低端到端延迟;针对大 IO 的业务场景,我们采用了 I/O 切片处理方式,支持更大并发操作同时提升吞吐上限。

 

Apache Kafka 在 Catch-up Reads 或 Streaming 场景下可能出现大量冷读,这些数据往往不在 PageCache 中,需要从磁盘读取并加载到 PageCache,当冷读较多时 PageCache 竞争激烈,频繁的换入换出导致缓存污染,严重影响写入性能。此外,Apache Kafka 处理生产和消费请求的同一线程池可能会受到冷读阻塞的影响,导致所有请求无法及时处理出现故障。因此,冷读会严重影响数据的写入和 Tailing Reads。为缓解此问题,我们通过自研"冷热数据隔离"的堆外缓存、冷热线程(协程)分离和预加载等策略进行优化。

高可用 


图 7 Serverless Kafka 高可用

 

存算分离架构下,计算层不再需要 ISR 这样重量级的副本复制协议,因此我们设计了一种更加轻量的 HA 方案优化了元数据管理机制、降低了系统复杂度。Follower Replica 仅作为计算资源的热备存在,只保有少量必要的元数据,并仅需要处理少量的元数据变化请求,进一步提高计算层的处理效率。这种架构下,新节点能够快速接管数据并提供服务,为弹性的极致体验打下了基础。


我们基于存算分离实现的 HA 的新方案,相比于开源拥有如下优势:

 

  1. 使用分布式锁解决了主从切换可能带来的双写问题(阻止旧进程对已打开文件继续写入;阻止旧进程新建文件,打开新文件继续写入)确保了 HA 过程的正确性,同时经过一系列的细节设计保证了 HA 过程的高效率;

  2. 更加轻量化和安全的设计,开源的 ISR 方案是一种较为重量级的副本复制协议,给运维和安全都带来了挑战。在 HA 新方案下,我们优化了元数据管理的层次和复杂度,设计了 HA 事件标记机制,提供高安全性的同时,极大降低了运维的成本;

  3. 面向极致弹性的设计,开源的 ISR 方案在节点扩容时通过 Reassignment 进行数据和流量的再平衡,这个过程需要等待新副本追赶上 leader 的数据才能提供服务,往往需要相当长的时间。在 HA 新模型下,我们的计算与数据是解耦的,扩容时新副本可以秒级接管数据并提供服务,为用户带来了更加极致,安全的弹性体验。

 

性能

 

我们使用OpenMessaging Benchmark Framework 对阿里云云原生 Kafka 和 Apache Kafka 3.3 进行对比。我们首先对比了在一定的延迟下,达到同样吞吐两者所需的成本;随后对比了聚批发送与碎片化发送下各自的吞吐延迟。

成本对比


在一定的、可接受的延迟下达到同样的吞吐,对比云原生 Kafka 和 Apache Kafka 各自需要的资源与成本。测试采用单 Topic 100 分区进行测试,发送消息体大小为 1K,BatchSize 为 1M,acks 为 -1,linger.ms 为 1ms,吞吐为 1GB/s。开源用户自建常选择本地 SSD 机型搭建三节点以上集群,保证服务可用性和数据可靠性。考虑搭建吞吐达到 1GB/s 的集群,且本地 SSD 机型的 CPU、内存、带宽、存储容量为固定比例,我们选择阿里云本地 SSD 机型(8C 64G,基础带宽 6 Gbit/s,突发带宽为 15Gbit/s;本地 SSD 1788GB,读写宽带分别为 3GB/s 和 1.5GB/s)机型为例,计算用户自建三节点成本。尽量达到同样的 1GB/s,并且 TP999 延迟控制在 50ms 左右的场景下,两者的成本对比如下:


 

吞吐

TP999 发送延迟

核心数

单台CPU利用率

Apache Kafka

1GB/s

56ms

3 x 8C

184%

云原生Kafka

1GB/s

45ms

3 x 3C

76%


自建三节点 Apache Kafka 之间存在大量数据复制,ECS 带宽很容易达到瓶颈,在吞吐 1G/s 时,Apache Kafka 的 TP999 发送延迟开始快速恶化到 56ms,而云原生 Kafka 的 TP999 发送延迟仅有 45ms。同时云原生 Kafka 所使用的计算资源更少,只需 3 x 3C 的计算资源。成本上,Apache Kafka 所使用的三台 8C 64G,提供了 1GB/s 的吞吐和 1788G 的存储能力。而云原生 Kafka 所使用的集群为存储计算分离架构,我们将计算存储分开计算。云原生 Kafka 使用 3 x 3C 的计算资源和按量付费的盘古 DFS 存储资源,提供同样的 1GB/s 的吞吐和 1788G 的存储能力,相比自建 Apache Kafka 综合成本降低 75%。

吞吐延迟对比

 

我们限制计算资源为单台机器 4C16G,并搭建三节点集群对比云原生 Kafka 和 Apache Kafka 的吞吐、发送延迟(包括了消息到达 Broker 的时间、Commit 成功时间、Broker 返回生产确认到生产者的时间)和端到端延迟(包括了消息到达 Broker 的时间、Commit 成功时间、消息到达消费者的时间。消息在 Broker Commit 后,会优先 wakeUp 消费者线程。当数据包较小时,消息到达消费者的时间会比 Broker 返回生产确认到生产者的时间短,因此当流量较小时,会存在端到端延比发送延迟低的情况)。对比聚批发送与碎片化发送两种场景下的吞吐和延迟,两种场景下的生产者负载参数分别如下表:  


 

聚批发送

碎片化发送

消息大小

1024B

200B

batch size

1MB

16KB

lingms

1ms

0ms

Acks

-1

-1


聚批发送一般能够达到较高的吞吐,我们不断增加流量,对比不同吞吐下两者的 TP999 发送延迟与 TP999 端到端延迟。结果如下:


吞吐(MB/s)

50

100

200

300

500

1000

Apache Kafka(ms)

14.0

11.9

14.0

16.1

25.3

103.1

云原生 Kafka(ms)

9.6

8.2

12.5

19.1

19.4

36.9


图 8 攒批发送,不同吞吐下 TP999 发送延迟对比

 

吞吐(MB/s)

50

100

200

300

500

1000

Apache Kafka(ms)

14.8

13.4

16.6

28.1

145.0

180.0

云原生 Kafka(ms)

8.6

5.6

16.9

34.2

46.1

103.5


图 9 攒批发送,不同吞吐下 TP999 端到端延迟对比

 

从结果中可以看出,云原生 Kafka 在 TP999 的延迟表现整体要优与 Apache Kafka,并且随着吞吐的变大,这种优势越发明显。在吞吐达到 1000MB/s 时,Apache Kafka TP999 发送延迟达到了 103.1ms,TP999 端到端延迟达到了 180ms。而云原生 Kafka 在同样的吞吐下,相应的延迟分别只有 36.9ms 和 103.5ms。

 

碎片化发送也是 Kafka 常见的工作负载之一,和攒批发送一样,我们同样对比了不同吞吐对延迟的影响,同时我们还比较了 CPU 资源的消耗。对比结果如下:


吞吐(MB/s)

50

100

150

200

Apache Kafka(ms)

15.6

17.9

19.1

163.9

云原生 Kafka(ms)

15.1

13.1

12.0

12.6


图 10 碎片化发送,不同吞吐下 TP999 发送延迟对比

 

吞吐(MB/s)

50

100

150

200

Apache Kafka(ms)

16.2

18.0

19.6

179.9

云原生 Kafka(ms)

11.6

12.5

12.0

12.8


图 11 碎片化发送,不同吞吐下 TP999 端到端延迟对比

 

吞吐(MB/s)

50

100

150

200

Apache Kafka

260%

270%

280%

270%

云原生 Kafka

77%

85%

100%

115%


图 12 碎片化发送,不同吞吐下单节点平均 CPU 负载

 

从图中可以发现,在碎片化发送场景下,云原生 Kafka 同样整体优于 Apache Kafka。并且随着吞吐的增加,云原生 Kafka 的 TP999 发送延迟和 TP999 端到端延迟的优势越大。在吞吐达到 200M/s 时,Apache Kafka 的 TP999 延迟达到了 163.9ms,TP999 端到端延迟达到了 179.9ms,服务质量严重下降,因此我们停止继续增加流量。但此时的云原生 Kafka 的相应延迟只有 12.6ms 和 12.8ms,在可接受延迟下还远没有达到自身的吞吐上限。同时,我们对比 CPU 资源的消耗,云原生 Kafka 的平均单节点的 CPU 负载都远小于 Apache Kafka。

总结

 

可以看到,深度结合云原生技术的 Kafka Serverless 架构,在成本、延迟,弹性等多项核心技术指标上面都超越了社区版的 Kafka。未来我们将持续打磨稳定性,补齐产品功能和提升体验,核心技术指标也会持续优化,如以下几个方向:

 

吞吐:

  • 操作系统参数调优。大页内存、64k memory page;

  • 适配 JDK21 的 Loom 虚拟线程。减少上下文切换,提高并发处理能力;

  • 探索一写多读,增加 RO 节点支撑更多的读流量。

 

延迟:

  • 适配 RDMA 网络、TCP BBR 拥塞控制算法等降低端到端延迟;

  • JDK21 的 generational pauseless GC 优化长尾延迟;

  • 基于本地盘的就近访问加速和故障场景快速恢复。

 

成本:

  • 持续的软硬协同优化,适配倚天 ARM 架构,性价比全面超越 x86 实例;

  • 适配新型存储介质,减少读写放大、增加磁盘寿命;

  • 根据数据冷热度进行自动分层管理和存储。

 

作者简介:


林清山,阿里云消息产品线负责人

张美平,阿里云 Kafka 负责人


参考链接:

https://mp.weixin.qq.com/s/I0hHMOH5-nlfRCBNblg62Q

https://mp.weixin.qq.com/s/XWP_6o24o3vNWsd0ILEwEg

https://openmessaging.cloud/docs/benchmarks/

 

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2023-08-17 10:535447

评论 5 条评论

发布
用户头像
感觉是非常新颖的解决方案,期望能够多看到一些相关的文章,了解更多的技术细节,让我们能够尽快使用到。
2023-08-22 15:56 · 浙江
回复
用户头像
就这么简单粗暴的鼓吹降本75%了?搞得云存储不要钱似的?
2023-08-21 14:52 · 广东
回复
用户头像
完全云原生化的 kafka,看到了很多有趣想法和技术的落地,十分期待。
2023-08-18 19:29 · 北京
回复
用户头像
看上去非常优秀完整的方案,解决了传统kafka很多弊端,期待能在阿里云用到
2023-08-18 17:51 · 浙江
回复
用户头像
基本上等同于重写了一个云原生版的消息队列,紧着kafka来参考无非是看中了kafka当前巨大的用户。
2023-08-18 15:59 · 浙江
回复
没有更多了
发现更多内容

阿里云函数计算 FC 助力高德 RTA 广告投放系统架构升级

阿里巴巴云原生

阿里云 云原生 函数计算

MSE 诊断利器上线

阿里巴巴云原生

阿里云 云原生 微服务引擎

适合在公司内网部署的项目管理软件有哪些?

PingCode

项目管理 项目管理软件

阿里云与 Kubecost 合作,容器服务 ACK 支持使用 Kubecost 进行成本管理

阿里巴巴云原生

阿里云 云原生 容器服务

读者1群辛辣反馈,关于《中国式SaaS有没有希望(能赚钱吗)?|内行深度PK ​》

B Impact

尚硅谷禹神版前端入门教程发布

小谷哥

模块一作业

只因

架构训练营

阿里云 ACK@Edge 助力元戎启行加速进入自动驾驶规模化生产

阿里巴巴云原生

阿里云 云原生容器 云原生r

流量控制--MQTT 5.0新特性

EMQ映云科技

物联网 IoT mqtt 流量控制 企业号 3 月 PK 榜

3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案

3DCAT实时渲染

实时云渲染 实时渲染云 3D实时云渲染

当TO B客户说“没有预算”时,怎么卖SaaS|SaaStr观点

B Impact

TCL 拥抱云原生,实现 IT 成本治理优化

阿里巴巴云原生

阿里云 云原生 IT IT治理

稳中求进的转折之年,企业如何重启“增长飞轮”?

脑极体

京东

轻量级、简化、QDSAA—特斯拉 IT风格曝光160p Investor Day完整PPT

B Impact

架构实战营模块三作业

null

ListView的数据更新问题

向阳逐梦

ListView 数据更新 demo源码

好工作怎么选?五个核心的考量

小谷哥

Vue 项目如何迁移小程序

FinClip

尚硅谷Java课程进化升级

小谷哥

OpenYurt 在龙源 CNStack 云边协同项目的应用

阿里巴巴云原生

阿里云 开源 云原生 openyurt

使用NineData构建任意时间点(PITR)数据恢复能力

NineData

开发者 数据恢复 dba 数据备份 全量同步

字节跳动新一代云固件Cloud Firmware 2.0来啦

字节跳动技术范儿

云计算 Linux OCP

软件测试/测试开发 | 跨平台API对接(Java)

测试人

软件测试 自动化测试 测试发开

Android通用缓存存储设计实践

杨充

支付宝小程序迁移至 FinClip

FinClip

二本毕业,靠学姐帮助混进大厂,女朋友却离我而去

程序员晚枫

程序员 女朋友 大厂 校招

尚硅谷Redis7实战教程发布

小谷哥

写作一年之后开始反思博客应该写什么

宇宙之一粟

个人成长 写作 博客

尚硅谷SSM项目视频发布

小谷哥

基于声网 Flutter SDK 实现多人视频通话

声网

flutter RTC RTE 视频通话

【MapStruct】引入MapStruct之后,项目启动java:找不到符号

No8g攻城狮

springboot 异常处理

  • 扫码添加小助手
    领取最新资料包
基于Apache Kafka的Serverless架构演进_Serverless_林清山_InfoQ精选文章