Asynchronous Programming and Monad Transformers in Scala
Asynchronous Programming and Monad Transformers in Scala 자바와 스프링으로 웹서버를 개발하고 있다면 아래와 같이 HTTP 프로그래밍을 했을것이라 생각이 됩니다. // ItemApiController.java import … @RestController @RequestMapping(“/api/items”) public class ItemApiController { @Autowired RestTemplate restTemplate; @RequestMapping(value = “/{id}”, produces = MediaType.APPLICATION_JSON_VALUE) public ItemDto getItem(@PathVariable Long id) { // 응답이 올때 까지 thread는 대기하게 된다. return restTemplate.getForObject(“http://remote/fetch/item/” + id, ItemDto.class); } } 익숙한 이상할것이 없는 동기화 프로그래밍 코드입니다. 동기화 방식은 아래와 같은 장점을 가지고 있습니다. 프로그래밍하기 간편하고 순차적으로 실행되기 때문에 상대적으로 개발하기 쉽습니다. Multi thread 환경을 고려하지 않아도 되기 때문에 디버깅하기 편합니다. Request가 thread를 독점하기 때문에 필요한 상태를 thread에 저장할수 있습니다.(stateful) 하지만 동기화 방식으로 개발하고 운영하다 보면 thead pool hell이라 불리는 아래와 같은 현상을 자주 마주하게 됩니다. * 이미지 출처: The play framework at Linkedin 특정 API가 응답이 느릴경우 Request를 처리하는 thread는 blocking되고 응답이 오거나 timeout이 발생할때 까지는 thread는 waiting상태에서 머무르게 됩니다. 많은 수의 [ more… ]