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
580
物流のクラウド化
thujikun
0
2k
Fashion x Cloud Vision API
thujikun
0
960
Other Decks in Programming
See All in Programming
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
3
280
生成 AI を活用した toitta 切片分類機能の裏側 / Inside toitta's AI-Based Factoid Clustering
pokutuna
0
550
役立つログに取り組もう
irof
25
8.3k
CSC305 Lecture 13
javiergs
PRO
0
120
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
120
讓數據說話:用 Python、Prometheus 和 Grafana 講故事
eddie
0
340
offers_20241022_imakiire.pdf
imakurusu
2
350
PagerDuty を軸にした On-Call 構築と運用課題の解決 / PagerDuty Japan Community Meetup 4
horimislime
1
110
RailsのPull requestsのレビューの時に私が考えていること
yahonda
5
1.6k
Amazon Neptuneで始めてみるグラフDB-OpenSearchによるグラフの全文検索-
satoshi256kbyte
4
310
Pinia Colada が実現するスマートな非同期処理
naokihaba
2
130
AWS IaCの注目アップデート 2024年10月版
konokenj
3
2.8k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Into the Great Unknown - MozCon
thekraken
31
1.5k
The Invisible Side of Design
smashingmag
297
50k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.6k
Being A Developer After 40
akosma
86
590k
Documentation Writing (for coders)
carmenintech
65
4.4k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
355
29k
Fireside Chat
paigeccino
32
3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
46
2.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
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