Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
Search
bungoume
November 12, 2022
Technology
4
4.7k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
November 12, 2022
Tweet
Share
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.1k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.4k
Password Hashing djangocongress 20180519
bungoume
5
3.9k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
29
11k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1.3k
Kibanaで秒間1万件のアクセスを可視化した話/nikkei-kibana-loganalyst2015
bungoume
20
17k
uwsgi-docker-pycon2015
bungoume
10
59k
Ansibleを結構使ってみた/ansible-nikkei-2015
bungoume
32
15k
Dynamic Inventoryと参照変数
bungoume
2
4.8k
Other Decks in Technology
See All in Technology
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
230
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
200
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
750
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
元旅行会社の情シス部員が教えるおすすめなre:Inventへの行き方 / What is the most efficient way to re:Invent
naospon
2
330
いざ、BSC討伐の旅
nikinusu
2
780
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
170
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
12k
開発生産性を上げながらビジネスも30倍成長させてきたチームの姿
kamina_zzz
2
1.7k
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
73
9.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
Faster Mobile Websites
deanohume
305
30k
The World Runs on Bad Software
bkeepers
PRO
65
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Scaling GitHub
holman
458
140k
Designing Experiences People Love
moore
138
23k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
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] 私たちはエンジニアを積極採用中です