【W01/2025】Palmx:一个次世代的 RPC 框架
基于 Netty 实现的一个的 RPC 框架,使用 Zookeeper 作为服务注册中心,手动实现了几个简单的负载均衡算,然后封装了多种序列算法,与 Spring Framework 集成,实现了基于注解驱动的服务自动注册和一键式启动服务器的功能。
基于 Netty 实现的一个的 RPC 框架,使用 Zookeeper 作为服务注册中心,手动实现了几个简单的负载均衡算,然后封装了多种序列算法,与 Spring Framework 集成,实现了基于注解驱动的服务自动注册和一键式启动服务器的功能。
⾃ 2012 年 Google 前瞻性地提出 QUIC 传输协议,历经⼗年迭代,HTTP/3 作为 HTTP/2 的继任者,在 2022 年 IETF 正式标准化 HTTP/3 为 RFC9114。HTTP/3 凭借其对 QUIC 协议的深度整合以及从 TCP 向 UDP 的底层连接转型,迅速赢得了业界的⼴泛接纳。截⽌到2022年11⽉,全球已有超过四分之⼀的⽹站部署了 HTTP/3 技术,如下图。⼀个崭新的⾼速、⾼效⽹络时代正逐步拉开帷幕。
从 2019 年 Linux 在 5.1 版本发布 io_uring 开始,许多框架都使用了这一项技术,比如 netpoll、rocksdb、ceph、spdk,但是这项技术并没有在 Java 生态中大规模使用,幸运的是,在 Netty 社区,目前正在孵化使用 io_uring 的项目 —— netty-incubator-transport-io_uring,里面提供了新的读写模型 IOUringEventLoop,基于这项技术实现了 io_uring。
在分布式系统中,如何合理分配请求、保障服务的高可用性与稳定性,是每一位架构师必须面对的挑战。负载均衡(Loadbalance)与流量控制(FlowControl)正是解决这一问题的两大利器。
负载均衡侧重于资源分配,通过动态调度请求,使多台服务器负载趋于均衡,从而提升系统吞吐量和容错能力;而流量控制则更加关注请求限制,防止单一服务因高并发或恶意流量而过载,确保系统整体的可持续运行。
前文说到,自适应负载均衡与流控,将 CPU 负载、RT、上线时间通过一个公式来计算一个权重值或阈值,但是这个公式通用型可能不够,服务节点的性能存在差异,因为在不同的机器有不同的硬件资源,比如有些机器是 I/ O 特别强,有比较高的的 IOPS,有些机器有更高的 CPU 频率,CPU处理性能比较高,所以通过一个算法去计算最大并发量,通用性比较低,计算出来的最大并发量可能不够准确,并且这几个的指标并不能完全体现真实的服务节点负载,那么还有那些指标可以更加科学得体现节点负载呢?
在许多编程语言中,如 Go 和 Python,协程是作为高效并发的解决方案,通过用户级调度来实现轻量级的并发。Go 通过 goroutine 提供了类似的高并发能力,Python 则通过 async/await 实现了协程的控制流,Java 的虚拟线程借鉴了这些语言的思路,使用用户级调度来取代操作系统调度,从而降低了线程创建和切换的成本。
数据一致性问题其重要性不言而喻。从操作系统层面的锁机制,到 Java 并发编程中的多线程同步,再到分布式系统中的事务管理和一致性协议,确保数据在各种环境下的一致性是保障系统可靠运行、维护数据准确性。本文将揭示数据一致性在计算机领域的多面性和关键价值,助力理解和应对实际场景中的数据一致性挑战。
《Designing Data-Intensive Applications》(DDIA)是一本由 Martin Kleppmann 编写的书,主要关注如何设计和构建现代数据密集型应用。书中详细探讨了构建高性能、高可用和可扩展的分布式系统的核心理念和技术。接下来对书中的一些关键概念进行整理,方便后续查阅。
本文转载自《现代操作系统 原理与实战》的扩展章节第14章网络协议栈与系统,如有侵权,请邮件至2117008741@qq.com 删除。
GC 日志是 JVM 在执行垃圾回收时生成的日志,它记录了垃圾回收的详细信息,包括回收的类型、时间、回收的区域、GC 期间暂停的时间(即 STW 时间)、各个代的内存使用情况等。通过分析 GC 日志,开发人员可以诊断和优化应用程序的内存管理,了解 GC 对系统性能的影响,找出可能的性能瓶颈。
在学习网络编程时,我们通常会关注内核网络协议栈的相关知识。然而,回到 OSI 七层模型的角度,数据链路层究竟是如何运作的呢?网线中的电信号是如何转化为网络数据帧和数据包的?本文将对此进行简要探讨。
Spring 是面试中的重要部分,其中有几个关键问题在面试中出现的频率特别高,比如 Spring Bean 的生成流程,SpringBoot 的启动流程,Spring 循环依赖,笔者对于这些知识点总是记了忘,忘了记,所以对这些知识点做一个汇总。
cURL 是一个利用 URL 语法在命令行下工作的文件传输工具,1997 年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。
对于开发者来说,环境变量是在设置语言的开发环境时,需要配置的一个目录,才可以使用这个语言的库,运行这个语言这个语言的代码,那么为什么设置玩环境变量之后,为什么就可以使用 java -jar、go run 这样的命令了呢?这篇文章,会给你答案。
synchronized 是 Java 中的一种关键字,用于实现同步,保证在多线程环境下,只有一个线程可以访问代码块或方法,确保线程安全。