知识卡片
无状态服务器的资源杠杆
内容
一旦对象需要在请求之间保留状态(变成”有状态服务器对象”),代价立刻变得具体:这个对象必须在用户思考、迟迟不发下一个请求的整段时间里,一直占着资源等着。书中给出一个简化但说明力很强的算例:100个人查询书籍,处理一次查询要1秒钟,每人平均每10秒发一次请求,请求分布均匀——如果用有状态服务器对象处理(比如要记住每个用户查过哪些ISBN),就必须给每个用户各配一个专属对象,也就是100个对象,但其中90%的时间这些对象都在闲置、什么也不干;如果改用无状态对象处理(不做这个记录),只需要10个对象就能满负荷地撑住同样的请求量。结论很直接:如果请求之间不需要保留状态,就完全不必关心是哪个具体对象来处理某次请求——这意味着可以把对象缓存起来复用,用很少的对象数量服务大量用户;空闲等待的用户越多,无状态服务器的资源杠杆效应就越明显,这也是为什么无状态设计对高流量网站格外有价值(HTTP协议本身也是无状态的,这与该设计思路天然契合)。可迁移启发:评估要不要让某个组件保留跨请求状态时,值得先算一笔账——”专属占用 vs 按需复用”在资源利用率上的差距,往往比直觉想象的大得多。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第6章 会话状态"之"6.1 无状态的价值"(源文件:_epub-src/OEBPS/Text/000042.html)
- 结论依据:原文举例"有100个人需要查询书籍,处理对一本书的请求要用1秒钟,每个人隔10秒钟请求一次……如果我们使用有状态服务器对象来处理用户请求,就必须给每个用户分配一个服务器对象,即100个对象。但是在90%的时间里,这些对象都呆在那里什么也不干。如果我们不做ISBN号记录而只使用无状态服务器对象来处理请求,就只需要10个服务器对象满负荷工作",直接支撑本卡结论。
- 原始内容:无状态使得我们可以缓存这些对象,用很少的对象就可以处理很多的用户。空闲状态的用户越多,无状态服务器就越有用。