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
PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / n...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yosuke
September 21, 2016
Technology
18k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / nikkei microservice
Yosuke
September 21, 2016
More Decks by Yosuke
See All by Yosuke
ユニークユーザー数 45万人を超えた Ask! NIKKEIの成功と AIプロダクト開 発の勘所 / Ask! NIKKEI 2026-02
yosukesuzuki
0
91
ONA20 presentation: How Nikkei improves user retention through consultation
yosukesuzuki
1
420
How Nikkei improves user retention with new subscriber consultation
yosukesuzuki
0
480
創業140年の古い会社でデータの民主化を進めた話 / nikkei data driven 20180823
yosukesuzuki
17
25k
Google App Engine の日経での利用事例 / appengine at nikkei
yosukesuzuki
5
2.4k
Development and Infrastructure for Microservice Architecture
yosukesuzuki
0
1.2k
5 years with Google App Engine
yosukesuzuki
2
2k
日経電子版 開発内製化の取り組み / nikkei web development 2015
yosukesuzuki
54
37k
Other Decks in Technology
See All in Technology
AI時代におけるテストの基礎の再定義 / Rethinking the Fundamentals of Testing in the AI Era
mineo_matsuya
15
6k
VPCセキュリティ対応の最新事情
nagisa53
1
340
データエンジニアこそ組織のオントロジーに向き合うべき — 問いに答えるAIから、事業を動かすAIへ
gappy50
4
1.1k
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
230
変更し続けられるシステムをどう保つか — AI時代のSSoTという設計原則
kawauso
1
1.5k
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
240
論語・武士道・産業革命から見る かわるもの、かわらないもの
ichimichi
8
1.5k
エンタープライズデータへ安全につなぐ Production-ready なエージェント設計 ― AI × MCP リファレンスアーキテクチャ ― #AIDevDay
cdataj
1
190
オートマトンと字句解析でRoslynを読む
tomokusaba
0
110
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
400
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
7
1.7k
人手不足への挑戦:車両保全を支えるIoTとクラウド内製化の道【SORACOM Discovery 2026】
soracom
PRO
0
150
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Why Our Code Smells
bkeepers
PRO
340
58k
Un-Boring Meetings
codingconduct
0
350
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Test your architecture with Archunit
thirion
1
2.3k
Code Review Best Practice
trishagee
74
20k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Mind Mapping
helmedeiros
PRO
1
290
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Transcript
1 PythonでもPythonじゃなくても使える汎用 的なMicroservice実行環境 PyConJP2016 Yosuke Suzuki Nikkei Inc. Development and
Infrastructure for Microservice Architecture
About me Engineer at Nikkei Inc. 2 Yosuke Suzuki @yosukep
Python, Golang, JavaScript ウェブの運用とか編集者とか記者の仕事歴も長い
スポンサーしてます! 3
日経電子版について 4 • 2010年3月に創刊 • 有料会員48万人以上 のニュースサービス • 月間アクセス3億件
日経電子版の開発チーム 5 • API開発 • モバイルアプリ • ブラウザー向け • インフラ
• データ分析 内製での開発体制を強化、エンジニアを絶賛採用中
FinancialTimesとの連携 6 • 2015年12月買収 • 開発ノウハウの共有 • 英語力++ 英語をコミュニケーションの主言語として使うチームもある
本題 7
Microservicesとは 8 • サイズが小さい✔ • 自律的に開発が可能✔ • 独立してデプロイが可能✔ • デプロイやビルドプロセスの自動化✔
• 分散化する、中央集権化しない O’Reilly: Microservice Architectureより
日経電子版ではGateway方式を採用 9 Cache/router (Fastly) UI service UI service Internet API
gateway Search Content Auth DNS (Internal / Route53) API service API service Image API gatewayが中央集権的ではある
Gateway方式 10 • 認証、認可も担当 ◦ 認可は結局サービス側のレイヤーでやる ことも多い • 概念上はGateway方式でも画像の配信 サービスなどは直接通信
• 旧APIのラッパー的役割も
サイズが小さい✔ 11 • PythonはDjangoベース ◦ 基本的には2−3個のアプリケーションフォ ルダがあるだけ ◦ Gatewayだけはフォルダ多い •
NodeJSはexpressベース ◦ 数百行レベルのコード
自律的に開発が可能✔ 12 • DBなどリソースのシェアはしない ◦ S3を経由してシェアとかはある • サービス間はAPI経由でのやり取り • 基本的にステートレス
• 自律的にできるが、各自バラバラに作ると 非生産的 • 雛形からベースのサービスを作成
雛形からサービスを作成 13
雛形に含まれているもの 14 • requirements.txt • tox.ini ◦ テスト実行とflake8による静的解析 • Djangoアプリケーション
• Dockerfile • ElasticBeanstalkの設定ファイル • CircleCIの設定ファイル など
cookiecutterで対話的に作成 15 pip install cookiecutter cookiecutter gh:Nikkei/django-project-template 対話形式でいくつか値を入力 • repo_name:
GitHub用のリポジトリ名 • project_name: Djangoプロジェクトの名前 • subdomin: サーバーのサブドメインに使用する文字列 • short_description: リポジトリの一行での説明
雛形への追随 16 pip install git+https://github.com/hirokiky/cookiepatcher cookiepatcher • レガシー化させない • KYさん作
• 最新のテンプレートに追随 ◦ Djangoなどのライブラリのアップデート • cookiepatcher.jsonで差分を管理
Private PyPI 17 • 各サービスで使う固有の処理を共通化 ◦ 記事のIDの変換 ◦ CMS独自の専用タグの置き換え処理 requirements.txt:
--extra-index-url https://xxx.x/xxxxx/packages/simple/ nikkei-utils==0.6 PyPIの自社専用版、各リポジトリでのコードの重複を避ける
Private PyPI (2) 18 1. python setup.py sdist を実行 2.
dist/ 以下にできた xx.0.1.tar.gz のようなファイルを packages リポジトリの 指定ディレクトリにコピー 3. ファイルを add してpushするとCircleCIから自動でアッ プロードされる 通常のPyPIへの登録とやることはあまり変わらない
Private PyPI (3) 19 各アプリで呼び出し from nikkei_utils.kiji import extract_snippet from
nikkei_utils.region import region_info def hoge(): snippet = extract_snippet(article.body)
NodeJSアプリの場合はPrivate npm 20 package.json: "dependencies": { "@nikkei/nikkei-ui": "^6.2.0", "@nikkei/rnikkei-express": "^2.32.2",
"denodeify": "^1.2.1", "dom-delegate": "^2.0.3", "express-validator": "^2.20.8", "open-graph-scraper": "^2.2.2" } privateなnpmサーバーから社内専用の共通ライブラリを取得できる
ローカル開発環境 21 • API開発なら特に問題なし ◦ python manage.py runserver ◦ Dockerも使わなくていい
◦ 単独で動作確認しやすい • フロントエンド開発の時はややこしい ◦ ルーティングの際に一部のドメインをロー カルに振り向ける
みんな大好きRest Framework 22 • Django Rest Framework • Django Rest
Framework Swagger Python/DjangoでAPI作るなら圧倒的な生産性
Rest Framework(2) 23 class FeedAnArticleView(APIView): http_method_names = ['get'] permission_classes =
(IsAuthenticated,) def get(self, request, kiji_id_raw): """ # 検索エンジン用フィード --- parameters: - name: kiji_id paramType: path description: 対象の記事ID """ article = Article.objects.get(kiji_id_raw=kiji_id_raw, status=Article.POST) return Response(data={'article': feed_article_mapper(article)})
独立してデプロイが可能✔ 24 • サービスごとにインフラは 完全分離 • ElasticBeanstalk+Docker のアプリとして稼働 • スケールアウトも容易
デプロイやビルドプロセスの自動化✔ 25 masterブランチが開発系に、deployment/productionブランチが本番系に
ElasticBeanstalk(ebコマンド)の課題 26 • 開発系と本番系の設定ファイル (Dockerrun.aws.json)を分けられない • Blue/Greenデプロイメントできない
そこで ebi コマンド 27 pip install ebi ebi deploy <app_name>
<env_name> • KYさん作 • Dockerrun.aws.jsonを環境(本番・開発)に 合わせて分けられる • Blue/Greenデプロイが可能
CircleCIの設定ファイル 28 - sudo pip install --ignore-installed awsebcli - sudo
pip install -U ebi - aws configure set aws_access_key_id $PROD_AWS_ACCESS_KEY_ID - aws configure set aws_secret_access_key $PROD_AWS_SECRET_ACCESS_KEY - aws configure set default.region ap-northeast-1 - aws configure set default.output json - ebi bgdeploy app-name env-name-blue env-name-green cname_prefix --profile default --noswap --region ap-northeast-1 --dockerrun Dockerrun.aws.prod.json - sleep 10 - sudo pip install -r e2etests/requirements.txt - py.test e2etests/tests.py - eb swap env-name-blue --profile default --destination_name env-name-green
バッチ処理 29 Docker アプリコンテナ Docker アプリコンテナ Rundeckでのバッチ処理は ElasticBeanstalkにデプロイ しているものがそのまま使え る
Spotインスタンス Docker アプリコンテナ
Rundeck 30 Dockerコンテナを定期タスクで実行
監視、エラーログ 31 • アプリとは別コンテナーのfluentdでログを 収集 ◦ github.com/bungoume/log-sender • Sentryでエラーログを収集 •
New Relicでメトリクスデータを収集 • CloudWatch すべて同じパターンに共通化
ログの集約 32 各サービス Docker アプリコンテナ Docker fluentd コンテナ ログ集約サービス
障害対応 33 Slackに通知ししつつ、対応が必要な障害はPagerDuty経由で電話呼び出し
かなり幅広く適用可能なインフラ 34 • Djangoアプリ • NodeJS(express)アプリ • WordPress • Rundeck
• Jenkins • Kibana • Nginx+プラグイン 日経電子版でこれまで実績のあるパターン
クラウドの乗り換えもしやすい(はず 35 FinancialTimes社のNodeJSのアプリはHeroku上で運用 同じものがアプリの変更なく、ElasticBeanstalk環境で動かせた
課題 36 • スケールアウトは起動的ではない ◦ 想定以上のスパイクが来ると間に合わない ◦ 予測可能場合はスケジューリングして増やす • マメにメンテは必要
◦ Djangoは1.7 → 1.10に順次更新 ◦ 定期的にrequirements.txtを更新していく • AWS側のバグと付き合う
Thanks 37 だいたいはこの2人が作ってくれた
Thank you! 38
We're hiring! s.nikkei.com/saiyo Pythonエンジニア (機械学習できるひと歓迎) フロントエンドエンジニア アプリエンジニア デザイナー 39