低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

队列并不能解决“超载”

2014 年 11 月 25 日

人们总是错误地使用队列,最坏的情况是用它解决“超载(overload)”问题。 Fred Hebert 是《 Learn You Some Erlang for Great Good! 》一书的作者。在这本 Erlang 入门书籍中,他结合生动的插图、恰当的实例以浅显易懂的方式讲解了技术问题。近日,他以同样的方式阐释了为什么“队列不能解决超载”。

他将系统比作一个洗手池,如下所示:

在正常的操作下,数据只从左侧流入,出口可以处理所有数据。但在一些重大活动期间,比如圣诞节,可能会出现如下情况:

数据从左右两侧同时流入系统。如果数据输入越来越快,那么出口就可能会无法及时处理所有数据。这时,人们通常会考虑增加一个队列缓冲区(如上图的水槽)存储临时数据。但不管队列多大,持续的超载都会导致如下情况的发生:

队列满了,系统崩溃。这时候,开发人员会查看堆栈跟踪、队列、数据库查询以及调用的API。但经过各种优化,甚至更换更大的服务器后,系统仍然无法承受这种持续的超载,因为瓶颈在出口(下图中红箭头所示的位置):

该瓶颈可能是数据库,可能是磁盘、带宽或CPU。不消除这种瓶颈,任何优化都是徒劳。所以此时,开发人员应该做的是阻塞输入,即“反压( back-pressure )”或者丢弃数据,即“卸载(load-shedding)”。可能有人会认为,反压会招致用户的不满。但实际上,即使不主动反压,当系统负载达到一定程度后,速度也会降低,甚至崩溃。所以,虽然反压会降低用户的输入速度,但却可以保证系统的运行。另外,引入队列作为一种优化机制会违背端到端原则。因此,开发人员应该设置更多允许超时的地方,提供故障检测方法,并将其反馈给用户。

如上图所示,开发人员可以在识别出系统瓶颈后设置相应的反压机制,避免数据流入过快。而依据检查点的不同,开发人员可以对延迟和吞吐量实现不同层次的优化。

借助反压或卸载,开发人员可以获得以下好处:

  • 合适的服务质量指标
  • 减少紧急修复的次数
  • 根据账户限制和优先通道收费的方式
  • 系统更稳定

总之,如果 API 设计考虑了端到端原则和幂等性,那么反压或卸载对调用者而言通常不会成为问题,因为它们可以安全地重试请求。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 11 月 25 日 09:592782
用户头像

发布了 256 篇内容, 共 67.9 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

Mybatis【6】-- Mybatis插入数据后自增id怎么获取?

秦怀杂货店

mybatis

架构师训练营 - 第十一周作业

一个节点

极客大学架构师训练营

月薪8k和月薪38K的程序员差距在哪里?学习Linux C/C++ 这些你就知道了

ShenDu_Linux

c++ Linux 程序员

【Java基础】-- instanceof 用法详解

秦怀杂货店

Java

程序员入门之路

思想者杰克

程序人生

到手的股权,又没了 | 法庭上的CTO(2)

赵新龙

股权 CTO 28天写作

IT做得好的时候,是什么状态?

boshi

职业

【java基础】-- java接口和抽象类的异同分析

秦怀杂货店

Java 接口

《Linux就该这么学》PDF版免费下载

计算机与AI

Linux

从华为看VUCA时代如何让组织不断乘风破浪?

Alan

华为 战略思考 组织发展 组织活力

架构师训练营第 1 期第 11 周学习总结

好吃不贵

极客大学架构师训练营

JDBC【4】-- jdbc预编译与拼接sql对比

秦怀杂货店

sql JDBC

架构师训练营 -week11-总结

大刘

极客大学架构师训练营

架构师训练营第 1 期第11周作业

业哥

系统性能的主要技术指标以及变化

皮蛋

JVM,JRE,JDK之间的区别和联系

入门小站

JVM

使用PicGo存储markdown图片(阿里云或者github)

秦怀杂货店

markdown 图床

5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码

herongwei

c++ 源码 内存 后端开发 stl

性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

落朽

架构词典:缓存

lidaobing

缓存 架构

架构师训练营第11周课后作业

吴传禹

极客大学架构师训练营

11.8作业

张荣召

Sharding-Sphere Proxy 分库分表 简单示例

Java MySQL 分库分表 ShardingSphere-Proxy

架构师训练营第11周总结

吴传禹

极客大学架构师训练营

第七周总结

孤星

秒懂DHCP是什么

架构师训练营第七周作业

丁乐洪

Mybatis【5】-- Mybatis多种增删改查那些你会了么?

秦怀杂货店

Java mybatis JDBC

架构师训练营 - 第十一周总结

一个节点

极客大学架构师训练营

架构师训练营第 1 期第 11 周作业

好吃不贵

极客大学架构师训练营

java集合【10】——— LinkedList源码解析

秦怀杂货店

Java 集合 linkedlist

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

队列并不能解决“超载”-InfoQ