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
airClosetを支える技術
Search
Ryosuke Tsuji
March 02, 2016
Programming
2
910
airClosetを支える技術
airClosetのリポジトリの紹介や、商用で使っているnode_modulesの紹介など。
Ryosuke Tsuji
March 02, 2016
Tweet
Share
More Decks by Ryosuke Tsuji
See All by Ryosuke Tsuji
インフラの理想と現実
thujikun
0
1.8k
フロントエンドの未来!?Universal JavaScript
thujikun
2
640
物流のクラウド化
thujikun
0
2.1k
Fashion x Cloud Vision API
thujikun
0
1k
Other Decks in Programming
See All in Programming
Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components
da1chi
3
1.8k
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
390
overlayPreferenceValue で実現する ピュア SwiftUI な AdMob ネイティブ広告
uhucream
0
110
Swift Concurrency - 状態監視の罠
objectiveaudio
2
450
2025年版 サーバーレス Web アプリケーションの作り方
hayatow
23
25k
複雑化したリポジトリをなんとかした話 pipenvからuvによるモノレポ構成への移行
satoshi256kbyte
1
770
実践AIチャットボットUI実装入門
syumai
7
2.5k
クラシルを支える技術と組織
rakutek
0
190
あなたの知らない「動画広告」の世界 - iOSDC Japan 2025
ukitaka
0
380
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
150
そのpreloadは必要?見過ごされたpreloadが技術的負債として爆発した日
mugitti9
2
3k
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
150
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
How to Ace a Technical Interview
jacobian
280
24k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
890
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
20k
Gamification - CAS2011
davidbonilla
81
5.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
A better future with KSS
kneath
239
17k
Why Our Code Smells
bkeepers
PRO
339
57k
BBQ
matthewcrist
89
9.8k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
1 airClosetを ⽀える技術
株式会社エアークローゼット
3 ちょっと待って、 着る服がない… クローゼットの中には 同じデザイン 同じブランドばかり・・・ 忙しくてゆっくりお買い物したり、 試着したりできない…
そんな⼥性のための 4
新感覚オンライン ファッションレンタルサービス 5
airClosetの特徴は? ü オンラインで簡単登録 ü スタイリストが洋服を選定 ü 返却期限なし ü 送料・クリーニング不要 ü
気に⼊ったら購⼊も可能 ü 安⼼な⽉額制(6,800円) 特徴 6
好きな洋服・スタイルやサイズを登録 7 ポイント① オンラインで簡単に登録
8 登録から数⽇待つと、 スタイリストが選定した服が3着⼊ったボックスが届く 洋服との新たな出会い ⾃分では選ばないお洋服も楽しめる ポイント②
返却期限なしで、好きなだけ服を楽しめる スタイリストのおすすめコーデで楽しむ ⼿持ちのお洋服と着合わせてお出かけ 9 ポイント③
気に⼊ったら購⼊もできる 実際に着て⽇常を過ごすことで相性を確認して から購⼊できるため失敗しない 10 ポイント④
返送⽤伝票を張って、 返却するだけだから簡単 クリーニング不要 11 ボックスに再度服を⼊れ返却するのみ ⇨返却後数⽇中にまた別のボックスが届く 返送料無料 ポイント⑤
12 利⽤料⾦は安⼼の⽉額制 6800円 ポイント⑥ 何度でも交換可能 1か⽉単位での⾃動継続
13 物流・倉庫オペレーションでは寺⽥倉庫様と連携 商品⼊庫から、保管、出庫、戻り品の管理までを、 全⾯的なアライアンス先である寺⽥倉庫様と共同で実施 システム的にも常時API連携して 商品の発送やステータスの管理を⾏っている。
企業情報 ü 2014年7⽉創業 ü 従業員数:20名程度 ü エンジニア⽐率:30%程度(6名) ü 男⼥⽐5:5 14
15 ⾃⼰紹介 執⾏役員CTO 元Sier && 元楽天 JavaScript(Node.js含む) / ruby /
Python / SQL / Java / PHP ランニングプログラマー フルマラソン3時間19分 辻亮佑 @thujikun
AWS構成図 16 virtual private cloud Availability Zone 1 Availability Zone
2 ・・・ ・・・ Web/App Server Web/App Server Replication(Multi-AZ) Replication(Multi-AZ) ElastiChache ElastiCache User CloudWatch Log Stream Developer APM Service Metricks Alarm Monitoring Static Contents S3 bucket RDS(Master) RDS(Slave)
システム情報 ここで問題です。 17
システム情報 airClosetの repository数は いくつ? 18
システム情報 19 A) 3 B) 7 C) 11 D) 17
ヒント1:サービスインした頃(昨年の今頃)はひとつ。 ヒント2:平均エンジニア数は3名程度。
システム情報 20
システム情報 正解は… 21
システム情報 C 22
リポジトリ情報 1つめ 23
お客様向けWeb 環境:rails DB:mySql, mongoDB cache: memcache 本番環境:nginx -> unicorn ->
rails お客さま向けに公開しているWebサイト。 オフショアで作った経緯があり、ちょっとこおばし い。 24
リポジトリ情報 2つめ 25
お客様向けWebの静的ページ 環境:nunjucks / stylus / javascript 本番環境:nginx -> s3 その他:gulp,
webpack お客様向けWebサイトのうち静的なページは別プロ ジェクトで管理しs3で公開。 簡単に更新可能なのと、railsと切り離したかった。 26
リポジトリ情報 3つめ 27
倉庫連携バッチ 環境:rails DB:mySql 本番環境:whenever -> cron アイテムの送付や返却、検品の確認等を寺⽥倉庫と 連携するためのバッチ処理。 寺⽥倉庫側でAPIが整備されているので、それを利 ⽤。
28
システム情報 4つめ 29
内部向け管理Web 環境:node / express / java / stylus / angular
DB:mySql, mongoDB cache: redis 本番環境:nginx -> forever その他:grunt, webpack スタイリスト、調達、CS、オペレーターが使う管理 画⾯。 最初スタイリスト向けにつくっていたものを徐々に 拡張してきていて、どこかで分けたいと思案中。 30
リポジトリ情報 5つめ 31
各種オペレーション処理 環境:node DB:mySql cache: redis 本番環境:node-schedule -> cron ヒューマンエラーがないかどうかの確認や、⼀⻫ メール配信、リリースの処理などその他オペレー
ション処理を実⾏する。 1度きりのものや、cronに登録するものがある。 32
リポジトリ情報 6つめ 33
slack bot 環境:node / hubot DB:mySql 本番環境:forever 簡単なユーザ情報の確認やエラーログの通知、ユー ザの登録通知や返却の監視など縦横無尽に活躍。 UIを⾃分でつくる必要がないので簡易なシステムで
あればおすすめ。 外部のスタイリストさんもみんなslack使ってもらっ ている。 34
リポジトリ情報 7つめ 35
メールサーバ監視 環境:node DB:mySql 本番環境:pm2 ユーザからお問い合わせのメールアドレスへ届いた メールを監視し、システムに取り込む。 最終的には本⽂解析して、仕分けできるような状況 にしたい。 36
リポジトリ情報 8つめ 37
iOSアプリ 環境:swift / cocoaPods airClosetのiOSアプリ。 まだリリースしておらず⽬下開発中。 38
リポジトリ情報 9つめ 39
APIサーバ 環境:node / koa DB:mySql, mongoDB cache: redis その他:gulp, babel,
swagger ⽬下開発中のiOSアプリ⽤のAPIサーバ。 Webもこちらをベースにreplace予定。 swaggerコメントを使って、APIの実⾏環境だけで なく、validationも実⾏できるようにしている。 40
リポジトリ情報 10こめ 41
解析サーバ 環境:python / pyramid DB:mySql, mongoDB cache: redis その他:mecab /
openCV ユーザの書いたフィードバックの解析や、画像の⾊ 判定など。 今後はフィードバックからの感情分析や、アイテム 画像からの⾃動ラベリング等を実装していきたい。 42
リポジトリ情報 ラスト11こめ 43
設定情報 環境:json DBの接続情報や、複数のシステムにまたがって使⽤ する定数、i18nの⾔語ファイルなどの設定をjsonで 管理。 各repositoryからsubmoduleで読み込み、それぞれ importして使うミドルウェアを作成。 便利だがsubmoduleはちょっと⾯倒だったりもする。 44
submoduleあるある 45 • commit対象から漏れやすい。 • pull requestをかいくぐれる。 • submodule update忘れ。
• よくconflictする。
submoduleあるある 46 A C B submodule
submoduleあるある 47 課題はあるけど使った ほうがいいよ!
リポジトリ情報 おまけ 48
New ユーザWeb 環境:nunjucks / stylus / React 本番環境:nginx -> s3
その他:gulp, babel, webpack 前述したとおりAPIサーバを⽤いて、ユーザ側もリ ニューアル予定。 シングルページアプリケーションをReact、React Router等を⽤いてつくる予定。 49
システム情報 50 65% 30% 3% 2% 言語比率 node ruby python
Java
マイクロサービス化の利点と課題 マイクロサービス化 の利点と課題 51
利点 52 • トレンドを追いやすい。 • タスクの分担がしやすい。 • 障害発⽣の影響範囲が⼩さい。
トレンドを追いやすい 53 • ⼩さい単位で新しい環境を増やし ていくため、最⼩限の構成で環境 構築できる。 -> 新技術試しやすい。
タスクの分担がしやすい 54 • そもそもリポジトリが異なるため、 タスクごとにconflictする可能性 が低い。 -> タスクの分担しやすい。
障害発⽣の影響範囲が⼩さい 55 • ひとつサービスが⽌まってもサー ビス全体は⽌まらない。 • 障害発⽣ポイントの特定が容易。 ->障害発⽣の影響範囲が⼩さい。
課題 56 • 環境ごとに設定が異なる。 • DB構成とか、model管理が雑多。 • インスタンスが⼤量に。
環境ごとに設定が異なる 57 • ⾔語やフレームワーク、タスクラ ンナー等が環境ごとに異なる。 -> READMEに書くのを徹底。
DB構成とか、model管理が雑多 58 • リポジトリは異なるけど⾒てる DBは⼀緒。Modelの定義もそれ ぞれの環境で必要。 -> マイグレーションはrailsで⼀元 管理。model定義はJSONから各種 ⾔語、フレームワークへのコンバー
タつくりたい。(つくれてない)
インスタンスが⼤量に 59 • それぞれ別々にインスタンスが ⽴っているため、インスタンスが どんどん増えていく。 -> デプロイの⾃動化等で対応した い。お⾦は仕⽅がない。
マイクロサービス化の利点と課題 60 完璧なマイクロサービスなどといっ たものは存在しない。完璧なゴッド クラスが存在しないようにね。
node_modulesの紹介 node_modulesの紹介 61
Sequelize Sequelize 62
Sequelize 63 • nodeのRDS向けORM。 • json形式でjoinやwhere等を指定。 • すごいスピードで開発されてる。
Sequelize 64 フィールド定義 relation設定 時刻fieldがsnake_case
Sequelize 65 取得フィールド指定 Where句指定 joinの設定
Sequelize 66 sequelize-redis-cache • 簡単な設定でredisをcacheとして使える。 • cacheの⽣存期間の指定やrefreshも可能。 • 取得結果のobjectがDBから取得した場合と異な る。
Sequelize 67 Sequelize-redis-cacheの読み込み Sequelizeとredisをつなげる cacheから取得 cacheの⽣存期間は5秒
Sequelize 68 • active_recordよりわかりやすい。 • selectで取得するfield指定が楽に できるのはよい。 • cacheもある。(※star少なめ) •
とはいえ複雑なSQL書こうとする と逆にわかりづらくなる。ORM の宿命?
log4js log4js 69
log4js 70 • log4jのnode版。 • express, koa, Sequelize等のlog 出⼒にも使える。 •
ログローテーションの設定が楽。
log4js 71 ログ形式定義 ログ種別設定 出⼒対象のログレベル指定
log4js 72 bindしてthisを変更する必要あり。 koaでaccess logを出したい場合は ⾃前でgeneratorを⽤意する必要がある
log4js 73 • Koaのloggerに使う場合はミドル ウェアは⾃前で⽤意する必要あり。 • Sequelizeのlogger設定もちょっ と⼯夫が必要。 • ログローテーションまでやってく
れるので便利。
Swagger Swagger 74
Swagger 75 • API実⾏環境兼ドキュメント作成 をやってくれるOSS。 • アノテーションから↑をやってく れる。 • 昨年11⽉にOpen
API Initiative でも採⽤決定!
Swagger 76 • swagger-jsdoc • swagger-injector • swagger-ui • swagger-validate
Nodeでswaggerを使う場合、下記3つ+1を組み合わせると楽。
swagger-jsdoc 77 javascriptで書かれたファイルのswaggerコメントを解析し、 json形式の設定へ変換してくれる。 yaml形式 json形式
swagger-injector 78 json形式のswaggerの設定からAPI実⾏環境を構築。 expressとkoaに対応している。 Swagger定義の 設定と読み込み koa上のURLを指定 swagger-uiの置いてあるディレクトリの指定
swagger-ui 79 Swaggerのフロント側のソースコード。ログイン認証が 必要な場合や、staticファイルの読み込み部分は⼀部コード を書き換える必要あり。 デフォルトだとapi_keyっていう名前でquerystringに追加する だけになっているので、認証⽅式によってどこにセットするか を変更する必要あり。
swagger-ui 80 integerで指定したパラメータでも、content-typeが application/x-www-form-urlencodedになっているため、 サーバ側に⽂字列で渡されてしまう。 パラメータの定義が数値系の場合、Number型にcast。
swagger-validate json形式のswaggerの設定から実際のrequest、responseの validationをやってくれる。 validationもSwaggerから!
Swagger 82 • 誰でも使えるAPI実⾏環境つくれ る! • テストにも使える! • API実⾏環境にもテストにも使う ことでメンテが必ず⾏われる!
Jwt-simple jwt-simple 83
jwt-simple 84 • Json web tokenのencode、 decodeに特化したその名の通り simpleなmodule。 • simpleなため他のモジュールと
組み合わせて使いやすい。 • hokacchaさんがつくってる。
jwt-simple 85 ⾮常にsimpleなインターフェース。 json-web-tokenはtoken⾃体にjson形式で情報を持たせる ことができるtoken。 encode decode
その他 86 • co-supertest -> APIテスト⽤ • babel -> ES
Next先取り • babel-plugin-module-alias -> importのpathのalias • koa-bearer-token -> oAuth標 準の認証に準拠するのに使う
今後の展望 今後の展望 87
今後の展望 ⾔語やフレームワークは所詮ツール。 何を使うかはこだわりなく、適材適所で選択してい く。 88
今後の展望 89 airClosetではインフラからバックエン ド、フロントエンドまで幅広い開発を やっていきたいエンジニア募集中!
半歩先の新しいライフ スタイルとして、 これまでにないワクワク するファッションとの 出会い方を創造します Thank you. 90