際際滷

際際滷Share a Scribd company logo
freee 幄塀氏芙?
‐シュ`マイ/Tech Lead Engineerから恷仟室gを僥べRails?
Rails と JSON:API によるマイクロサ`ビスB並箭?
2020.05.13
freeeで6定朕のRailsエンジニア。?
繁並freee、マイナンバ`砿尖freee吉の_kに亊わった瘁、F壓は畠プ
ロダクト慌宥の仝n署児P々_kチ`ムのエンジニアリングマネ`ジャ`。?
?
テクニカルコンサルタントとして凍った議_なビジネス勣周協x薦に紗え、云
|を融くデ`タモデリングスキルと鏡議なソリュ`ションO薦がみ。?
?
晩云に10方繁しか栽鯉宀がいないSalesforceY鯉の恷互桁、SalesforceJ協
テクニカルア`キテクトY鯉も隔つ。?
?
freee 2旗朕賞蹴。?
?
挫きなものはビ`ルと賞繁とSQL。?
?
光Nサ`ビスの id はだいたい yebihara。?
EBIHARA, Yuichiro
今析圻 俛匯隻?
freee幄塀氏芙?
2
3
Railsでの仟・泪ぅロサ`ビスB並箭?
書晩おしすること?
01 嘘尚?
4
Section
5
freeeの仝n署児P々チ`ムとは?
freeeが戻工する光Nプロダクトの?
¢ 弐s砿尖?
¢ 創署麻?
¢ 徨Qg?
のためのシステムを_k?\喘するチ`ム。?
6
freeeは採の氏芙?
麼に?
スモ`ルビジネス鬚韻SaaSプロバイダ`?
¢ 氏freee┠繁鬚 / 繁鬚隠?
¢ 繁並freee?
¢ 氏芙O羨freee?
¢ _Ifreee?
¢ 賦御freee?
¢ プロジェクト砿尖freee?
¢ その麿、謹くのvBサ`ビス?
$ freeeカ`ド、箔ファイナンス、オファ`侏蛮Y、?
I蛮Yfreee、マイナンバ`砿尖freee、freee for Salesforce などなど?
7
¢ ビジネスQ泣?
$ プロダクトが謹い?
$ プロダクトがどんどんえる?
$ 光プロダクトがそれぞれ鏡徭のプランラインナップを隔つ?
* ベ`シックプラン、エンタ`プライズプランなど?
$ ラインナップもどんどん笋錣?
$ @An署と脅業n署が詞壓?
* @An署 = 定Bいや埖Bいのサブスクリプション弐s?
* 脅業n署 = 麗(咫a)や返方創など?
¢ 室gQ泣?
$ プロダクトはだいたいRailsで_k?
$ 鯉燕?弐s砿尖?箔?Qgにはサブスクリプション砿尖 SaaS の Zuora を旋喘?
freeeのn署児Pの蒙?
8
n署児Pチ`ムのミッション?
人とfreee芙坪ユ`ザ`、褒圭にとってのn署UX
貧を宥じてfreeeの、人に曙きやすくすると揖
rに、freeeのビジネスのアジリティ?б耒?伏b來の
鯢呂房柘襪垢襦?
02 システム撹?
9
Section
10
システム撹before?
氏
freee
慌宥n署I尖(gem)
n署UI
ユ`ザ`
Zuoraデ`タ
キャッシュ
繁並
freee
慌宥n署I尖(gem)
n署UI
Zuoraデ`タ
キャッシュ
¢ ポイント?
$ n署UIはプロダクト阿eg廾?
$ }方プロダクト慌宥のn署I尖をgem晒?
$ Zuoraの砿尖するデ`タのうち、光プロダクトが
駅勣なものをそれぞれがロ`カルDBにキャッ
シュ?
¢ n}?
$ 貌たようなn署UIの嶷}g廾?
$ 慌宥n署I尖を俐屎したときの gem アップ
デ`トが中宜?
$ 麿プロダクトの弐s秤鵑硫燐?
$ ユ`ザ`にとって仝畠ての弐s秤鵑鹿sされ
ている侭々がない?
11
システム撹after?
氏freee
gem
ユ`ザ`
繁並freee
Zuoraデ`タ
キャッシュ
仟n署児P
n署UI
API
API
gem
¢ 弐s砿尖?n署vBC嬬を仝仟n署児
P々として鏡羨サ`ビス晒?
$ n署UIの喘來を互めて匯圷晒?
$ n署I尖?ZuoraとのI/Oも匯圷晒?
$ Zuoraデ`タのキャッシュも匯圷晒?
$ 光プロダクトには殆なクライアント gem
を塘る?
12
システム撹after?
氏freee
gem
ユ`ザ`
繁並freee
Zuoraデ`タ
キャッシュ
仟n署児P
n署UI
API
API
gem
¢ 弐s砿尖?n署vBC嬬を仝仟n署児
P々として鏡羨サ`ビス晒?
$ n署UIの喘來を互めて匯圷晒?
$ n署I尖?ZuoraとのI/Oも匯圷晒?
$ Zuoraデ`タのキャッシュも匯圷晒?
$ 光プロダクトには殆なクライアント gem
を塘る?
ここがJSON:API
ここがRails6 + EKS
13
Rails6の駻胆輦?
¢ F佩の慌宥n署I尖のコ`ドを壅旋喘したかった?
$ rg議崙sもしかった?
¢ 輝rのn署児Pチ`ムが恷も母していたのがRailsだった?
¢ _k_兵輝兜、まだRails6は屎塀リリ`スされていなかったが、どうせなら仟しいバ`
ジョンのほうがよいのと、仟n署児P借P2019定10埖までには屎塀リリ`スされる
宥しだった?
EKSの駻胆輦?
$ 蒙にない?
* freee の仟たな淵ぅ鵐侫撹Docker + k8s + EKSに惄辰燭蕕修Δ覆辰?
$ なお、EKS をg虱業襪靴迅邀の芙坪並箭になった?
03 JSON:APIとは?
14
Section
15
JSON:APIとは?
¢ HTTPとJSONを旋喘してデ`タ荷恬を佩うための癖?
$ 巷塀サイト https://jsonapi.org/?
¢ ?なプログラミング冱Z?フレ`ムワ`ク鬚韻離稀`バ`?クライアントg廾が贋壓
匯E?
$ Ruby (Rails) 鬚?
* ActiveModel::Serializers?
* Netflix/fast_jsonapi など?
16
JSON:APIがサポ`トするC嬬?
¢ リソ`スのCRUD荷恬?
$ リソ`スオブジェクトの碧GET?
* フィルタ`訳周峺協?
* ソ`ト?
* リレ`ションシップvBレコ`ドのネスト?
* ペ`ジネ`ション?
$ リソ`スオブジェクトの恬撹POST?
$ リソ`スオブジェクトの厚仟PATCH?
$ リソ`スオブジェクトの茅DELETE?
¢ 荷恬Y惚の宥岑?
$ HTTPステ`タス?
$ エラ`夛悶?
$ メタデ`タ販吭のa怎秤鵤?
荷恬鵐禰`タが ActiveRecord なら、
リソ`ス  テ`ブル
と深えて餓し屶えない。
17
g匯オブジェクトの函誼?
# リクエスト
GET /api/objects/licenses/315
# レスポンス
{
"data": {
"id": "315",
"type": "licenses",
"attributes": {
"company_id": 10,
"source": "zuora",
...
"quantity": 1,
"start_date": "2020-03-31",
"end_date": "2021-03-30",
"created_at": "2020-04-29T15:26:44.502+09:00",
"updated_at": "2020-04-29T15:26:44.502+09:00"
}
}
}
リソ`ス兆?
Re徨?
その麿の奉來?
キ` ^data ̄ の、魯ブジェクト
オブジェクト P レコ`ド?
18
}方オブジェクトの函誼?
# リクエスト
GET /api/objects/licenses?filter%5Bcompany_id%5D=10
# レスポンス
{
"data": [
{
"id": "315",
"type": "licenses",
"attributes": {
"company_id": 10,
...
}
},
{
"id": "317",
"type": "licenses",
"attributes": {
"company_id": 10,
...
}
},
...
]
}
キ` ^data ̄ の、魯ブジェクトの塘双
フィルタ` デコ`ドすると filter[company_id]=10?
オブジェクト?
オブジェクト?
19
JSON:APIの駻胆輦?
¢ Rails なので HTTP + JSON かな、と?
$ いちおうgRPCも篇したが、RailsでのBノウハウがなかったのでやめた?
¢ 鏡徭JSONフォ`マットをOする吭xを湖じなかった?
$ 悲來、屁栽來、來に之ける喪晒井になる辛嬬來が互い?
¢ 屡贋ライブラリの試喘による伏b來鯢?
20
freee 仟n署児PにおけるJSON:APIg廾?
¢ サ`バ`硲仟n署児P?
$ ActiveModel::Serializers (AMS) と徭念g廾を穩?
* AMSは兆念の宥りActiveModelオブジェクトをシリアライズするためのgemで、JSON:APIサ`バ`
としての喘C嬬はほとんどない┘螢エストをデシリアライズするYg廾はちょっとある?
$ リクエストのパ`スとg佩 ★ 徭念g廾?
$ レスポンス伏撹?
* リソ`スg悶がActiveRecord ★ クエリ`Y惚をAMSでシリアライズ?
* リソ`スg悶がZuoraからのJSONレスポンス ★ 徭念でJSON:API侘塀に屁侘?
なぜ徭念g廾?
¢ 輝rは措さげなRails鬚JSON:APIサ`バ`gemがつからなかった?
¢ 匯圭でAMSのシリアライズC嬬は、それだけでも聞いたいと房うほどパワフルだった?
¢ そもそもJSON:APIプロトコル徭悶は曳^議シンプルで、g廾y叟業は互くなかった?
21
freee 仟n署児PにおけるJSON:APIg廾?
¢ クライアント硲┿疵freee、繁並freeeなど?
$ JsonApiClient をラップしたgemを塘下?
* ActiveRecordライクなインタ`フェイス?
* 富ないコ`ディング楚?
* 侏キャストなどのカスタマイズが辛嬬?
* 揖Nの麿のgemに曳べて Star の方が謹かった?
class License < JsonApiClient::Resource
self.site = "http://localhost:3008/api/objects"
end
license = License.where(company_id: 10).first
# 參和のHTTPリクエストがk佩され、レスポンスがActiveModelオブジェクトにQされる
# GET http://localhost:3008/api/objects/licenses?filter%5Bcompany_id%5D=10
license.note = 'TEST'
license.save
# 參和のHTTPリクエストがk佩される┘撻ぅ踪`ドは福待
# PATCH http://localhost:3008/api/objects/licenses/315
04 F彜と書瘁?
22
Section
23
措かったこと?
¢ ビジネスQ泣?
$ 仟・廛蹈瀬トのn署g廾が掲械にスム`ズに?
¢ 室gQ泣?
$ Railsバ`ジョンは仟しいものに泙?
* 蒙にメジャ`バ`ジョンアップはそれなりに返g?
$ JSONフォ`マットでむrgをsできた?
$ RESTに嶢gな匯來のあるAPIOとなった?
* JsonApiClientの試喘があるNの崙sになった?
$ 仟APIエンドポイント恬撹rのクライアント箸鬉掲械にS?
* JsonApiClientのおかげ?
24
逗困靴燭海?
¢ Rails6がなかなか屎塀リリ`スされなかった?
$ 嚠協では4埖挑だったが、gHにリリ`スされたのは8/15だった?
$ いちおうRails5にしてリリ`スもできるよう、Rails6の仟C嬬は聞わずにおいた?
¢ チ`ムにEKS / コンテナ\喘のノウハウが之けていた?
$ 恷除は盾されつつある?
¢ JsonApiClientと麿のgemとの、卆贋Faradayバ`ジョンのコンフリクト?
$ 恷仟のJsonApiClientは曳^議恷除のFaradayバ`ジョンに卆贋しているが、氏freeeで旋喘してい
るeのgem┨鼎瓧が、硬いバ`ジョンのFaradayにしか鬉靴討い覆った?
* JsonApiClientはeにくない?
$ 硬いJsonApiClientバ`ジョンに鏡徭パッチを輝てて?
25
書瘁のn}?
¢ gはまだ氏freeeの仟n署児P卞佩がgんでいない?
¢ それがKわったらプロダクト畠悶のn署UXの鯢呂鳳掌騅妬?
?
仟たな、鯔慥腓戻工?
★ それに栽うをお人から返gなくいただく?
★ 仟たな、夛に誘Y?
★ 恷兜にる?
スモ`ルビジネスを、?
弊順の麼叨に。

More Related Content

2020-05-13 RailsとJSON:APIによるマイクロサ`ビスB並箭