Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
B
brpc
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
brpc
Commits
a185aa1f
Commit
a185aa1f
authored
Dec 09, 2018
by
zhujiashun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update avalanche.md
parent
1c73d2a3
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
2 additions
and
2 deletions
+2
-2
avalanche.md
docs/cn/avalanche.md
+2
-2
No files found.
docs/cn/avalanche.md
View file @
a185aa1f
...
...
@@ -2,11 +2,11 @@
当流量超出服务的最大qps时,服务将无法正常服务;当流量恢复正常时(小于服务的处理能力),积压的请求会被处理,虽然其中很大一部分可能会因为处理的不及时而超时,但服务本身一般还是会恢复正常的。这就相当于一个水池有一个入水口和一个出水口,如果入水量大于出水量,水池子终将盛满,多出的水会溢出来。但如果入水量降到出水量之下,一段时间后水池总会排空。雪崩并不是单一服务能产生的。
如果一个请求经过两个服务,情况就有所不同了。比如请求访问A服务,A服务又访问了B服务。当B被打满时,A处的client会大量超时,如果A处的client在等待B返回时也阻塞了A的服务线程(常见),且使用了固定个数的线程池(常见),那么A处的最大qps就从
**线程数 / 平均延时**
,降到了
**线程数 / 超时**
。由于超时往往是平均延时的3
~4倍,A处的最大qps会相应地下降3~
4倍,从而产生比B处更激烈的拥塞。如果A还有类似的上游,拥塞会继续传递上去。但这个过程还是可恢复的。B处的流量终究由最前端的流量触发,只要最前端的流量回归正常,B处的流量总会慢慢降下来直到能正常回复大多数请求,从而让A恢复正常。
如果一个请求经过两个服务,情况就有所不同了。比如请求访问A服务,A服务又访问了B服务。当B被打满时,A处的client会大量超时,如果A处的client在等待B返回时也阻塞了A的服务线程(常见),且使用了固定个数的线程池(常见),那么A处的最大qps就从
**线程数 / 平均延时**
,降到了
**线程数 / 超时**
。由于超时往往是平均延时的3
至4倍,A处的最大qps会相应地下降3至
4倍,从而产生比B处更激烈的拥塞。如果A还有类似的上游,拥塞会继续传递上去。但这个过程还是可恢复的。B处的流量终究由最前端的流量触发,只要最前端的流量回归正常,B处的流量总会慢慢降下来直到能正常回复大多数请求,从而让A恢复正常。
但有两个例外:
1.
A可能对B发起了过于频繁的基于超时的重试。这不仅会让A的最大qps降到
**线程数 / 超时**
,还会让B处的qps翻
**重试次数**
倍。这就可能陷入恶性循环了:只要
**线程数 / 超时 \* 重试次数**
大于B的最大qps
**,**
B就无法恢复 -> A处的client会继续超时 -> A继续重试 -> B继续无法恢复。
1.
A可能对B发起了过于频繁的基于超时的重试。这不仅会让A的最大qps降到
**线程数 / 超时**
,还会让B处的qps翻
**重试次数**
倍。这就可能陷入恶性循环了:只要
**线程数 / 超时 \* 重试次数**
大于B的最大qps
,
B就无法恢复 -> A处的client会继续超时 -> A继续重试 -> B继续无法恢复。
2.
A或B没有限制某个缓冲或队列的长度,或限制过于宽松。拥塞请求会大量地积压在那里,要恢复就得全部处理完,时间可能长得无法接受。由于有限长的缓冲或队列需要在填满时解决等待、唤醒等问题,有时为了简单,代码可能会假定缓冲或队列不会满,这就埋下了种子。即使队列是有限长的,恢复时间也可能很长,因为清空队列的过程是个追赶问题,排空的时间取决于
**积压的请求数 / (最大qps - 当前qps)**
,如果当前qps和最大qps差的不多,积压的请求又比较多,那排空时间就遥遥无期了。
了解这些因素后可以更好的理解brpc中相关的设计。
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment