Upgrade to Pro — share decks privately, control downloads, hide ads and more …

外部APIとうまく付き合う

makinoshi
February 17, 2018

 外部APIとうまく付き合う

Clojureを使って外部APIを使うコードを設計する、書く方法について

makinoshi

February 17, 2018
Tweet

Other Decks in Programming

Transcript

  1. Me • αΠϘ΢ζελʔτΞοϓεגࣜձࣾ • Like: C++(11~), PostgreSQL(SQL), Clojure, Emacs(Spacemacs), MS

    Sculpt Ergonomic Keyboard • Hobby: ϚϯΨ,͓ञ • ࠷ۙͷΠνΦγ: cljr-create-fn-from-example
  2. ྫ) 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"}}]}} • ͜ͷߏ଄Λҙࣝͨ͠ίʔυ͸ॻ͖ͨ͘ͳ͍
  3. ࣮૷ྫ (-> (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ύλʔϯΛ ͱͯ΋্खʹ࢖͍ͬͯΔͱࢥ͍·͢
  4. ࢖͏ଆʹ࿙Βͨ͘͠ͳ͍ • ࢖͏ϥΠϒϥϦͷڍಈ • ྫ֎͕ൃੜ͢Δঢ়گͷࠩҟɺ໭Γ஋ͷࠩҟ(map, promise, etc..) • ࣮ߦ਺ •

    rate limit • ಉ࣌઀ଓ਺ • ϦτϥΠ • ෳ਺ͷϦΫΤετ΋୯ҰϦΫΤετͷγʔέϯεͱͯ͠ѻ͍͍ͨ
  5. ࣮૷ྫ (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)) • ΊͪΌͪ͘Ό؆୯ • ΋ͬͱهड़ྔগͳ͘ఆٛ͢Δํ๏΋υΩϡϝϯτʹ͋Γ·͢
  6. ओͳ໰୊͸Τϥʔॲཧ • ѻ͍΍͍͢໭Γ஋ • ୯ͳΔσʔλ • Τϥʔ͔Ͳ͏͔൑ఆ͠΍͍͢ • Τϥʔʹͳͬͨͱ͖ͷҾ਺Λͦͷ··औΓग़ͤΔ •

    ѻ͍ʹ͍͘໭Γ஋ • ྫ֎͕౤͛ΒΕͨΓɺ౤͛ΒΕͳ͔ͬͨΓ • ֎෦ͷϥΠϒϥϦͰఆٛ͞Εͨܕ • promise(ಛʹ֎෦ϥΠϒϥϦͷ) • ඇಉظ͕͍͍͔Ͳ͏͔͸ݺͼग़͠ଆͷࣄ৘ • => GolangελΠϧ or ಠࣗఆٛͷEitherͷͲͪΒ͔͕Αͦ͞͏
  7. ࣮ࡍʹ྆ํ࢖ͬͯΈͨ݁Ռ • 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]))