在编写Django应用程序之前,我应该采取措施确保它能够扩展吗



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

我知道有很多事情可以做

  • 负载平衡器后面的多服务器设置
  • 数据库复制/分片
  • 缓存(以各种方式)
  • 用serpy替换DRF串行器
  • 在蟒蛇上跑步3
  • 穿着睡衣跑步

我的问题是——这些(或其他事情)中的哪一件真的应该在项目开始时就做好?

编写时要考虑到可扩展性。

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

写东西时一定要考虑到可伸缩性。

正在开发

开发时的可扩展性使您可以毫无保留地开发产品。

  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. 正在将DRF序列化程序交换为serpy
    如果你需要更高的速度,如果你觉得舒服的话,可以从serpy开始。坚持使用Serpy比重写DRF序列化程序要好,因为编写这两个程序看起来都很轻松,但要确保您不会因为优化丢失的1或2毫秒而浪费时间。

  3. 在蟒蛇3上跑步
    取决于您计划使用的库。

  4. 在pypy上运行
    pypy比标准实现更快。使用pypy取决于库的兼容性。可兼容软件包的列表和兼容性状态。

现在的问题是,

这些(或其他事情)中的哪一项真正应该在项目开始时就做好?

Ans:Developemet(1,2,3,4,5,6,7,8)Production(1,2)

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

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

最新更新