App Engine:大脚本少还是小脚本多?

App Engine: Few big scripts or many small ones?

我正在开发一个我想在 App Engine 上托管的网站。我的 App Engine 脚本是用 Python 编写的。现在假设您可以在我的网站上注册并拥有用户资料。现在,用户配置文件有点广泛,有 50 多个不同的 ndb 属性(仅作为示例)。

如果用户想要编辑他的记录(他可以在一定程度上编辑),他可以通过我的网站向应用引擎后端发送请求。

配置文件是部分的方式,通常大约 5 到 10 个属性属于页面的一个小部分或容器。在服务器端,我会有多个小脚本来处理编辑整个配置文件的小部分。例如,一个脚本会更新 "adress information",另一个脚本会更新 "interests" 和一个 "about me" 文本。这样我最终得到了 5 个左右的脚本。优点是每个脚本易于维护,只做一件特定的事情。但我不知道这样的事情是否明智。因为如果我在页面的其余部分保持这种习惯,我可能会得到大约 100 个或更多不同的 .py 脚本和一个非常大的 app.yaml,而且我不知道它们在 google 服务器。

所以 tl;dr:

在我的 App Engine 后端上执行小任务的许多小后端脚本是个好主意,还是我应该使用一些可以处理各种不同任务的脚本?

这里有两个重要的考虑因素。

  1. 从客户端到服务器的往返调用次数。

更新用户配置文件的一次调用比更新用户配置文件不同部分的 5 次调用要快得多,因为您可以节省客户端和服务器之间以及服务器和数据存储之间的往返时间。

  1. 写入成本。

如果你更新一个用户配置文件中的 5 个属性并保存它,然后更新其他 5 个属性并保存它等等,你的写入成本会更高,因为每次更新都会产生写入成本,包括对所有索引的更新属性 - 即使是您没有更改的属性。

与其创建包含 50 个属性的庞大用户配置文件,不如将很少更改的属性(姓名、性别、出生日期等)保留在一个实体中,并将​​其他属性分离到不同的实体中或实体。通过这种方式,您可以降低编写成本,同时减少负载(除非需要,否则无需来回移动所有 50 个属性),并简化您的应用程序逻辑(即,如果用户仅更新地址,则无需更新整个用户配置文件)。

每次启动应用程序实例时都必须加载一个大脚本,这可能会影响实例启动时间、启动实例的每个请求的响应时间以及实例的内存占用。但是它可以立即处理任何请求,不需要加载额外的代码。

多个较小的脚本可以按需延迟加载,在您的应用程序启动后,提供的优势可能对某些应用程序有吸引力:

  • 主 app/module 脚本可以保持较小,这样可以缩短实例启动时间
  • 应用程序的内存占用可以保持较小,延迟加载文件中的处理程序代码在请求此类处理程序之前不会加载 - 对于很少使用的处理程序很有趣
  • 对于需要加载处理程序代码的请求,响应时间的额外延迟较小,因为只需要加载一个较小的脚本。

当然,缺点是 一些 请求由于处理程序脚本的加载将比平时有更长的延迟:在最坏的情况下,受影响的请求数是每个实例生命周期的脚本数量。

更新用户配置文件不是经常做的事情,我认为这是一项很少使用的功能,因此将其处理程序放在一个单独的文件中看起来很吸引人。将它拆分为每个文件一个处理程序 - 我发现 maybe 有点极端。这真的取决于你,你更了解你的应用程序和你的风格。

从 GAE(缓存)基础设施的角度来看 - 文件配额是 10000 个文件,我不会担心只有 ~100 个文件。

添加到 Dan Cornilescu 的回答中,writing/saving 数据库实例将整个实例(即其所有属性)重新写入数据库。如果你要多次使用 put(),你就要多次重写 who 实例。这除了是一项繁重的任务外,还会花费你更多的钱。