Algorithm
Why Rendezvous Hashing Fits Distributed Cron Better Than a Hash Ring
A production-oriented design for decentralized scheduled-task ownership with TypeScript, Effect, Redis membership, and per-tick safety.
Kubernetes
Step-by-step guide to deploying a highly available Kubernetes cluster on-prem using kubeadm. Covers CoreDNS setup, external etcd with SRV discovery, HAProxy + KeepAlived API load balancing, and Calico networking (iptables → eBPF). Includes configs, verification, and best-practice automation tips.
DevOps
This article walks through building and pushing Docker images to Google Artifact Registry using GitHub Actions and Workload Identity Federation — without storing service account keys. It explains each step, from GCP setup to secure, keyless CI/CD.
Kubernetes
Prometheus failed to scrape metrics due to missing RBAC permissions. This guide explains the symptoms, diagnosis, and fix using Role and RoleBinding, with YAML examples and logs for reference.
Kubernetes
This article explores the challenges of deploying Calico in eBPF mode for Kubernetes, focusing on issues like the need for an external load balancer, VIP certificate configurations, and circular dependencies when the control plane fails. Solutions for these challenges are also discussed.
Kubernetes
MetalLB (controller-only) with Calico BGP does not bind VIPs to any node interface, causing ARP failures. Services stay unreachable externally. Solution: locally bind VIPs, enable strictARP, and disable rp_filter to restore correct traffic flow.
Kubernetes
This article examines how to build a self-hosted Kubernetes cluster on bare-metal infrastructure, focusing on networks, high availability, DNS, and storage. It targets academic infrastructure engineers managing clusters under 50 nodes, contrasting with managed cloud solutions.
Kubernetes
Deploy MetalLB as controller-only and let Calico’s BGP advertise a LoadBalancer pool. The guide covers Helm setup, IP pool config with avoidBuggyIPs, route flow analysis, source-IP-preserving Local policy, and failover tests for production-grade bare-metal LB.
Essay
This article explores how we achieved stable API alignment across platforms by evolving from manual updates and visual tools to a declarative workflow using TypeSpec. It shares lessons on consistency, automation, and best practices in multi-platform API design.
Essay
In previous posts,[1] I mentioned that in Rust, tracing is often used alongside opentelemetry to build a local-cluster model. In this setup, tracing is responsible for generating and structuring local spans, while opentelemetry takes care of propagating context across service boundaries. However, I’ve come to realize that
Coding is my profession, my dream, and my future.
相信日志,即 Logging,对于大多数开发人员是不陌生的。 日志是一种记录应用程序运行状态的重要手段,它可以帮助我们了解应用程序的运行情况,排查问题,甚至是监控应用程序的性能。在 Web 后端应用程序中,日志是不可或缺的一部分,它可以记录用户请求、应用程序的错误、警告等信息,帮助我们更好地了解应用程序的运行情况。 但它真的不可或缺吗?读完这篇文章后我想我给你的答案是:不是。日志的形式很单一,只是文本,这注定了它很冗杂的特点,我们很难从中提取我们需要的信息。即使你使用 AI 如 ChatGPT,也并不一定可以得到一个有建设性的答案。对于自己构建的应用程序,ChatGPT 既不了解也不可能去真的全部了解你的代码,这就带来了问题。 为什么日志不是不可或缺的 日志的形式单一,以纯文本呈现,信息常常显得冗余且难以提取。即便是使用 AI 进行分析,也不一定能提供清晰的洞见。日志的主要问题在于: * 冗余性和庞大的数据量:日志往往包含大量无用信息,查找特定问题的关键信息耗时。 * 缺乏上下文关联:单条日志难以呈现多个服务之间的调用关系和上下文,尤其是在微服务架构中
作为一门全栈开发,我理应掌握多门语言。截止 2024 年 9 月,我掌握了超过 30 门编程语言,可以使用它们构建简单的应用程序、为开源社区提交代码、为公司开发产品。我们不讨论对于“掌握”的定义,让我梳理思路,详细阐述我是怎么一步步掌握如 此多的编程语言的。如果你也想学习一门新的编程语言,希望这篇文章能够帮助到你。
或许你在学习 Spring 的时候曾听过,Spring 提供的容器叫做 IoC 容器。 IoC 是 Inversion of Control 的缩写,中文翻译为控制反转。控制反转是一种设计原则,早在 2004 年 Martin Fowler 便提出依赖反转,即依赖对象的获得被反转了。 非控制反转的问题 大多数应用程序都是由两个或是更多的类或组件通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。 如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。 直接实例化与紧耦合 比如 A 组件需要调用 B,一般情况下你可能会在 A 的 constructor 或 init 块中显式建立 B 组件然后调用。 class A { private val b = new B(
近期,我使用 Next.js 与 Hexo 重构了原本基于 WordPress 的博客系统。此次重构是经过我深思熟虑的,在重构的过程中我也遇到了很多问题,我将为大家分享这次重构的过程和经验。
Golang 在 1.6 版本中引入了 PIE(Position Independent Executable)编译模式,它可以使得编译后的二进制文件在内存中的位置不固定,从而提高了二进制文件的安全性。但相传 PIE 编译模式在性能和内存占用上都有一定的损耗,本文将对 PIE 编译模式进行测试,以验证这一说法。
由于近期忙于公司事务和新系统的架构设计工作,博客的文章已经停更了数月。近几个月对我个人来说产生了很大的变化,我很难讲清其中的具体,但这大概会在后续的博客文章更新中体现。 但我认为,停更并非好事,而是应当避免的,因此我也在有片刻闲暇的今日在已经停止更新五个月的博客的第一篇文章。 序言 数学是科学的基础,而素数是数学的基石之一。尽管素数的概念简单直观——只有 1 和自身两个正因数的自然数——但它们在数学和计算科学领域却扮演着重要角色。 素数并非我们独立发现的,它们在自然界中以复杂的规律存在。通过对素数的理解和应用,我们得以解决各种问题,从密码学的加密算法,到搜索引擎的数据结构,甚至到量子计算的未来发展。因此,有效地检测一个数字是否为素数,对于编程来说是至关重要的技能。 在本篇博客文章中,我们将深入探讨素数校验在程序设计中的实现。我们将先从基础的数学理论开始,逐渐深入到各种算法的优化。同时探讨不同的素数检验算法,从最基础的试除法到更复杂高效的算法(如 Miller–Rabin primality test),来感受算法的历史与更迭。 素数的基础知识 在我们深入
这篇博客将向您介绍如何使用 GitHub CI 自动将 Docker 镜像推送到 Google Artifact Registry(GAR)的自动构建仓库。 GitHub CI 的功能使得代码推送到 GitHub 仓库时,能够自动构建 Docker 镜像并推送到 GAR。这种自动化流程有助于提高了开发效率,同时还可确保在发布新版本时代码和镜像的一致性和可靠性。 本文将为您提供详细的步骤和指南,帮助您轻松实现自动构建和推送 Docker 镜像的流程。 相关服务介绍 在本章中,我们将简要介绍 Google Artifact Registry 和 IAM 的 Service Account 授权模式的概念和特点,以便读者更好地理解如何使用它们来构建和管理 Docker 镜像。我们还将介绍 Artifact Registry 和 IAM Service Account 之间的关联,并讨论如何创建和配置
主要使用工具的介绍 在本节中,我们将介绍 Kubernetes 和 Helm 的基本概念,这些知识是理解如何在 Kubernetes 集群上部署 WordPress 的基础。 Kubernetes 简介 Kubernetes 是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。Kubernetes 提供了一个统一的 API 和工具,使得容器的部署和管理变得更加简单和可靠。它可以管理运行在多台机器上的容器,确保容器应用程序的高可用性、弹性、伸缩性和安全性。 Kubernetes 主要包括以下核心概念: * Pod:Kubernetes 中最小的可部署单元,包含一个或多个紧密关联的容器。 * Deployment:用于管理 Pod 的副本数量和更新。 * Service:用于暴露 Pod 或 Deployment 在集群内部和外部的网络地址。 * Volume:用于将持久化数据挂载到容器中。 * Namespace:用于将 Kubernetes 资源进行逻辑上的隔离和分组。 Helm
TypeScript 是 JavaScript 的超集,其最显著特征是在 JavaScript 原有的语言模式上加入了类型强制,即静态类型系统。以此保证代码中变量处于类型安全状态,即只能赋同类型的值,而对象只能访问其自身所拥有的属性、方法。 类型安全 & 型变 类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释,使开发者可以及早在编译时期就捕捉到潜藏的错误 let num: number = 1; let bool: boolean = num; // Error: Type 'number' is not assignable to type 'boolean'. 在上述情况中,number 类型与 boolean 类型是完全不同的,它们不构成继承关系,因此他们不能相互赋值。 那么,当我们需要将一个 `number` 存储的数字转换为
Source Global CDN 的海外中转链路往往需要对多个域名进行反向代理,之前的方案是给每个域名单独创建 vhost。但在链路增长、服务器增多的现实情况下,这一方案变得越来越难以维护。 我作为 Source Global CDN 的主要运维人员,自然而然地承担起了此任务。 问题 随着服务使用服务器增多,链路增长,我们面临以下问题: 1. 在配置出现更变时,需要为所有服务器进行内容修改,费时费力。 2. 如有服务新增,需要在所有服务器中进行多个操作,且需进行相关测试。 3. SSL 证书、vhost 的 conf 文件管理混乱。 在经过深思熟虑后,我们大致想出以下解决方案: 1. 使用泛域名解析,提高内聚性,使得所有服务器可以自动配合增删改的操作,无需单独配置。 2. 使用私有DNS服务,在一个平台管理链路,无需在服务器中进行修改。 高内聚的泛域名解析方案使得vhost文件数目和SSL数目大幅减小,私有DNS避免服务器内数据不修改的问题。 实施 泛域名解析 经过考虑,
在当前互联网架构圈子,容器化、微服务,是被主要讨论的话题。 显然,对于互联网的发展趋势来看,项目正在变得愈加庞大。单一的巨大的项目是不利于维护和开发的,开发者的电脑几乎难以直接承载阿里云、Azure这种巨大的项目,那我们就需要对其进行解耦。也就是说,应用的组件化、容器化、微服务化必将成为趋势。 在容器化应用程序开发这一点,我在之前的开发历程中有些许心得,在本文我将对其具体阐述。 先前的语言选用 在开始学习 Golang 之前,我曾尝试过很多语言。 就如我的个人简介所写的一样,较为经典的PHP、Java,较为复杂的CPP,较为有趣的Express.js、Koa.js、Next.js,我都曾使用过。即使是现在,你也可以在我的GitHub账号找到许多之前的练习品,如 AH-dark/bing-image-api。但这些语言或多或少都有一些不足之处,因而被我放弃。 Java Spring 全家桶在中国大陆被广泛地使用,特别是阿里巴巴,几乎可以算是 Spring
在近期,我逐步将近乎所有的服务所使用的邮件服务都更换为 Mailgun,本文我将讲述我作出这一决定的原因和具体做法。 在确定使用 Mailgun 以前,我曾对SMTP邮件推送这一部分有过多种尝试。 曾用品 阿里/腾讯 企业邮箱(国内) 在我仍在职圆云的时候,我们依靠阿里云的企业邮箱进行企业事务处理。 企业邮箱同时兼具收发功能,具有较好的稳定性,但价格较高。对于个人服务来说,买五个账号起步,每年600元的企业邮箱,似乎毫无必要。 而腾讯企业邮箱等服务依赖企业微信,过于冗杂,对于个人来说过于麻烦,而且 Exchange 协议支持的不完善。 因此,我放弃这一想法。 阿里/腾讯 邮件推送 * 阿里云邮件推送:https://www.aliyun.com/product/directmail 我曾在圆云时期使用阿里云的邮件推送进行邮件通知。其好处在于,稳定性较高,且支持多域名多用户等情况。 但其只提供了邮件发送服务,完全不对邮件接收做支持,甚至不支持转发,因此在使用一段时间后我放弃了这一方案。 ahdark.com