Category: Backend

HTTP 请求的优雅取消(Graceful Cancellation)

我们经常会写一些“很慢”的 HTTP 接口:比如触发导出、跑一段复杂计算、调用外部服务、或者生成大文件。 问题在于:客户端可能在任务完成前就取消了请求(关闭页面、点了取消、网络切换、超时等)。 那服务端能不能“及时知道”客户端已经取消?如果能知道,就可以尽早停止后续的昂贵操作,省 CPU/IO/下游资源。 这篇文章用一个简单的 Go + Gin 示例,把常见场景拆开说清楚: 不经过 Nginx:

HTTP Graceful Cancelation

Imagine we are writing an HTTP server as described below, where the endpoint takes a long time to complete. When a client starts a request, it may cancel it before the long-running task is completed.

本地限流器实战:四种经典算法与实现思路

高 QPS 的后端服务,几乎一定需要“限流”(Rate Limiting)。 这里讨论的是本地限流器(local rate limiter):限流状态只存在于单个进程/单个实例中,不和其他实例共享。 它的目标很朴素: 在流量突增时保护服务自身(CPU/线程池/DB 连接/下游依赖) 让系统吞吐更可控,避免被瞬时尖峰打穿 本地限流最常见的四种算法: 固定窗口(Fixed Window) 滑动窗

Rate Limiter In Action

The backend systems which have lots of request per second always need a local rate limiter to protect themself. Which “local” means that this rate limiter worked in only this process and not shared wi

MySQL InnoDB Locks

InnoDB is a storage engine for MySQL.After more than ten years of development, InnoDB has becomed the most common storage engine in Internet compony usages. There are lots of articles talk over the l

多级缓存的设计与实现

在高并发量的后端业务中,多级缓存是一个非常常见的设计。事实上,多级缓存策略在计算机硬件也是普遍存在的。 为什么会有多级缓存?通常缓存都是比原数据要小的,设立缓存的目的很简单:某些数据经常用到,我们不想每次都去最深的地方(这里一般是指数据库)去找,所以我们就在更方便取到数据的地方把这些数据保存起来。 那么,为什么要用多级缓存呢?对于所有的数据来说,并不是每一份数据使用的频率都一样。对于使用频率非常

为什么不建议在 Redis 使用大 Key

Preview 公司里某位工程师小斌发现在一个 Redis 集群中的 some_big_list 经常出现慢查询,而且 QPS 特别高。初步定位是出现了一个热点的 Key。12newexplore> llen some_big_list500000 上面的命令发现,这个 some_big_list 是一个大 Key,导致 Redis Server 的服务器 CPU idle 很低,结果出现了

Java 里的构造函数需要加锁吗

我们在写 Java 的时候,经常会使用到 synchronized 关键字。synchronized 是一个相对重量级的锁,它有两种使用形式。 对一个具体的变量加锁。 12345678Logger l = LoggerFactory.getLogger(getClass().getName());synchronized (l) { // do something}sy