我需要构建一个需要制作大量外部http请求的系统,我必须使用Netflix的Hystrix来创建后备和重新路由异常。现在,我有一个非常简单的设置:
(hystrix/defcommand fetch-request
{:hystrix/group-key "c0"
:hystrix/command-key "URLFetch"
:hystrix/fallback-fn (fn [url]
{:status 419
:headers {}
:body "failed"})}
[url]
@(http/get url))
(defn test3 []
(let [n 4000
m (range 0 n)
p (partition 300 m)]
(doseq [t p]
(thread
(doseq [x t]
(let [res (fetch-request "http://localhost:3000/comments")]
(match (:status res)
200 (prn x)
:else (prn nil)))
)))
))
当我执行test3
时,我不断获得nil
。如果我减少n
的值,我的状态为200
(这就是我需要的)。此外,如果我直接在http/get
函数而不是test3
命令上使用fetch-request
,它的工作没有任何问题(即使n的值大于7000)。
注意:我使用分区+线程的原因是并行化http请求。如果您知道在clojure中尽可能快地执行大量http请求的更好方法,那真的很棒。
更新
我玩了各种配置。他们中的大多数没有产生不同的结果。大多数req仍未执行,因此立即触发回退。我尝试禁用circuitBreaker(我不想这样做,这就是我使用hystrix的原因)看看它是否做了什么 - 而且确实如此。 80%的请求通过。
(hystrix/defcommand fetch-request
{:hystrix/group-key "ct0"
:hystrix/command-key "URLFetch"
:hystrix/init-fn
(fn [_ ^com.netflix.hystrix.HystrixCommand$Setter setter]
(.andCommandPropertiesDefaults
setter
^com.netflix.hystrix.HystrixCommandProperties$Setter
(.withCircuitBreakerEnabled
(HystrixCommandProperties/Setter)
false)
; ^com.netflix.hystrix.HystrixCommandProperties$Setter
; (.withExecutionTimeoutInMilliseconds
; (HystrixCommandProperties/Setter)
; 1000))
; (.andCommandPropertiesDefaults
; setter
; (.withExecutionIsolationStrategy
; (HystrixCommandProperties/Setter)
; com.netflix.hystrix.HystrixCommandProperties$ExecutionIsolationStrategy/THREAD)
))
:hystrix/fallback-fn
(fn fetch-req-fallback [url]
{:status 419
:headers {}
:body "failed"})}
[url]
@(http/get url))
更新2:
删除thread
块可解决问题。但是,我确实需要跨多个线程执行这些请求,因此它不一定能解决我的问题。
答案 0 :(得分:1)
修正了它。我不得不修改线程池属性。
(hystrix/defcommand fetch-request
{:hystrix/group-key "ct0"
:hystrix/command-key "URLFetch"
:hystrix/thread-pool-key "URLThread"
:hystrix/init-fn
(fn [_ ^com.netflix.hystrix.HystrixCommand$Setter setter]
(.andThreadPoolPropertiesDefaults
setter
(doto (HystrixThreadPoolProperties/Setter)
(.withMaxQueueSize 10)
(.withQueueSizeRejectionThreshold 10)))
(.andCommandPropertiesDefaults
setter
(doto (HystrixCommandProperties/Setter)
(.withExecutionIsolationStrategy
com.netflix.hystrix.HystrixCommandProperties$ExecutionIsolationStrategy/THREAD)
(.withExecutionTimeoutInMilliseconds
1500))))
:hystrix/fallback-fn
(fn fetch-req-fallback [url]
{:status 419
:headers {}
:body "failed"})}
[url]
@(http/get url))