Comment Django peut gérer 100 millions de requêtes par jour

Aujourd'hui, j'écrirai sur Django, un cadre qui m'a fidèlement servi ces cinq dernières années. Il m'a aidé à réussir à développer des solutions à forte charge utilisées par des millions d'utilisateurs aujourd'hui.



En effet, Python n'est pas un langage de programmation très «rapide», mais il est simple, pratique et les gens l'adorent. Du point de vue des performances, ce n'est peut-être pas aussi rapide que Go ou Node.js, mais cela devient inutile lorsque l'on considère les frameworks modernes et le développement modulaire.



Depuis que je suis dans ce "pot de développement Django" depuis plusieurs années maintenant, j'en suis venu à des idées précieuses que je vais partager avec vous.



image

1. L'infrastructure décide



Outre les performances de l'application, la première chose dont vous avez besoin est un cadre qui vous permet de vous mettre à l'échelle lorsque l'application atteint sa limite, et Django peut évoluer facilement si vous suivez ces instructions:



  • Divisez votre application en microservices, mais tenez compte de la quantitĂ© de donnĂ©es transfĂ©rĂ©es entre eux, d'autant plus que la redondance des donnĂ©es et la synchronisation frĂ©quente entraĂ®nent une augmentation des ressources et des communications du serveur, et, par consĂ©quent, des coĂ»ts plus Ă©levĂ©s;
  • Utilisez des conteneurs Docker pour pousser votre code en production;
  • Docker , , Kubernetes, ;
  • : / ;
  • : - , (. .: — Kubernetes), Kubernetes, , . — .


2. —



, . , , , , :



  • . PostgreSQL, , , , ;
  • . - (IOPS) ;
  • , ;
  • , — , : ( SELECT), ( INSERT, UPDATE). Django , , .


3. Django ORM



, ORM, . , , 100 — 20 .



, , settings.py:



LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}


:



image





— PostgreSQL, pghero.



4.



, . Django , - .



CONN_MAX_AGE — , . . 5 . , , , , 100 , .



, 0 300 . AWS Aurora db.r5.8xlarge, db.r5.4xlarge, , , , .



image



5. (middlewares)



, , Django REST API. (sessions) (messages) — . , .



image



6. bulk-



bulk-, . Django ORM SQL-.



5000 , batch_size (. .: ). Python, , , .



image



bulk- Django





, JOIN.



, 11 :



image



, , :



image



select_related , ORM SQL- JOIN. , WHERE .



8.



. , .

Django ORM QuerySet .only() , .defer(), Django , :



image





9. API



, API. JSON , , .



: 1 , 1 , 1 , 30 — (. .: ) .





, Django Python, , : « — ».



Django . , , (. .: «») , «» .



, , . , .



Instagram, Pinterest Disqus — Django « », . , , , , , , .



, bulk-, , . .




All Articles