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
About Integrant
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ayato
March 13, 2017
Programming
600
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
About Integrant
ayato
March 13, 2017
More Decks by ayato
See All by ayato
マイクロサービス内で動くAPIをF#で書いている
ayato0211
1
1.6k
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3.2k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
300
Re:REPL-Driven Development
ayato0211
3
1.4k
Meta Template Engine
ayato0211
2
1.2k
超変換! Hiccup data structure!!
ayato0211
2
670
Muscle Assert
ayato0211
0
320
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.2k
翻訳にまつわるエトセトラ
ayato0211
6
1.3k
Other Decks in Programming
See All in Programming
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
Creating Composable Callables in Contemporary C++
rollbear
0
170
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
110
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.9k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
180
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
270
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
210
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
AIで効率化できた業務・日常
ochtum
0
150
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
600
Inside Stream API
skrb
1
790
Oxcを導入して開発体験が向上した話
yug1224
4
340
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
22k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Chasing Engaging Ingredients in Design
codingconduct
0
230
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
610
Building an army of robots
kneath
306
46k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
Code Review Best Practice
trishagee
74
20k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
Transcript
*OUFHSBOU ʹ͍ͭͯ !@BZBUP@Q$ZCP[V4UBSUVQT JOD
自己紹介 •あやぴー •朝ジムを倒しまくってる •普段はComponentベースでシステム開発
Integrant概要
Integrantとは •Jamesオジサンが作った新しいデータ駆動 アーキテクチャなマイクロフレームワーク •つまり、ライフサイクルを管理するライブラリ •Componentで指摘された課題を解決しようとしたもの •システムがデータから組み立てられる •各コンポーネントは必ずしもマップやレコードである 必要はない
データによるシステム定義 •ednでシステムを定義できる {:adapter/jetty {:port 8080, :handler #ref :handler/greet} :handler/greet {:name
"Alice"}}
Multimethodによるコンポーネント定義 •レコードやマップに限らず関数やただの数値などもコン ポーネントにすることが可能 (require '[ring.jetty.adapter :as jetty] '[ring.util.response :as resp])
(defmethod ig/init-key :adapter/jetty [_ {:keys [handler] :as opts}] (jetty/run-jetty handler (-> opts (dissoc :handler) (assoc :join? false)))) (defmethod ig/init-key :handler/greet [_ {:keys [name]}] (fn [_] (resp/response (str "Hello " name))))
一時停止と再開のサポート •再起動が遅くなるのを回避できる •suspend-key!とresume-keyがポイント •初期化処理にも多少影響がある
一時停止と再開のサポート (defmethod ig/init-key :adapter/jetty [_ opts] (let [handler (atom (delay
(:handler opts))) options (-> opts (dissoc :handler) (assoc :join? false))] {:handler handler :server (jetty/run-jetty (fn [req] (@@handler req)) options)})) (defmethod ig/halt-key! :adapter/jetty [_ {:keys [server]}] (.stop server)) (defmethod ig/suspend-key! :adapter/jetty [_ {:keys [handler]}] (reset! handler (promise))) (defmethod ig/resume-key :adapter/jetty [key opts old-opts old-impl] (if (= (dissoc opts :handler) (dissoc old-opts :handler)) (do (deliver @(:handler old-impl) (:handler opts)) old-impl) (do (ig/halt-key! key old-impl) (ig/init-key key opts))))
Componentと比較して⚔
良いところ •データでシステムを記述できる •どんなモノでもコンポーネントにできる •心理的な負担が減る
悪いところ •明示的にコンポーネントの名前空間を読み込む必要性
変わらなかったこと •あるコンポーネントに依存したいならば それ自身をコンポーネントとして定義する必要がある
Integrantはこう使う (と良いかも)
独自のns loaderを作る •デフォルトでついてくるのは使い勝手が悪い •完全修飾されたキーワードは設定ファイルに書き難い •開発時にシステムからコンポーネントを取り出すのも苦 •例えばbultitudeを利用して任意のprefix付きnsを ロードするようなbootstrap機能を実装する
同じコンポーネントを複数作る •マルチメソッドを大量に用意する? •No •任意の親を持つ子のキーワードを複数deriveしておく •注意点 •複数の子で設定を書く場合は親のキーワードを 設定ファイルに書けない •refに対して子のキーワードを明示
同じコンポーネントを複数作る (derive :demo/master-db :demo/db) (derive :demo/read-db-1 :demo/db) (derive :demo/read-db-2 :demo/db)
(defmethod ig/init-key :demo/db [_ opts] ...) (ig/init {:demo/read-db-1 {...} :demo/read-db-2 {...} :demo/master-db {...} :demo/get-user-handler {:db (ig/ref :demo/read-db-1)} :demo/get-company-handler {:db (ig/ref :demo/read-db-2)} :demo/update-user-handler {:db (ig/ref :demo/master-db)}}
テストでコンポーネントを差し替える •deriveでok
baumと組み合わせる •baumは設定ファイルを素敵にする拡張可能な DSLライブラリ •環境変数などを取得できる •baumのカスタムリーダーとして integrant.core/refをラップする
baumと組み合わせる {$override* "dev-resources/config-local.edn" :demo/server {:port 3000 :handler #igref :demo/endpoint} :demo/database
{:dbtype "postgresql" :dbname "my_blog" :user #env :db-user :password #env :db-password} :demo/endpoint {:db #igref :demo/database}}
まとめ •Componentにあった心理的な負担が減った •これが1番いいかと言われると疑問 •Arachne的なアプローチにも期待したい