返回介绍

20.7 以数据为中心:单点

发布于 2024-12-15 23:01:57 字数 1798 浏览 0 评论 0 收藏 0

登录,是第二种以数据为中心的服务,它本质上就是以数据为单一结点的。也就是说,登录在逻辑概念上,就是数据单点的。登录的问题通常包括并发数量巨大、容易形成访问峰值,以及逻辑过长三种情况。

第一种情况通常在大规模的应用中都必然会出现,例如 Gmail 或者 QQ。当规模渐增,且我们必须“先完成登录验证再提供服务”时,登录逻辑的 CPU 消耗总量是不可能消减的。解决这一问题的基本方法是增加“登录服务”的物理服务器的数量,例如在 QQ 客户端上加入一个登录服务器列表,按照客户端的 QQ 号 Hash 到某个服务器去登录。又例如 Web 客户端(或其他没有处理登录位置能力的客户端),则可以考虑通过 DNS 轮循 11 来将请求投送到不同的服务器。

第二种情况常见于区域崩溃的恢复以及类似暴力攻击的时候。例如 2007 年台湾海峡的地震导致海底光缆断裂时,七条连接香港与外地的海缆中只剩下一条能维持有限度服务。在这种情况下,区域部署的系统(在软件与硬件上)都将受到访问峰值的冲击(访问浪涌)。即使不讨论这样极端的情况,在服务器维护进行重启后的短时间内,也通常会形成这样的峰值。而对于大多数在线系统(Online Service),首当其冲的就是登录服务。其原因便在于此前提到的:登录在逻辑概念上,就是数据单点的。应付浪涌的通常方法是“排队”,即在客户端或服务端添加有效的排队机制,将对登录服务的冲击控制在一定规模之下 12 。对于服务端来说,使用专用的队列服务,而不是依赖登录服务自身提供的任务池机制来处理也是相当重要的措施,专用队列可以负载更高,且对登录服务的处理能力不构成负面影响。对于客户端来说,提示用户“何时将会再次登录”是一个算法问题。事实上,我就遇到过同时打开某网站的十几个页面,而这些页面都卡在“短时间打开过多页面,请等待刷新”的提示页上。当使用浏览器的书签组功能时,这是常见的。这些页面采用的刷新值都是 5 秒钟,而十来个页面请求在 5 秒钟后“同时投送”到服务端的几率是相当高的。当你将这些页面想象成客户端连接,你就知道客户端延迟会导致请求最终像“共振”一样趋向同时抵达服务端。于是在上面的例子中,服务端与客户端都将同时处于 5 秒钟的饥饿等待与 5 秒钟后突如其来的请求爆发当中。

第三个问题比较特殊,通常我们不会主动在登录中加入过多的逻辑,但那些看似“无可拒绝”的产品需求则是例外。其中,“登录+权限”是一个最经常的假设,另一个则是“登录+验证码”。对于前者,事实上可以作为两个结点来进行设计,如果我们也将登录信息与权限信息设计为不同的数据的话 13 。对于后者,其计算的复杂性在于获取和核查验证码导致的外部调用(我们通常不会把验证码系统做在登录服务内),而这通常是通过验证码的预生成和本地缓存来解决的。然而还有一种特殊情况,即类似于在做第三方接入时,我们会异地验证用户的有效性。例如在系统中接入新浪微博账号,就需要远程调用其 Open API 并“等待”返回结果。第三方的计算复杂度或调用延迟将大大地拖慢登录服务的响应,进而导致 CPU 耗用很低而连接数很高(处于大量等待)的情况。从本质上来说,这也是因为在登录中加入了其他逻辑而导致的。

综合上述情况,如果系统中必然出现“(数据的或逻辑的)单点”,则应当一方面在单点服务内部入手,消减逻辑复杂度并剥离出更轻巧的服务,以减少单点逻辑的规模、提升服务性能;另一方面从客户端与服务端两面入手,尝试提供更合理的“请求-响应”逻辑,保障服务提供的体验;第三个方面则要努力尝试通过逻辑与数据的分布来消灭单点本身。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文