Upgrade to Pro — share decks privately, control downloads, hide ads and more …

日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei

bungoume
November 12, 2022

日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei

bungoume

November 12, 2022
Tweet

More Decks by bungoume

Other Decks in Technology

Transcript

  1. 日経電子版でのDjango活用事例紹介 DjangoCongress JP 2022 Yuri Umezaki 2022/11/12

  2. Yuri Umezaki • 検索API (Django, Elasticsearch) • OAuth認可 API基盤(DRF, oauthlib)

    • アクセスログ分析 自己紹介 2
  3. • 日経電子版の紹介 • 社内でのDjango事例 • 教育 • Djangoを7年(1.7から4.1)使っての変遷 • 直近の開発

    • Tips • 今後について 目次 3
  4. 1876年(明治9年)12月創刊 約145年の歴史 全世界で256万部(紙・電子版の合計)※ を発行する世界最大の経済新聞社 ※2022/7 時点 https://marketing.nikkei.com/media/newspaper/mediadata/ 日本経済新聞社について 4

  5. • 全部で70リポジトリ以上 ◦ 電子版API (今回主に説明) ◦ 法人向けサービス ◦ 社内ツール ◦

    検証デモツール ◦ etc… 社内のDjango利用状況 5
  6. • 2010年3月創刊 • 有料ユーザー79万人 • 無料ユーザー 450 万人以上 • 月間2億PV

    日経電子版とは *1 2022/1/1時点 https://marketing.nikkei.com/media/web/ 6
  7. 電子版の構成図 CDN(Fastly) internet BFF(アプリ) CDN(Fastly) BFF(web) CDN(Fastly) API基盤 ID基盤 検索API

    レコメンド メール バナー 記事保存 ランキング 動画・音声 7
  8. 電子版の構成図 CDN(Fastly) internet BFF(アプリ) CDN(Fastly) BFF(web) CDN(Fastly) API基盤 ID基盤 検索API

    レコメンド メール バナー 記事保存 ランキング 動画・音声 8 このあたりがDjango
  9. • API基盤へのアクセス: 2500 req/sec • 稼働インスタンス数: 全体で300台以上 ◦ API基盤は約60台 •

    Push通知直後のアクセス: 数万req/s • CDNキャッシュによりBFFは500rps ※t3.smallなど小さいインスタンスを多数動かしています 規模感 9
  10. • 可能な限りCDNでキャッシュができるようなAPI構造 ◦ JWT利用などの工夫である程度ステートレスに権限判定 ◦ Vary, Surrogate-Control (CDN-Cache-Control) の設定(※) ◦

    Pushピーク時は個人別のデータアクセスを極力減らす • ETagを活用して通信量削減 ※Djangoの挙動に注意 https://code.djangoproject.com/ticket/32055 負荷をCDNで防ぐために 10 CDN(Fastly) internet BFF(アプリ)
  11. • CI: GitHub Actions • 環境: AWS ElasticBeanstalk (Docker) •

    アクセスログ: fluentd -> S3, ES+Kibana • アラートログ: Sentry • 監視: バッチサーバ+E2E, StatusCake, PagerDuty 基本構成 11
  12. • 管理サイトでデータベースの内容を簡単に確認・変更できる • 社内で知見の共有が行いやすい ◦ ライブラリやディレクトリ構成をほぼ共通にできる • ドキュメントが充実しており、研修にも利用しやすい • DBスキーマ管理まで一元的にできる

    ◦ 特にmigrationが行いやすい Django 良いなぁと感じるポイント 12
  13. 13 • 社内向けツール ◦ バナー情報管理 ◦ client_id発行管理 ◦ ユーザ管理ツール •

    実験的システム ◦ 本番運用へ移行しやすい Django管理サイト利用例
  14. • 基盤 ◦ Docker設定 ◦ AWS ElasticBeanstalk等の環境構築, CI設定 ◦ 本番・開発など分けた設定値

    ◦ healthcheck pathの用意 • ログ設定 ◦ Sentryの設定, uWSGIのアクセスログ設定 社内Djangoテンプレート 14
  15. 新人研修+α • Django公式チュートリアル • PyQ (pyq.jp) • DRFでのAPI開発 • Django自体のコードリーディング

    最近はDjangoの本も多数出てきている。 研修 15
  16. • DRFでAPIが作成できる • ブログを一通り作ってもらう ◦ webの理解も進む ◦ DBのモデル設計 • 一人で勉強できるサービス

    研修 16
  17. • Django自体もPythonで読みやすい • 機能に興味を持ったとき調べやすい ◦ 例: SECURE_SSL_REDIRECTってなんだろう? ▪ ドキュメントを見る・先輩に聞く ▪

    挙動を詳しく知りたいときはコードを見る • Djangoを利用したOSSサービスのコードリーディング Django の学習面メリット 17
  18. • SQLAlchemy modelとpydantic modelに慣れるまで混乱しがち? ◦ 慣れると型定義など便利 ◦ Django+RDBは情報が多く取り掛かりやすい • ディレクトリ構成が人によって結構変わる

    • (社内のユースケースでは)性能面で極端な差はでなかった FastAPIも試してみたけど 18
  19. • DB MigrationはDjangoが楽 • 参考実装をDjangoでやり、アクセスが増えたらGoでも用意 golangも使い始めているけれど 19

  20. 20 Djangoを7年間使って

  21. Dockerベースなのでライブラリ対応をみて都度更新 (毎年10月に公開、翌年4月に更新ぐらいのペース) • 過去 ◦ python:3.5.2-alpine -> python:3.6.4-stretch ▪ alpineのmuslと一部ライブラリの相性が良くない

    • ex: uwsgiでharakiriが発生すると詰まる等 ◦ PyPy, Pystonは今は使わず ▪ 何度か試そうとしたが安定性+CPython新機能を優先 Python3.4 -> 3.11 21
  22. deprecation warningに定期対応しておくと比較的容易に更新できる https://docs.djangoproject.com/ja/4.1/internals/deprecation/ • Python2系の互換削除による変更 • セキュリティ強化に伴う設定追加 • Middleware更新 •

    urlsの変更 • JSONField追加 • timezone周りの変更, pytz削除 Django 1.7 -> 4.1 22
  23. PBKDF2のイテレーション数 → Djangov4.1で390000 v4.2で480000 Python3.7.7 + Django v2.0 => 55ms

    Python3.10.7 + Django v4.1 => 215ms Djangoの認証をAPIで利用している人は遅くなっていないか確認を https://speakerdeck.com/bungoume/password-hashing-djangocongress-20180519 Tips DjangoCongressJP 2018 Password Hashingより 23
  24. • requirements.txt ◦ dev環境のパッケージ管理がしにくい ◦ 孫依存のバージョン固定が抜けて本番エラーに • -> pipenv (2018/7頃〜)

    ◦ 2019/5頃〜 dependabotによる更新自動化 ◦ 依存解消やインストールが遅すぎる • -> poetry (2020/3頃〜) ◦ pyproject.toml に各種設定を寄せる 依存ライブラリ管理まわりの主な変遷 (例) 24
  25. • flake8, coverage • isort, black導入(2018〜) • mypy導入(2018〜) • pyright一部導入(2021〜)

    チェックツールの主な変遷 (例) 25
  26. • 最近はフロントエンドをNodejsで作るケースが多くなった ◦ frontendとbackendで言語が割れたので学習コスト増 ◦ 1アプリ内ににフロント用nodejsとapi用python併用 ▪ multi-stage-docker, 複数コンテナ 最近よくある構成

    26
  27. 27 サービス安定化に向けてアプリケーションのマルチリージョン化 直近で実施したアーキテクチャ変更事例

  28. アプリケーションのマルチリージョン化 28 Tokyo APP DB US internet APP DB 同じ構成を用意

    DNS等で切替
  29. アプリケーションのマルチリージョン化 29 Tokyo APP DB US internet 最小数のApp DB(読込専用) DNS等で切替

    レプリケーション 別ドメイン 確認アクセス
  30. • DBはリードレプリカであり、書込出来ない ◦ 管理画面(Django admin)にもログインできない バックアップリージョン利用時の問題点 30

  31. • Djangoのsined_cookie sessionを活用する 解消 31

  32. 社内Django templateのTips集 32

  33. • 外部通信でhttpsを利用するときはConnectionを使い回すべし ◦ TLS接続はCPU負荷が高い ◦ PoolするだけでCPU使用率1/3に Tips 33

  34. • uWSGIで設定を環境変数で指定できるように ◦ メモリ量に合わせて変更が容易 Tips 34

  35. • uWSGIのログはLTSV出力して分析しやすく Tips 35

  36. • urls.py のpathに該当するか出力すると便利 Tips 36

  37. nginxを挟むときは接続上限数を入れる → アクセス過多時は即時エラーを返す → 処理が詰まっても長期で影響が広がらない Tips nginx.conf の一部抜粋 37

  38. • 共通のGitHub Actionsを利用してdeployを簡潔に記述 Tips 38

  39. 39 • 性能改善効果が大きい箇所の最適化 • 型定義の強化 • 管理サイトのアカウントを社内ADに寄せる 今後進めたいこと

  40. • 日経電子版の紹介 • 社内でのDjango事例 • 教育 • Djangoを7年(1.7から4.1)使っての変遷 • アプリケーションのマルチリージョン化紹介

    • Tips • 今後について まとめ 40
  41. • 管理サイトでデータベースの内容を簡単に確認・変更できる • 社内で知見の共有が行いやすい ◦ ライブラリやディレクトリ構成をほぼ共通にできる • ドキュメントが充実しており、研修にも利用しやすい • DBスキーマ管理まで一元的にできる

    ◦ 特にmigrationが行いやすい Django 良いなぁと感じるポイント(再) 41
  42. 42 一緒にDjangoバックエンドの開発に取り組んでくれる仲間を募集中です カジュアル面談から気軽に話しましょう https://hack.nikkei.com/ [PR] 私たちはエンジニアを積極採用中です