Slide 1

Slide 1 text

֎෦"1*ͱ ͏·͘෇͖߹͏ 2018-02-11 clj-ebisu #2 @makinoshi

Slide 2

Slide 2 text

Me • αΠϘ΢ζελʔτΞοϓεגࣜձࣾ • Like: C++(11~), PostgreSQL(SQL), Clojure, Emacs(Spacemacs), MS Sculpt Ergonomic Keyboard • Hobby: ϚϯΨ,͓ञ • ࠷ۙͷΠνΦγ: cljr-create-fn-from-example

Slide 3

Slide 3 text

ΞδΣϯμ • (֎෦)APIʹΞΫηε͢Δ෦෼ΛͲ͏࡞Δ͔ • ೖྗ͢Δσʔλߏ଄ΛͲ͏ͭ͘Δ͔ • ΧϓηϧԽ͞Εͨ಺෦ॲཧΛͭ͘Δ • ݁ՌΛද͢σʔλߏ଄

Slide 4

Slide 4 text

ೖྗ͢Δσʔλߏ଄Λ࡞Δ

Slide 5

Slide 5 text

ྫ) SendGridͷAPI {:headers {"Authorization" "Bearer ...."} :content-type :json :form-params {:subject "໊݅" :content [{:type "text/plain" :value "ຊจ"}] :from {:name "MyService" :email "[email protected]"} :personalizations [{:to [{:email "[email protected]" :name "a͞Μ"} {:email "[email protected]" :name "a͞Μ"}] :custom_args {:id "1"}} {:to [{:email "[email protected]" :name “b͞Μ"}] :custom_args {:id “2"}}]}} • ͜ͷߏ଄Λҙࣝͨ͠ίʔυ͸ॻ͖ͨ͘ͳ͍

Slide 6

Slide 6 text

Builderύλʔϯ • ֤ϝιουͰҾ਺ΛνΣοΫͭͭ͠σʔλཷ ΊࠐΉ • buildϝιουͰ੔͑ΔɺνΣοΫ͢Δ • ೖग़ྗܗࣜͷมߋΛ಺෦ͰٵऩͰ͖ΔˠAPIͷ มߋ΍࢖͏APIࣗମͷมߋ΋༰қʹͳΔ

Slide 7

Slide 7 text

࣮૷ྫ (-> (mail/builder something-component) (mail/with-subject "໊݅") (mail/with-content "ຊจ") (mail/with-recipients [{:email "[email protected]" :to-name "a͞Μ" :id 1 :callback “/app/path/1”} {:email "[email protected]" :to-name "b͞Μ" :id 2 :callback “/app/path/2”}]) mail/build) • AWS SDK for Javaͷ࣮૷͕BuilderύλʔϯΛ ͱͯ΋্खʹ࢖͍ͬͯΔͱࢥ͍·͢

Slide 8

Slide 8 text

಺෦ॲཧΛΧϓηϧԽ͢Δ

Slide 9

Slide 9 text

࢖͏ଆʹ࿙Βͨ͘͠ͳ͍ • ࢖͏ϥΠϒϥϦͷڍಈ • ྫ֎͕ൃੜ͢Δঢ়گͷࠩҟɺ໭Γ஋ͷࠩҟ(map, promise, etc..) • ࣮ߦ਺ • rate limit • ಉ࣌઀ଓ਺ • ϦτϥΠ • ෳ਺ͷϦΫΤετ΋୯ҰϦΫΤετͷγʔέϯεͱͯ͠ѻ͍͍ͨ

Slide 10

Slide 10 text

diehardͱڞʹ • https://github.com/sunng87/diehard • ઃఆϕʔεͰɺretry/circuit breaker/rate limitterΛ؆୯ʹ࣮૷Ͱ͖Δ • JavaͷϥΠϒϥϦɺnet.jodah/failsafeͷϥο ύ

Slide 11

Slide 11 text

࣮૷ྫ (diehard.core/defratelimiter rl {:rate 100}) ; per sec (clj-http.client/with-connection-pool {:timeout 10 :insecure? false :default-per-route 100} (->> coll (map #(future (diehard.core/with-retry {:retry-if (fn [resp exp] (or (>= (:status resp) 500) (instance? IOException exp))) :max-retries 3 :delay-ms 1000} (diehard.core/with-rate-limiter rl (api/call endpoint %))))) (map deref) doll)) • ΊͪΌͪ͘Ό؆୯ • ΋ͬͱهड़ྔগͳ͘ఆٛ͢Δํ๏΋υΩϡϝϯτʹ͋Γ·͢

Slide 12

Slide 12 text

໭Γ஋ͷදݱ

Slide 13

Slide 13 text

ओͳ໰୊͸Τϥʔॲཧ • ѻ͍΍͍͢໭Γ஋ • ୯ͳΔσʔλ • Τϥʔ͔Ͳ͏͔൑ఆ͠΍͍͢ • Τϥʔʹͳͬͨͱ͖ͷҾ਺Λͦͷ··औΓग़ͤΔ • ѻ͍ʹ͍͘໭Γ஋ • ྫ֎͕౤͛ΒΕͨΓɺ౤͛ΒΕͳ͔ͬͨΓ • ֎෦ͷϥΠϒϥϦͰఆٛ͞Εͨܕ • promise(ಛʹ֎෦ϥΠϒϥϦͷ) • ඇಉظ͕͍͍͔Ͳ͏͔͸ݺͼग़͠ଆͷࣄ৘ • => GolangελΠϧ or ಠࣗఆٛͷEitherͷͲͪΒ͔͕Αͦ͞͏

Slide 14

Slide 14 text

࣮ࡍʹ྆ํ࢖ͬͯΈͨ݁Ռ • GolangελΠϧͷํ͕ॻ͍ͯͯϛε͕গͳͦ͞͏ʹײ͍ͯ͡· ͢ • ѻ͍΍͘͢ɺγϯϓϧʹॻ͚Δ • (group-by #(-> % second some?) results) (try (let [resp (clj-http.client/post endpoint params)] [{:resp resp resp :params params} nil]) (catch clojure.lang.ExceptionInfo e [{:params params} (ex-data e)]) (catch java.io.IOException e [{:params params} e]))

Slide 15

Slide 15 text

·ͱΊ • ClojureͰ΋σʔλ࡞੒ͷந৅ԽʹBuilder͸໾ ཱͭ • ϥΠϒϥϦͷڍಈ΍APIͰ͋Δ͜ͱࣗମ΋֎͔ ΒӅ͢ˠޙʑ؆୯ʹมߋͰ͖Δ • ໭Γ஋΋ྫ֎Ͱͳ͘σʔλͱͯ͠ѻ͍΍͘͢

Slide 16

Slide 16 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ͥͻ͝ҙݟΛԼ͍͞ɻ