No Image

kakao의 오픈소스 Ep5 – Almighty Data Transmitter

2016-06-27 KENNETH 0

kakao의 오픈소스 Ep5 – Almighty Data Transmitter “카카오의 오픈소스를 소개합니다” 두번째는 gordon.hahn과 동료들이 개발한 ADT – Almighty Data Trasmitter입니다. ADT는 샤드 구성이나 사딩 규칙이 바뀔 때 샤드를 재분배하는 용도로 만들기 시작했지만, MySQL에서 데이터를 수집하여 다른 MySQL로 데이터를 전송하는 – CDC와 ETL이 결합된 – 만능 데이터 전송 도구로 변모하고 있습니다. ADT는 그 자체로도 유용한 소프트웨어 도구지만, MySQL 기반의 CDC/ETL 시스템을 구축하기 위한 좋은 시작점이 될 것 입니다. ADT는 무엇을 위한 툴인가요? ADT는 MySQL의 데이터를 수집하여 사용자가 원하는 형태로 가공하거나 다른 DB에 적재할 수 있는 툴입니다. 크게 나누면 두 가지 용도가 있습니다. 1회성 마이그레이션 작업 실시간 마이그레이션 작업 각각에 대해 활용 예시는 다음과 같습니다. 1회성 마이그레이션 샤드 데이터 재분배 혹은 샤드 룰 변경(Modulus를 Range로, 혹은 반대로 변경) 완전히 새롭게 설계한 스키마로 데이터 복사 1일 1회 MySQL의 데이터를 OLAP DB로 복사 실시간 마이그레이션 MySQL의 실시간 변경되는 데이터를 NoSQL로 복사하여 read 부하 분산 어떤 [ more… ]

Asynchronous Programming and Monad Transformers in Scala

2016-05-04 KENNETH 0

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

No Image

루빅스(RUBICS) – kakao의 실시간 추천 시스템

2016-04-28 KENNETH 0

루빅스(RUBICS) – kakao의 실시간 추천 시스템 루빅스는 실시간으로 사용자 반응을 분석하여 콘텐츠를 추천하는 카카오의 추천 시스템입니다. 2015년 5월에 다음 포털 뉴스 서비스의 일부 사용자를 대상으로 뉴스 기사를 추천하기 시작했고, 한달 뒤인 6월부터 전체 사용자에게 확대 적용했습니다. 현재는 다음 뉴스 뿐 아니라 카카오톡 채널 등 다양한 콘텐츠 서비스에서 루빅스의 추천 서비스를 사용하고 있습니다. 다음 뉴스에 루빅스를 적용한 후에 나타난 긍정적인 효과와 지표 상승에 관한 이야기는 이전에 몇 차례 다룬 적이 있습니다.(관련 글 참고) 이번 글에서는 루빅스가 실시간 추천 시스템으로서 어떤 특징을 가지고 있고 어떻게 구현하였는가를 이야기해 보려고 합니다. 실시간 데이터 처리 루빅스의 첫 적용 사례는 다음 뉴스 서비스 였습니다. 그런 이유로 개발 초기부터 뉴스 서비스에 특화된 요구사항이 많이 반영 되었습니다. 뉴스 콘텐츠는 영화나 음악, 도서와 조금 다른 점이 있는데요, 다른 콘텐츠에 비해서 생명주기가 상당히 짧습니다. 이런 차이점을 고려하면, 뉴스 기사 추천은 사용자의 반응을 최대한 빠르게 수집 및 처리하여 추천 랭킹에 반영해야 [ more… ]

No Image

Weekly Links #2 – 2016년 4월 넷째주

2016-04-27 KENNETH 0

Weekly Links #2 – 2016년 4월 넷째주 Weekly Links에서는 지난 한 주, 카카오의 기술 블로그 담당자가 구독하는 기술 뉴스레터들에서 “인간의 눈”으로 선별한 링크들을 짧은 코멘트와 함께 공유합니다. 포함된 뉴스레터 목록은 awesome-tech-newsletters에서 확인하실 수 있습니다. 2016년 4월 넷째주 추천 링크 Node.js v6 출시 V8엔진을 5.0으로 업데이트해서 ES6 문법의 93%를 지원한다는 군요. v5와 v6로의 변경사항이 꽤 길지만, 눈에 띄는 것은 없습니다. 물론 기존 v4은 2017년 4월까지 계속 지원(LTS; Long Term Support). #### 윈도10 속 우분투 배시 링크는 지디넷의 요약 기사구요, 영어 원문은 매우 길기 때문에… 꼭 보실 분 만 보세요. 리스닝에 자신 있으시면 동영상도 있습니다. 요약하면, 리눅스에서 WINE이 하는 짓(?)과 비슷한 짓(!)을 한다~입니다. WINE은 윈도의 수많은 Undocumented API 때문에 고통받았었는데 좀 불공평?! MySQL 모니터링 시리즈 1부. 성능 메트릭 2부. 수집 & 통계 3부. DataLog 광고 결론은 광고지만, 거기까지 가는 과정에서 유익한 내용이 많습니다. 이런 광고라면 고맙죠~ 개발자의 도서관: 코드를 사랑하는 사람에게 보물같은 [ more… ]

CLOSE_WAIT & TIME_WAIT 최종 분석

2016-04-21 KENNETH 0

CLOSE_WAIT & TIME_WAIT 최종 분석 트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 제대로 처리하지 못하고 먹통이 되는 경우를 종종 보게 됩니다. 여러가지 이유가 있겠지만, 이 글에서는 가장 대표적인 경우인 CLOSE_WAIT 상태를 재현하고 원인과 문제점 그리고 해결책을 알아봅니다. 나아가 TIME_WAIT의 동작 과정을 직접 만든 예제와 리눅스 커널 소스를 통해 확인하고, 인터넷에 퍼진 낡은 그래서 더이상 유효하지 않은 정보들을 바로 잡습니다. Part I. CLOSE_WAIT CLOSE_WAIT로 인한 서버 행업 현상 서버 부하 테스트 과정 중 일정 시간이 경과하면 점점 더 느려지면서 행업 상태에 빠지는 경우가 생겼습니다. 부하가 높으면 느려지는건 당연한 일이지만, 더 골치아픈 문제는 테스트가 끝나도 행업 상태에서 복구되지 않았다는 점입니다. 이는 담당자가 매 번 상태를 확인하고 복구해야 함을 뜻하며 서비스에는 도입할 수 없을 정도로 치명적입니다. 분명히 특정한 원인이 있을 것이며 그에 따른 적절한 해결책이 존재할 것입니다. 먼저 행업 직전, 8080으로 서비스 중인 포트 상황은 아래와 같습니다: $ lsof -i:8080 [ more… ]