惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
Recent Commits to openclaw:main
Recent Commits to openclaw:main
WordPress大学
WordPress大学
Webroot Blog
Webroot Blog
Jina AI
Jina AI
H
Hacker News: Front Page
Attack and Defense Labs
Attack and Defense Labs
T
Troy Hunt's Blog
TaoSecurity Blog
TaoSecurity Blog
AI
AI
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Help Net Security
Help Net Security
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 叶小钗
P
Privacy International News Feed
A
Arctic Wolf
IT之家
IT之家
云风的 BLOG
云风的 BLOG
S
Security Affairs
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
博客园 - 司徒正美
Vercel News
Vercel News
C
Cyber Attacks, Cyber Crime and Cyber Security
SecWiki News
SecWiki News
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
S
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
PCI Perspectives
PCI Perspectives
F
Fortinet All Blogs
T
Tenable Blog
Spread Privacy
Spread Privacy
T
The Blog of Author Tim Ferriss
S
Securelist
L
LangChain Blog
Latest news
Latest news
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念
如何设计一个无状态应用
2023-02-16 · via 蛮荆

如何设计一个无状态应用

2023-02-16 Cloud Native Stateless

概述

无状态应用 (服务) 是一种微服务架构设计原则,通过将服务的业务逻辑与状态数据进行分离来提高应用本身的扩展性,保证应用以更可靠的方式运行,同时降低了业务功能实现复杂度。

状态隔离

保持服务内部逻辑简单 (例如只做计算并返回结果数据),将服务中和状态相关的数据保存到服务的实例之外 (例如用户购物车),这样每个服务实例都可以处理所有的请求。

不可变对象

使用不可变的数据结构来表达语义,确保请求中的相关数据不会发生变化且全局唯一。

常见的不可变对象:

  • RequestId: 请求 ID
  • EventId: 事件 ID
  • TransactionId: 订单 ID
  • LogId: 日志 ID
  • TraceId: 链路 ID

RequestId 示例

Auth

使用基于令牌 Token 的身份验证机制 (例如 JWT),这样每个服务都可以验证用户的单个请求,不需要维护用户相关状态信息。

图片来源: https://www.xenonstack.com/insights/stateful-and-stateless-applications

水平伸缩

将应用设计为可以水平伸缩,每个实例可以独立运行并接收处理请求,并且各实例之间没有依赖的共享资源或全局会话 (例如传统的 Session 机制)。 对于缓存数据,可以有专用的集群供单个服务组中所有实例使用,对于缓存中的热点数据,每个实例可以单独在本地存储一份。

幂等

确保服务 API 操作是幂等的,这样调用方因为网络问题请求失败时,可以直接重新发起请求。

常见的保证幂等性的方法:

  • 唯一的 RequestId (请求 ID): 每个请求都应该有一个唯一的请求 ID, 在发起重复请求的时候,服务方可以根据该标志符确认操作是否已经完成
  • 操作事务性执行: 将多个操作组合成事务,如果其中的某个操作在事务中执行失败,可以使用回滚机制
  • 乐观锁并发控制: 调用方请求更新资源时必须提供类似 “版本号机制” 中的版本号字段,服务方只有在版本号匹配时才会执行操作
  • 操作日志: 将已经处理的请求和操作写入日志,重复请求时可以查找以避免重复处理

业务组件与代码分离

将服务的基础组件 (例如日志、监控、链路追踪) 与服务实例进行分离,例如使用 Prometheus 监控整个集群中的所有服务。

图片来源: https://prometheus.io/blog/2021/11/16/agent/

基于消息的通信

使用消息队列作为服务间的事件通知方式,解耦服务间的耦合并使服务间通信变为异步方式。

配置和代码分离

将服务的代码和配置进行分离,这样可以分别进行管理,服务内部可以定时拉取配置实现热更新,配置数据修改后不需要重新部署服务。 常见的实现方案为建立专用的服务配置中心 (如 etcd),或者使用 Kubernetes 中的 ConfigMap 实现热更新

静态资源分离

将服务中所有静态资源直接通过 CDN 进行分发。

Kubernetes 中的无状态

Kubernetes 推崇尽可能将服务应该尽可能设计为无状态,因为:

  • 容器重启后数据会丢失
  • 调度会引发 Pod 的 IP 和主机名发生变化
  • 节点故障后,该节点上面所有的 Pod 的数据都会丢失
  • 等等 …

Kubernetes 官网提供了一个 无状态的留言板示例应用

扩展阅读