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.8k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
November 12, 2022
Tweet
Share
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.2k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.5k
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
UI State設計とテスト方針
rmakiyama
2
580
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
OpenAIの蒸留機能(Model Distillation)を使用して運用中のLLMのコストを削減する取り組み
pharma_x_tech
4
560
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
310
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
160
権威ドキュメントで振り返る2024 #年忘れセキュリティ2024
hirotomotaguchi
2
740
生成AIのガバナンスの全体像と現実解
fnifni
1
190
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
righttouch
PRO
0
110
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
260
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
3
2.3k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Become a Pro
speakerdeck
PRO
26
5k
Making Projects Easy
brettharned
116
5.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Designing for Performance
lara
604
68k
We Have a Design System, Now What?
morganepeng
51
7.3k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Code Review Best Practice
trishagee
65
17k
Designing Experiences People Love
moore
138
23k
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] 私たちはエンジニアを積極採用中です