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
860
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
590
物流のクラウド化
thujikun
0
2k
Fashion x Cloud Vision API
thujikun
0
960
Other Decks in Programming
See All in Programming
Remix on Hono on Cloudflare Workers
yusukebe
1
310
C++でシェーダを書く
fadis
6
4.1k
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
260
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
6
1.6k
Outline View in SwiftUI
1024jp
1
340
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
1.1k
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
1
210
Contemporary Test Cases
maaretp
0
140
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
350
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
The World Runs on Bad Software
bkeepers
PRO
65
11k
The Pragmatic Product Professional
lauravandoore
31
6.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Six Lessons from altMBA
skipperchong
27
3.5k
Making Projects Easy
brettharned
115
5.9k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Into the Great Unknown - MozCon
thekraken
32
1.5k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
Building an army of robots
kneath
302
43k
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