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

    View Slide

  2. Yuri Umezaki
    ● 検索API (Django, Elasticsearch)
    ● OAuth認可 API基盤(DRF, oauthlib)
    ● アクセスログ分析
    自己紹介
    2

    View Slide

  3. ● 日経電子版の紹介
    ● 社内でのDjango事例
    ● 教育
    ● Djangoを7年(1.7から4.1)使っての変遷
    ● 直近の開発
    ● Tips
    ● 今後について
    目次
    3

    View Slide

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

    View Slide

  5. ● 全部で70リポジトリ以上
    ○ 電子版API (今回主に説明)
    ○ 法人向けサービス
    ○ 社内ツール
    ○ 検証デモツール
    ○ etc…
    社内のDjango利用状況
    5

    View Slide

  6. ● 2010年3月創刊
    ● 有料ユーザー79万人
    ● 無料ユーザー 450 万人以上
    ● 月間2億PV
    日経電子版とは
    *1 2022/1/1時点
    https://marketing.nikkei.com/media/web/
    6

    View Slide

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

    View Slide

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

    View Slide

  9. ● API基盤へのアクセス: 2500 req/sec
    ● 稼働インスタンス数: 全体で300台以上
    ○ API基盤は約60台
    ● Push通知直後のアクセス: 数万req/s
    ● CDNキャッシュによりBFFは500rps
    ※t3.smallなど小さいインスタンスを多数動かしています
    規模感
    9

    View Slide

  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(アプリ)

    View Slide

  11. ● CI: GitHub Actions
    ● 環境: AWS ElasticBeanstalk (Docker)
    ● アクセスログ: fluentd -> S3, ES+Kibana
    ● アラートログ: Sentry
    ● 監視: バッチサーバ+E2E, StatusCake, PagerDuty
    基本構成
    11

    View Slide

  12. ● 管理サイトでデータベースの内容を簡単に確認・変更できる
    ● 社内で知見の共有が行いやすい
    ○ ライブラリやディレクトリ構成をほぼ共通にできる
    ● ドキュメントが充実しており、研修にも利用しやすい
    ● DBスキーマ管理まで一元的にできる
    ○ 特にmigrationが行いやすい
    Django 良いなぁと感じるポイント
    12

    View Slide

  13. 13
    ● 社内向けツール
    ○ バナー情報管理
    ○ client_id発行管理
    ○ ユーザ管理ツール
    ● 実験的システム
    ○ 本番運用へ移行しやすい
    Django管理サイト利用例

    View Slide

  14. ● 基盤
    ○ Docker設定
    ○ AWS ElasticBeanstalk等の環境構築, CI設定
    ○ 本番・開発など分けた設定値
    ○ healthcheck pathの用意
    ● ログ設定
    ○ Sentryの設定, uWSGIのアクセスログ設定
    社内Djangoテンプレート
    14

    View Slide

  15. 新人研修+α
    ● Django公式チュートリアル
    ● PyQ (pyq.jp)
    ● DRFでのAPI開発
    ● Django自体のコードリーディング
    最近はDjangoの本も多数出てきている。
    研修
    15

    View Slide

  16. ● DRFでAPIが作成できる
    ● ブログを一通り作ってもらう
    ○ webの理解も進む
    ○ DBのモデル設計
    ● 一人で勉強できるサービス
    研修
    16

    View Slide

  17. ● Django自体もPythonで読みやすい
    ● 機能に興味を持ったとき調べやすい
    ○ 例: SECURE_SSL_REDIRECTってなんだろう?
    ■ ドキュメントを見る・先輩に聞く
    ■ 挙動を詳しく知りたいときはコードを見る
    ● Djangoを利用したOSSサービスのコードリーディング
    Django の学習面メリット
    17

    View Slide

  18. ● SQLAlchemy modelとpydantic modelに慣れるまで混乱しがち?
    ○ 慣れると型定義など便利
    ○ Django+RDBは情報が多く取り掛かりやすい
    ● ディレクトリ構成が人によって結構変わる
    ● (社内のユースケースでは)性能面で極端な差はでなかった
    FastAPIも試してみたけど
    18

    View Slide

  19. ● DB MigrationはDjangoが楽
    ● 参考実装をDjangoでやり、アクセスが増えたらGoでも用意
    golangも使い始めているけれど
    19

    View Slide

  20. 20
    Djangoを7年間使って

    View Slide

  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

    View Slide

  22. deprecation warningに定期対応しておくと比較的容易に更新できる
    https://docs.djangoproject.com/ja/4.1/internals/deprecation/
    ● Python2系の互換削除による変更
    ● セキュリティ強化に伴う設定追加
    ● Middleware更新
    ● urlsの変更
    ● JSONField追加
    ● timezone周りの変更, pytz削除
    Django 1.7 -> 4.1
    22

    View Slide

  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

    View Slide

  24. ● requirements.txt
    ○ dev環境のパッケージ管理がしにくい
    ○ 孫依存のバージョン固定が抜けて本番エラーに
    ● -> pipenv (2018/7頃〜)
    ○ 2019/5頃〜 dependabotによる更新自動化
    ○ 依存解消やインストールが遅すぎる
    ● -> poetry (2020/3頃〜)
    ○ pyproject.toml に各種設定を寄せる
    依存ライブラリ管理まわりの主な変遷 (例)
    24

    View Slide

  25. ● flake8, coverage
    ● isort, black導入(2018〜)
    ● mypy導入(2018〜)
    ● pyright一部導入(2021〜)
    チェックツールの主な変遷 (例)
    25

    View Slide

  26. ● 最近はフロントエンドをNodejsで作るケースが多くなった
    ○ frontendとbackendで言語が割れたので学習コスト増
    ○ 1アプリ内ににフロント用nodejsとapi用python併用
    ■ multi-stage-docker, 複数コンテナ
    最近よくある構成
    26

    View Slide

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

    View Slide

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

    View Slide

  29. アプリケーションのマルチリージョン化
    29
    Tokyo
    APP
    DB
    US
    internet
    最小数のApp
    DB(読込専用)
    DNS等で切替
    レプリケーション
    別ドメイン
    確認アクセス

    View Slide

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

    View Slide

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

    View Slide

  32. 社内Django templateのTips集
    32

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  41. ● 管理サイトでデータベースの内容を簡単に確認・変更できる
    ● 社内で知見の共有が行いやすい
    ○ ライブラリやディレクトリ構成をほぼ共通にできる
    ● ドキュメントが充実しており、研修にも利用しやすい
    ● DBスキーマ管理まで一元的にできる
    ○ 特にmigrationが行いやすい
    Django 良いなぁと感じるポイント(再)
    41

    View Slide

  42. 42
    一緒にDjangoバックエンドの開発に取り組んでくれる仲間を募集中です
    カジュアル面談から気軽に話しましょう
    https://hack.nikkei.com/
    [PR] 私たちはエンジニアを積極採用中です

    View Slide