More Related Content
Similar to Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Similar to Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法 (20)
More from Tomoya Kawanishi
More from Tomoya Kawanishi (20)
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
- 1. Ruby on Rails での
他言語エコシステムとの共存方法
2018年2月23日
エネチェンジ株式会社
チーフエンジニア
Tomoya Kawanishi
- 2. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
1自己紹介
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
エンジニア、積極採用中
Ruby関西の中の人
関西でセミナー形式の勉強会を定期的に開催
発表者として登壇くださる方、あとで声かけください。
関西Ruby会議の開催時はスポンサーも募集!
大手町.rb の中の人
次回、2月27日(火)大手町.rb#4 の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
みんな来てください
- 4. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
エネチェンジの技術スタック 3
気象条件やライフスタイルの違いを考慮した独自
の予測モデルで高精度な消費電力量を予測
気象条件やライフスタイルの違いを考慮した独自
の予測モデルで高精度な消費電力量を予測
予測した消費電力量を元に、各社の電気料金プ
ランに基づいて電気料金を計算
予測した消費電力量を元に、各社の電気料金プ
ランに基づいて電気料金を計算
電気料金の試算、切り替え申込フォームの作成。電気料金の試算、切り替え申込フォームの作成。サーバサイド
(Ruby on Rails)
電気料金計算
(Ruby のライブラリ)
消費電力量予測
(Python製WEB-APIサーバ)
サーバサイドの Ruby on Rails だけでなく、
さまざまな要素技術、コンポーネントを組み合わせて実現
SciPy
JS、フロントエンド
入力フォームの動的な画面制御などで一部、
VueJS を採用
入力フォームの動的な画面制御などで一部、
VueJS を採用
- 5. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
VueJS 導入、採用事例 4
他の入力値に連動して変化する動作が多い
①: 郵便番号を入れると、電力会社の選択値が変
わる (関東エリアなら、東京電力に)
②: プランの候補が変わる。プランのデフォルト値
が設定される。
③: アンペア数のデフォルト値が設定される
④: 設定値に応じて、プランの候補数の値が更新さ
れる
①
②
③
④
⑤
VueJS のフレームワークを採用
- 6. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算 5
時間帯ごと、曜日ごとに単価が複雑に変化する
専用の電気料金計算のライブラリとして分離
例:関西電力の
季時別電灯PS
・ 土日は安く、平日は高い
・ 夜は安く、平日は高い
・ 昼の単価は3段階料金。
(使用量が増えると、
単価が高くなる)
・ 夏には夏季ピークという
特に電気代が高い時間帯あり
- 7. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気使用量の予測システム 6
機械学習(Python)フレームワークで予測システムを構築
お住まいの地域お住まいの地域
SciPy
家族人数家族人数
大家族
一人暮らし
ライフスタイルライフスタイル
昼、夜どちらで電
気を使うか
電気使用量は季節、居住地域、家族人数等に影響される
- 9. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
VueJS 導入以前
Rails の古き良き Asset Pipeline に乗っかっていた
JavaScript
jQuery がメイン。ライブラリは職人が手で置く運用
8
案①: VueJS-Rails
バージョンアップに
追随していけるか不安
案②: WebPacker
webpack の進歩に追随
できるか不安
案③: フロントエンドエコシステム
npm、yarn、BABEL、webpack といった
フロントエンドのエコシステムを直接利用
案③を採用
- 10. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
エネチェンジでの VueJS との付き合い方
あくまで軸足は、Ruby on Rails
メンバーの多くが Rails に慣れており、学習コストを下げたい。
境界領域は、Ruby on Rails 側にできるだけ倒す
例1:digest 付与、minify は Rails/Sprockets 側で処理
例2:VueJS の高度な機能は今のところ使わず
例: Vuex、vue-router 、単一ファイルコンポーネントなど
例3:view 側は普通の erb で記述
9
<script type="text/x-template" id="plans-finder-item-pc">
<%= render 'plans_finder_item_pc' %>
</script>
<script type="text/x-template" id="plans-finder-item-smp">
<%= render 'plans_finder_item_smp' %>
</script>
VueJS はDOM操作等に特化し、学習コストを下げた
- 11. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算の処理の分離
初期の実装
Ruby on Rails と同じレポジ
トリに電気料金計算の処理が
あった
電気料金計算処理を API と
して SaaS 提供を開始
コンポーネントを分割
電気料金計算の処理をライブ
ラリ化
10
電気料金計算含め、
単一レポジトリ
エネチェンジ本体
(Ruby on Rails)
電気料金計算
(Ruby のライブラリ)
- 12. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算を分離するときの考え方
将来の変更容易性の確保が第一
将来、何が起こるかは予測できない
将来に禍根を残さないことを第一に設計
疎結合とは
呼び出し元に要求される知識が少ないほどより疎結合
疎結合であることで、より変化に強くなる
境界が明確になり、変更時の影響調査しやすくなる
自動テストを書きやすくなる
チーム間のコミュニケーション、システム間の調整コストが減る
11
- 13. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
マイクロサービス案の検討 12
小規模な WEBサービスを組み合わせる開発手法小規模な WEBサービスを組み合わせる開発手法
マイクロサービスとは
マイクロサービスのメリット
堅固かつ明瞭
な境界
異種技術(言語、
DB)を混在可能
サービス単位の
きめ細かい性能強化
チーム間のコミュニケー
ションコストの低減
必要
今すぐは
不要
今すぐは
不要
今すぐは
不要
マイクロサービス自体は採用しないが、
堅固かつ明確な境界は作り、
必要なときにマイクロサービス化可能なように設計
- 14. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
Rubyライブラリとして分離 13
電気料金計算
(Ruby のライブラリ)
エネチェンジ本体
(Ruby on Rails)
ActiveRecord
オブジェクト
ActiveModel
オブジェクト
PostgreSQL
DBアクセスはエネチェンジ本体だけが行う。
(ライブラリ側ではDBアクセスはしない)
DBアクセスはエネチェンジ本体だけが行う。
(ライブラリ側ではDBアクセスはしない)
ライブラリ側で必要となる単価情報等のすべ
てのデータをシリアライズ
ライブラリ側で必要となる単価情報等のすべ
てのデータをシリアライズ
引数、返り値ともにJSON で表現できる型
だけで構成されたオブジェクト
※ Hash、Array、String、Numeric など
引数、返り値ともにJSON で表現できる型
だけで構成されたオブジェクト
※ Hash、Array、String、Numeric など
受け取ったデータを元に料金試算処理受け取ったデータを元に料金試算処理
マイクロサービス化を意識した Ruby ライブラリとして分離
DBアクセスの
集中管理
ライブラリの
ステートレス化
デプロイの複雑
さを回避
疎結合さの向上
同一Unicorn プロセス
単なる Rubyライブラリなので、同一の
Unicorn プロセス上で実行される
単なる Rubyライブラリなので、同一の
Unicorn プロセス上で実行される
パフォーマンス
向上
将来のマイクロ
サービス化を意識
- 15. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
Python 製電気使用量予測システムとの連携
Ruby (Rails)と Python(Flask)を 同じサーバに配置
別のサーバに配置するよりも下記の観点で優れると判断
運用性
経済性
性能向上
14
電気料金計算
(Ruby のライブラリ)
電気使用量予測
(Python製WEB-APIサーバ)
Flask
SciPy
エネチェンジ本体
(Ruby on Rails)
HTTP /
WEB-API
HTTP /
WEB-API
予測
モデル
同一サーバ上
Unicorn
- 16. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
git submodule の配置 15
エネチェンジ本体
(Ruby on Rails)
電気料金計算
(Rubyのライブラリ)
電気使用量予測
WEB-APIサーバ
(Python, Flask)
電気使用量予測
ライブラリ
(Python ライブラリ)
Git Submodule の配置 実際の依存関係
エネチェンジ本体
(Ruby on Rails)
git submodulegit submodule はフラットに配置し、運用性を向上
電気料金計算
(Rubyのライブラリ)
電気使用量予測
WEB-APIサーバ
(Python, Flask)
電気使用量予測
ライブラリ
(Python ライブラリ)
・ ディレクトリ、ネスト関係が深くなると、運用性が低下する
・ 現在の依存関係が将来にもわたって同じである保証はなく、
フラットとする方が修正・変更を実施しやすいと判断した
- 17. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
まとめ
3つの部品の連携等を説明しました
Ruby on Rails プロジェクトに VueJS を導入した話
Ruby on Rails で作っていた電気料金試算の部品を
Ruby ライブラリとして分割した話
Python で作られた電気使用量予測のシステムを
Ruby on Rails とどう連携したかという話
連携方式検討時はいろいろ考慮しました
将来は現時点では分からない
将来に禍根を残さない
学習コスト、運用コストを上げないようにする
参考になりましたら、幸いです
16