나는 HTTP 요청을 사용하여 한 번에 하나씩 API에서 수천 개의 엔티티를 가져옵니다. 파이프 라인의 다음 단계로 모든 것을 데이터베이스에 삽화하고 싶습니다.스레딩 매크로를 사용한 관용적 오류/예외 처리
(->> ids
(pmap fetch-entity)
(pmap store-entity)
(doall))
fetch-entity
는 String
ID를 예상하고, HTTP 요청을 사용하는 엔티티를 검색하려고 시도하고 Map
중 하나를 리턴하거나 (예컨대 인해 타임 아웃) 예외를 던진다.
store-entity
은 Map
이 필요하며 데이터베이스에 저장하려고합니다. 예외 (예 : Map
이 데이터베이스 스키마와 일치하지 않거나 Map
을 전혀받지 못한 경우)이 throw 될 수 있습니다.
우아 오류 처리
나의 첫번째 "해결책은"각각의 원래 기능의 예외를 잡기 위해 래퍼 함수 fetch-entity'
및 store-entity'
를 작성했다.
fetch-entity'
은 기본적으로 http 요청이 실패한 경우 String
id를 전달하여 실패 할 경우 입력을 반환합니다. 이것은 전체 파이프 라인이 계속 트럭 운송을하도록 보장합니다.
store-entity'
은 인수의 유형을 확인합니다. 인수가 Map
(페치 엔티티가 성공적이었고 Map
을 리턴 한 경우)은 데이터베이스에 저장하려고 시도합니다. 데이터베이스에 저장하는 시도가 error_ids
의 외부 Vector
에 대신 Map
그 것이다 conj
의 예외가 발생하거나 store-entity'
경우 String
(ID)를 통과있어 경우
.
이 방법으로 나중에 error_ids
을 사용하여 오류 발생 빈도와 영향을받은 ID를 파악할 수 있습니다.
위와 같은 느낌이 들지 않으므로 내가하려는 일을 달성하는 합리적인 방법입니다. 예를 들어, 이전 파이프 라인 단계가 성공했는지 여부에 따라 다르게 동작하므로 store-entity'
은 이전 파이프 라인 단계 (fetch-entity'
)의 기능을 사용합니다.
store-entity'
도 있으니 error_ids
라고하는 외부 Vector
을 알고 있어야합니다. 전혀 느끼지 않습니다.
일부 파이프 라인 단계에서 예외를 throw 할 수있는 상황 (예 : I/O) 때문에 이러한 상황을 처리하는 관용적 인 방법이 있습니까? 예를 들어 조건자를 쉽게 사용할 수없는 경우 예측할 수있는 행동을하고 어디에서 파이프 라인을 방해하고 싶지 않은지 나중에 나중에 잘못 확인합니다.
(defn fetch-and-store [id]
(try
(store-entity (fetch-entity id))
(catch ... <log error msg>)))
(doall (pmap fetch-and-store ids))
겠습니까 뭔가를이 작품처럼 :
보셨나요? s : //github.com/adambard/failjure? –