私は、HTTP要求を使用して一度に1つずつAPIから何千ものエンティティを取得しています。パイプラインの次のステップとして、それらをすべてデータベースにシャベルします。スレッドマクロでの慣用エラー/例外処理
(->> ids
(pmap fetch-entity)
(pmap store-entity)
(doall))
fetch-entity
はString
IDを期待し、HTTP要求を使用してエンティティを取得しようといずれかMap
を返すか(例えば、タイムアウトのため)は例外をスローします。
store-entity
はMap
を想定し、データベースに格納しようとします。 Map
がデータベーススキーマと一致しない場合、またはMap
がまったく受信されなかった場合など、例外がスローされる可能性があります。
無粋エラー処理
私の最初の「溶液」は、それぞれの本来の機能の例外をキャッチするラッパー関数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
を気にする必要はありません。
複数のパイプラインステップがあり、そのうちのいくつかが(I/Oなどの理由で)例外をスローする可能性があるこのような状況を処理するための慣用的な方法はありますか?私はパイプラインを邪魔したくないところで、後でそれが間違っていたかどうかを後でチェックするだけです。
s://github.com/adambard/failjure? –