你可能已经猜到了,是的,我就是玩 Pokémon Go 的人之一。 或者,就像最近常出现的情况一样,不玩 Pokémon Go。 这很糟糕,因为这也意味着我们最小的孩子不能玩了,因为事实证明我们都在使用 Pokémon Trainer Club (PTC) 帐户来玩,而不是 Google 帐户,所以我们无法进入。
这很重要,因为虽然我们两个人因无法“验证身份”和登录玩游戏而感到沮丧,但我的丈夫选择使用他的 Google 帐户,而且,他没有遇到同样的问题。
这让我开始深入研究一些技术问题,这些问题应该引起每家公司的共鸣,无论他们推出的是什么应用程序。 这种担忧围绕着新的 AAA——API、身份验证和可用性。
有趣的是,这个探索始于我在《福布斯》上读到一篇关于在 Pokémon Go 中追踪 Pokémon 的文章时。 是的,福布斯。 它就这么大。 无论如何,这导致了一篇又一篇的文章,其中一篇文章推测跟踪(至少最初)中断的原因是由于游戏更新,其中 API 密钥被无意中遗漏在返回 Niantic 服务器的跟踪调用之外。
无论是否如此,这样的失礼行为确实会破坏 API。 但我一直在思考的问题是,如果我无法登录我的 PTC 帐户并玩游戏,为什么我可以切换到我的 Google 帐户并轻松进入?
好吧,这让我在 github 上搜索并浏览 Pokémon Go API(我更喜欢Java ,但是也有Python ,疯狂吧),最后我灵光一闪。 你看,这些存储库中的几乎每个 API 调用都会处理相同的异常: 登录失败异常。
换句话说,即使是简单地调用查找附近的 Pokémon 也可能会导致LoginFailedException 。
这其实并没有什么令人惊讶的。 请注意,单片 Web应用通常通过会话来跟踪经过身份验证的用户,这通常意味着包含会话 ID 或其他令牌的cookie ,应用在实际执行任何其他操作之前会对其进行检查(对于那些关注的人来说,这是一个有状态的架构)。 API 并没有太大的不同,因为每个 API 调用都必须有一种方法来确保调用应用(用户)实际上被授权首先进行调用。 他们必须“登录”。
现在,API 通常使用 API 密钥来实现这一点。 通常会根据用户配置文件检查密钥以确保呼叫得到授权。 每次呼叫(在无状态架构中)。 做出这一决定的原因有多种,其中包括限制呼叫速率的能力。 这是一件大事。 Apigee 的 2016 年 API 状况报告指出,68% 的 API 都利用了配额管理(也称为速率限制、计量等)。为了实现这一技术技巧,首先必须知道过去一分钟/一小时/一天中进行了多少次调用,因此必须在安全的地方跟踪它(这样用户就无法操纵它并欺骗应用在每个时间段内允许更多调用)。
换句话说,API 可能会对身份验证基础设施造成很大的负担,因为它们必须验证状态、授权,并可能应用速率限制。 这需要做很多工作。
然而,我们通常仍然传统的应用程序架构思维并没有考虑这些额外调用对容量的影响。 这些额外的验证和授权调用,即使是定期“刷新”会话,也会对身份验证基础设施造成相当大的压力。 支持登录的相同身份验证基础设施。 当浏览器对每个用户的连接数限制从 2 个增加到 8 个时,我们看到了同样的压力。 现在,单个用户访问应用需要消耗 8 倍的资源。 类似地,在考虑依赖于每个 API 调用授权的应用程序的容量需求时,必须进行一些计算并确定单个用户将消耗多少个 X。
如果不这样做,就会导致 8 岁儿童(以及愤怒的 Loris)感到愤怒,因为不堪重负的登录服务阻碍了他们抓住他们迫切想要抓住的皮卡丘。
身份和访问是至关重要的应用服务。 在过去两年的应用交付状况调查中,我们看到它们的重要性不断上升,而且在不透露太多信息的情况下,我们已经看到 2017 年身份联合和应用访问控制的数据有所增加。 这不仅仅是因为应用程序,也是因为事物,以及不断增长的需求,需要扩展整个身份服务基础设施以支持更多事物、更多用户、更多使用 API 与后端应用交互的应用程序。
可用性通常仅基于停机时间的衡量。 如果服务器启动并正常工作,则可以使用。 这是一个由内而外的视角。 但就像安全一样,我们需要扭转这种测量方式并从外向内进行观察。 容量很重要,仅仅“正常运行”和“可用”是不够的。 服务需要对想要使用它们的每个人都保持“开放”和“可用”。 这意味着扩展速度与您的 Python 脚本的执行速度一样快。
它还意味着了解实际实现 API 所呈现的功能的各种后端服务之间的关系。 身份和访问服务对于可用性而言与实际应用本身一样重要。 可用性与安全性一样,其好坏取决于其最薄弱的环节。 如果您的身份服务不像应用的其余部分那样可扩展(或者如果您的模型是每个 API 调用身份验证,则可扩展性更高),您会发现可用性是一个重大问题,即使您所有的仪表板里面都显示“绿色”。
因为从外面看,我们看到的是“红色”。 从字面上和比喻上来说。