Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

● 可能な限りCDNでキャッシュができるようなAPI構造 ○ JWT利用などの工夫である程度ステートレスに権限判定 ○ Vary, Surrogate-Control (CDN-Cache-Control) の設定(※) ○ Pushピーク時は個人別のデータアクセスを極力減らす ● ETagを活用して通信量削減 ※Djangoの挙動に注意 https://code.djangoproject.com/ticket/32055 負荷をCDNで防ぐために 10 CDN(Fastly) internet BFF(アプリ)

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

20 Djangoを7年間使って

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

社内Django templateのTips集 32

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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