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
880
airClosetを支える技術
airClosetのリポジトリの紹介や、商用で使っているnode_modulesの紹介など。
Ryosuke Tsuji
March 02, 2016
Tweet
Share
More Decks by Ryosuke Tsuji
See All by Ryosuke Tsuji
インフラの理想と現実
thujikun
0
1.7k
フロントエンドの未来!?Universal JavaScript
thujikun
2
600
物流のクラウド化
thujikun
0
2k
Fashion x Cloud Vision API
thujikun
0
970
Other Decks in Programming
See All in Programming
functionalなアプローチで動的要素を排除する
ryopeko
1
930
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
190
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
1
3.3k
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
240
CloudNativePGがCNCF Sandboxプロジェクトになったぞ! 〜CloudNativePGの仕組みの紹介〜
nnaka2992
0
190
watsonx.ai Dojo #6 継続的なAIアプリ開発と展開
oniak3ibm
PRO
0
270
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
4.2k
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
140
Alba: Why, How and What's So Interesting
okuramasafumi
0
240
Flatt Security XSS Challenge 解答・解説
flatt_security
0
1.1k
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
12
6k
盆栽転じて家具となる / Bonsai and Furnitures
aereal
0
2.2k
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
74
9.2k
GraphQLとの向き合い方2022年版
quramy
44
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
BBQ
matthewcrist
85
9.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
20
2.4k
RailsConf 2023
tenderlove
29
980
Faster Mobile Websites
deanohume
305
30k
Designing for humans not robots
tammielis
250
25k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
What's in a price? How to price your products and services
michaelherold
244
12k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.3k
A designer walks into a library…
pauljervisheath
205
24k
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