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

外部APIとうまく付き合う

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for makinoshi makinoshi
February 17, 2018

 外部APIとうまく付き合う

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

Avatar for makinoshi

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]))