Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
November 12, 2022
Technology
3
1.5k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
November 12, 2022
Tweet
Share
More Decks by bungoume
See All by bungoume
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.2k
Password Hashing djangocongress 20180519
bungoume
5
3.2k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
28
10k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1k
Kibanaで秒間1万件のアクセスを可視化した話/nikkei-kibana-loganalyst2015
bungoume
20
16k
uwsgi-docker-pycon2015
bungoume
11
55k
Ansibleを結構使ってみた/ansible-nikkei-2015
bungoume
32
14k
Dynamic Inventoryと参照変数
bungoume
2
4.4k
Other Decks in Technology
See All in Technology
スタメンのLeSSの導入と 事業部全体を巻き込んだ アウトカム文化への道のり
uuushiro
2
3k
PCI DSS に準拠したシステム開発
yutadayo
0
170
ついに来る!TypeScript5.0の新機能
uhyo
16
8.6k
FlexScan HD2452Wの 後継を探して
tring
0
160
1つのアプリを開発する複数の職能横断チームの運用と今後 ~ タクシーアプリ「GO」の現状と未来 ~
takahia1988
1
3.3k
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
dzeyelid
0
150
Astroで始める爆速個人サイト開発
takanorip
12
8.2k
Startup Studio Sereal / Culture Deck
sereal
0
590
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
5
1.1k
ひとりで書ける! 日英文章作成のコツ / Do-it-yourself! - Tips for writing in Japanese-English
line_developers
PRO
1
390
本社オフィスを移転し、 オフィスファシリティ・コーポレートIT を刷新した話
rotomx
3
1.1k
チケットNFTの仕組み
sbtechnight
0
320
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
22
42k
Designing Experiences People Love
moore
130
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
32
6.7k
4 Signs Your Business is Dying
shpigford
171
20k
Robots, Beer and Maslow
schacon
154
7.3k
Mobile First: as difficult as doing things right
swwweet
213
7.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
7
560
No one is an island. Learnings from fostering a developers community.
thoeni
12
1.5k
Code Reviewing Like a Champion
maltzj
508
38k
The Straight Up "How To Draw Better" Workshop
denniskardys
225
130k
YesSQL, Process and Tooling at Scale
rocio
159
12k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
10
1.3k
Transcript
日経電子版でのDjango活用事例紹介 DjangoCongress JP 2022 Yuri Umezaki 2022/11/12
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) internet BFF(アプリ) CDN(Fastly) BFF(web) CDN(Fastly) API基盤 ID基盤 検索API
レコメンド メール バナー 記事保存 ランキング 動画・音声 7
電子版の構成図 CDN(Fastly) internet BFF(アプリ) 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で防ぐために 10 CDN(Fastly) internet BFF(アプリ)
• 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
20 Djangoを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.11 21
deprecation warningに定期対応しておくと比較的容易に更新できる https://docs.djangoproject.com/ja/4.1/internals/deprecation/ • Python2系の互換削除による変更 • セキュリティ強化に伴う設定追加 • Middleware更新 •
urlsの変更 • JSONField追加 • timezone周りの変更, pytz削除 Django 1.7 -> 4.1 22
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
• 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 サービス安定化に向けてアプリケーションのマルチリージョン化 直近で実施したアーキテクチャ変更事例
アプリケーションのマルチリージョン化 28 Tokyo APP DB US internet APP DB 同じ構成を用意
DNS等で切替
アプリケーションのマルチリージョン化 29 Tokyo APP DB US internet 最小数のApp DB(読込専用) DNS等で切替
レプリケーション 別ドメイン 確認アクセス
• DBはリードレプリカであり、書込出来ない ◦ 管理画面(Django admin)にもログインできない バックアップリージョン利用時の問題点 30
• Djangoのsined_cookie sessionを活用する 解消 31
社内Django templateのTips集 32
• 外部通信でhttpsを利用するときはConnectionを使い回すべし ◦ TLS接続はCPU負荷が高い ◦ PoolするだけでCPU使用率1/3に Tips 33
• uWSGIで設定を環境変数で指定できるように ◦ メモリ量に合わせて変更が容易 Tips 34
• uWSGIのログはLTSV出力して分析しやすく Tips 35
• urls.py のpathに該当するか出力すると便利 Tips 36
nginxを挟むときは接続上限数を入れる → アクセス過多時は即時エラーを返す → 処理が詰まっても長期で影響が広がらない Tips nginx.conf の一部抜粋 37
• 共通のGitHub Actionsを利用してdeployを簡潔に記述 Tips 38
39 • 性能改善効果が大きい箇所の最適化 • 型定義の強化 • 管理サイトのアカウントを社内ADに寄せる 今後進めたいこと
• 日経電子版の紹介 • 社内でのDjango事例 • 教育 • Djangoを7年(1.7から4.1)使っての変遷 • アプリケーションのマルチリージョン化紹介
• Tips • 今後について まとめ 40
• 管理サイトでデータベースの内容を簡単に確認・変更できる • 社内で知見の共有が行いやすい ◦ ライブラリやディレクトリ構成をほぼ共通にできる • ドキュメントが充実しており、研修にも利用しやすい • DBスキーマ管理まで一元的にできる
◦ 特にmigrationが行いやすい Django 良いなぁと感じるポイント(再) 41
42 一緒にDjangoバックエンドの開発に取り組んでくれる仲間を募集中です カジュアル面談から気軽に話しましょう https://hack.nikkei.com/ [PR] 私たちはエンジニアを積極採用中です