日経電子版でのDjango活用事例紹介DjangoCongress JP 2022Yuri Umezaki 2022/11/12
View Slide
Yuri Umezaki● 検索API (Django, Elasticsearch)● OAuth認可 API基盤(DRF, oauthlib)● アクセスログ分析自己紹介2
● 日経電子版の紹介● 社内でのDjango事例● 教育● Djangoを7年(1.7から4.1)使っての変遷● 直近の開発● Tips● 今後について目次3
1876年(明治9年)12月創刊 約145年の歴史全世界で256万部(紙・電子版の合計)※を発行する世界最大の経済新聞社※2022/7 時点https://marketing.nikkei.com/media/newspaper/mediadata/日本経済新聞社について4
● 全部で70リポジトリ以上○ 電子版API (今回主に説明)○ 法人向けサービス○ 社内ツール○ 検証デモツール○ etc…社内のDjango利用状況5
● 2010年3月創刊● 有料ユーザー79万人● 無料ユーザー 450 万人以上● 月間2億PV日経電子版とは*1 2022/1/1時点https://marketing.nikkei.com/media/web/6
電子版の構成図CDN(Fastly)internetBFF(アプリ)CDN(Fastly)BFF(web)CDN(Fastly)API基盤 ID基盤検索API レコメンド メールバナー記事保存 ランキング 動画・音声7
電子版の構成図CDN(Fastly)internetBFF(アプリ)CDN(Fastly)BFF(web)CDN(Fastly)API基盤 ID基盤検索API レコメンド メールバナー記事保存 ランキング 動画・音声8このあたりがDjango
● API基盤へのアクセス: 2500 req/sec● 稼働インスタンス数: 全体で300台以上○ API基盤は約60台● Push通知直後のアクセス: 数万req/s● CDNキャッシュによりBFFは500rps※t3.smallなど小さいインスタンスを多数動かしています規模感9
● 可能な限りCDNでキャッシュができるようなAPI構造○ JWT利用などの工夫である程度ステートレスに権限判定○ Vary, Surrogate-Control (CDN-Cache-Control) の設定(※)○ Pushピーク時は個人別のデータアクセスを極力減らす● ETagを活用して通信量削減※Djangoの挙動に注意 https://code.djangoproject.com/ticket/32055負荷をCDNで防ぐために10CDN(Fastly)internetBFF(アプリ)
● CI: GitHub Actions● 環境: AWS ElasticBeanstalk (Docker)● アクセスログ: fluentd -> S3, ES+Kibana● アラートログ: Sentry● 監視: バッチサーバ+E2E, StatusCake, PagerDuty基本構成11
● 管理サイトでデータベースの内容を簡単に確認・変更できる● 社内で知見の共有が行いやすい○ ライブラリやディレクトリ構成をほぼ共通にできる● ドキュメントが充実しており、研修にも利用しやすい● DBスキーマ管理まで一元的にできる○ 特にmigrationが行いやすいDjango 良いなぁと感じるポイント12
13● 社内向けツール○ バナー情報管理○ client_id発行管理○ ユーザ管理ツール● 実験的システム○ 本番運用へ移行しやすいDjango管理サイト利用例
● 基盤○ Docker設定○ AWS ElasticBeanstalk等の環境構築, CI設定○ 本番・開発など分けた設定値○ healthcheck pathの用意● ログ設定○ Sentryの設定, uWSGIのアクセスログ設定社内Djangoテンプレート14
新人研修+α● Django公式チュートリアル● PyQ (pyq.jp)● DRFでのAPI開発● Django自体のコードリーディング最近はDjangoの本も多数出てきている。研修15
● DRFでAPIが作成できる● ブログを一通り作ってもらう○ webの理解も進む○ DBのモデル設計● 一人で勉強できるサービス研修16
● Django自体もPythonで読みやすい● 機能に興味を持ったとき調べやすい○ 例: SECURE_SSL_REDIRECTってなんだろう?■ ドキュメントを見る・先輩に聞く■ 挙動を詳しく知りたいときはコードを見る● Djangoを利用したOSSサービスのコードリーディングDjango の学習面メリット17
● SQLAlchemy modelとpydantic modelに慣れるまで混乱しがち?○ 慣れると型定義など便利○ Django+RDBは情報が多く取り掛かりやすい● ディレクトリ構成が人によって結構変わる● (社内のユースケースでは)性能面で極端な差はでなかったFastAPIも試してみたけど18
● DB MigrationはDjangoが楽● 参考実装をDjangoでやり、アクセスが増えたらGoでも用意golangも使い始めているけれど19
20Djangoを7年間使って
Dockerベースなのでライブラリ対応をみて都度更新(毎年10月に公開、翌年4月に更新ぐらいのペース)● 過去○ python:3.5.2-alpine -> python:3.6.4-stretch■ alpineのmuslと一部ライブラリの相性が良くない● ex: uwsgiでharakiriが発生すると詰まる等○ PyPy, Pystonは今は使わず■ 何度か試そうとしたが安定性+CPython新機能を優先Python3.4 -> 3.1121
deprecation warningに定期対応しておくと比較的容易に更新できるhttps://docs.djangoproject.com/ja/4.1/internals/deprecation/● Python2系の互換削除による変更● セキュリティ強化に伴う設定追加● Middleware更新● urlsの変更● JSONField追加● timezone周りの変更, pytz削除Django 1.7 -> 4.122
PBKDF2のイテレーション数→ Djangov4.1で390000 v4.2で480000Python3.7.7 + Django v2.0 => 55msPython3.10.7 + Django v4.1 => 215msDjangoの認証をAPIで利用している人は遅くなっていないか確認をhttps://speakerdeck.com/bungoume/password-hashing-djangocongress-20180519TipsDjangoCongressJP 2018Password Hashingより23
● requirements.txt○ dev環境のパッケージ管理がしにくい○ 孫依存のバージョン固定が抜けて本番エラーに● -> pipenv (2018/7頃〜)○ 2019/5頃〜 dependabotによる更新自動化○ 依存解消やインストールが遅すぎる● -> poetry (2020/3頃〜)○ pyproject.toml に各種設定を寄せる依存ライブラリ管理まわりの主な変遷 (例)24
● flake8, coverage● isort, black導入(2018〜)● mypy導入(2018〜)● pyright一部導入(2021〜)チェックツールの主な変遷 (例)25
● 最近はフロントエンドをNodejsで作るケースが多くなった○ frontendとbackendで言語が割れたので学習コスト増○ 1アプリ内ににフロント用nodejsとapi用python併用■ multi-stage-docker, 複数コンテナ最近よくある構成26
27サービス安定化に向けてアプリケーションのマルチリージョン化直近で実施したアーキテクチャ変更事例
アプリケーションのマルチリージョン化28TokyoAPPDBUSinternetAPPDB同じ構成を用意DNS等で切替
アプリケーションのマルチリージョン化29TokyoAPPDBUSinternet最小数のAppDB(読込専用)DNS等で切替レプリケーション別ドメイン確認アクセス
● DBはリードレプリカであり、書込出来ない○ 管理画面(Django admin)にもログインできないバックアップリージョン利用時の問題点30
● Djangoのsined_cookie sessionを活用する解消31
社内Django templateのTips集32
● 外部通信でhttpsを利用するときはConnectionを使い回すべし○ TLS接続はCPU負荷が高い○ PoolするだけでCPU使用率1/3にTips33
● uWSGIで設定を環境変数で指定できるように○ メモリ量に合わせて変更が容易Tips34
● uWSGIのログはLTSV出力して分析しやすくTips35
● urls.py のpathに該当するか出力すると便利Tips36
nginxを挟むときは接続上限数を入れる→ アクセス過多時は即時エラーを返す→ 処理が詰まっても長期で影響が広がらないTipsnginx.conf の一部抜粋37
● 共通のGitHub Actionsを利用してdeployを簡潔に記述Tips38
39● 性能改善効果が大きい箇所の最適化● 型定義の強化● 管理サイトのアカウントを社内ADに寄せる今後進めたいこと
● 日経電子版の紹介● 社内でのDjango事例● 教育● Djangoを7年(1.7から4.1)使っての変遷● アプリケーションのマルチリージョン化紹介● Tips● 今後についてまとめ40
● 管理サイトでデータベースの内容を簡単に確認・変更できる● 社内で知見の共有が行いやすい○ ライブラリやディレクトリ構成をほぼ共通にできる● ドキュメントが充実しており、研修にも利用しやすい● DBスキーマ管理まで一元的にできる○ 特にmigrationが行いやすいDjango 良いなぁと感じるポイント(再)41
42一緒にDjangoバックエンドの開発に取り組んでくれる仲間を募集中ですカジュアル面談から気軽に話しましょうhttps://hack.nikkei.com/[PR] 私たちはエンジニアを積極採用中です