【问题标题】:Should I take steps to ensure a Django app can scale before writing it?我应该采取措施确保 Django 应用程序在编写之前可以扩展吗?
【发布时间】:2015-12-23 16:18:20
【问题描述】:

所以,我正在考虑使用 python2 django(-rest-framework)、postgres 和 angular 编写一个应用程序。

我知道有很多事情可以做

  • 负载平衡器后面的多服务器设置
  • 数据库复制/分片?
  • 缓存(以各种方式)
  • 为 serpy 交换 DRF 序列化程序
  • 在 python3 上运行
  • 在 pypy 上运行

我的问题是 - 这些(或其他事情)中的哪一个真正应该在项目开始时就完成?

【问题讨论】:

  • 我不是性能专家,但根据我的经验,Django 应用程序的瓶颈是数据库访问。如果您现在知道您将需要可扩展性,也许您应该考虑使用 NoSQL?
  • “NoSQL”是一个非常模糊的术语,描述了许多不相关的技术,根据具体的项目,这些技术可能或无助于缩放(无论是垂直还是水平)。但作为一般经验法则,我不会放弃一个强大的 SQL 数据库作为主要数据存储,除非我有明确的证据表明我不需要 SQL 数据库并且它确实是一个瓶颈。
  • 这个项目实际上将是一个 MEAN 项目的重写 - 其中一个更大的问题是 MongoDB 缺乏关系数据/查询导致 严重 问题 - Cassandra 和其他一些系统似乎很诱人 - 但是具有出色查询语言和不错的 postGIS 支持的 Django ORM 是我不太愿意放弃的东西 - 不过,如果它真的有意义,我愿意!

标签: python angularjs django postgresql python-3.x


【解决方案1】:

考虑到可扩展性。

可扩展性不仅限于生产服务器/环境,还包括开发环境。

始终牢记可扩展性。

开发中

开发时的可扩展性让您可以无缝地开发产品。

  1. 构建您的存储库
    使用 GitFlow 之类的 git 分支模型,以便开发人员可以并行工作,或者单个开发人员可以切换处理不同的功能。使用错误跟踪器。

  2. 设计您的应用程序。
    在实际编写一行代码之前,先写下您要编写的应用程序。设计应用程序以最小化关系(ManyToMany、ForeignKey 等)、导入。 Django 提供了可插拔的应用程序架构,您可以随意明智地使用它。

  3. 先编写测试。
    这确保您可以迁移(生产环境)、升级和降级,减少痛苦和脱发。相信我,写测试感觉很无聊,但值得。

  4. 抽象模型,经理
    使用抽象模型和管理器,可以消除样板模型代码,帮助您维护代码。

  5. 命名变量、类和方法的描述性。
    将变量、类和方法命名为描述性的,因为您无需查看文档即可知道它代表什么。

  6. 文档代码。
    随意记录类和方法,以便您或其他查看代码的同行了解它的缩进,而不是堆栈跟踪以查看方法正在做什么。

  7. 使用调试工具栏
    在开发时使用 django 调试工具栏,在测试 API 时,使用 prefectch_related()select_related() 最小化/消除重复查询。

  8. 模块化代码。
    将代码模块化。 Python 和 django 通常鼓励使用模块。模块易于管理。使用类、更多继承和抽象基类来重用代码。

  9. 使用持续集成
    使用持续集成测试您的存储库并确保新推送不会破坏系统。

在生产中。

生产中的可扩展性让您可以无缝地将产品提供给无限的用户。

  1. 用于多服务器设置

    • 坚持休息设计原则。
    • 消除会话。
    • 使用像 Redis 这样的分布式缓存。
  2. 为 serpy 交换 DRF 序列化程序
    如果您需要更快的速度并且您感到舒适,请从 serpy 开始。坚持使用 Serpy 比重写 DRF 序列化程序更好,因为编写两者看起来都很相似,但请确保您不会通过优化丢失的 1 或 2 毫秒来浪费时间。

  3. 在 python3 上运行
    取决于您计划使用的库。

  4. 在 pypy 上运行
    pypy 比标准实现更快。使用 pypy 取决于库的兼容性。 A list of compatibile package and status of compatibility.

现在是问题,

其中哪些(或其他事情)真正应该在项目开始时就完成?

Ans:开发 (1,2,3,4,5,6,7,8) 生产 (1,2)

【讨论】:

    【解决方案2】:

    我认为您无需立即开始担心设置问题。我会劝阻过早的优化。相反,在生产中运行应用程序,对其进行分析。当你达到规模时,看看是什么影响了性能——你就会知道瓶颈是什么。

    【讨论】:

    • 这是我目前的计划——虽然我经常发现有些事情一开始就做起来更有意义
    【解决方案3】:

    您必须正确处理的第一件事和主要事情是干净且正确的数据库架构以及清晰、可读且正确分解(干燥...除非是意外重复)和解耦代码。如果你知道设计一个关系数据库模式并学会正确使用 Python 和 Django,那么到目前为止你应该不会有太多问题,如果你把这两个东西都做好了,它会(它应该)很容易扩展——通过添加缓存在需要的地方(Redis、Memcache 或存储经常访问数据的“预处理”版本的中间 NoSQL 文档数据库)、添加服务器、负载平衡等,具体取决于应用程序的需求。 Django 是为轻松扩展而构建的,除非您做一些愚蠢的事情,否则它很容易扩展。

    【讨论】:

    • 虽然这可能是另一个问题 - 在这种情况下可能会提到要避免的一些更大的“愚蠢的事情”吗?
    猜你喜欢
    • 2020-02-19
    • 2018-06-09
    • 2010-11-24
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多