Uber가 만든 MQ 디자인. (task-queue 용도)
- uber가 며칠전(12/6) 아래의 제목으로 글을 썼다.
- uber는 microservice-architecture(이하 MSA)로 운영하는 것으로 유명하다.
- 이 글로 MSA에 필수인 queue를 uber는 어떤 디자인으로 만들었는지 알 수 있다.
- 또 어떤 디자인이 실제로 어떻게 구현되고 무슨 고민이 있는지도 알 수 있다.
- 남이 만든 디자인을 관찰하는건 재밌는 일이다.
- 나는 주로 가용성과 확장성에 주목한다.
- (나에게) 처리량은 확장성에 포함되고.
- (나에게) fault-tolerance는 가용성에 포함된다.
- (물론 엄격히 말하면 다르다.)
- uber는 1억개/일 메시지가 오간다고 한다.
- 계산해보면 평균 1,157개/초 메시지로 추정할 수 있다.
- 이 메시지가 uber에서 사용되는 사례로 밝힌 것:
- post-trip processing
- fraud detection
- user notification
- incentive campaigns
- 등
- 주요 디자인 선택.
- 가용성을 위한 선택.
- competing consumers.
- replicating messages.
- eventual consistency.
- 이 선택은 아마도 순서를 보장하지 않는단 얘기.
- 확장성을 위한 선택.
- competing consumers.
- write 처리량을 관찰하다가 확장하는 역할도 미들웨어에서 하는 듯 하다.
- 나는 새로운 솔루션을 사용 하는 일에는 보수적이다.
- 새로운 솔루션을 선택하는 일은 많은 단점이 있다.
- 나는 둘 중 하나의 길을 선호한다.
- 새로운 솔루션의 “디자인”만 이해하고, 기존 기술로 요구사항에 맞춰 구현한다.
- 아래 조건을 만족한 경우 새로운 솔루션을 사용한다.
- 솔루션을 아주 깊이 이해했다.
- 동시에 전파하기 쉬운 솔루션이다.
- 보통은 디자인을 제대로 이해하지 못하고, 유행을 쫓아 도입하는 경우가 많다.
- 그 중 queue 시스템은 다양한 장단점의 솔루션이 있다.
- 각 회사마다 각 팀마다 저마다의 queue를 만드는 경향도 있다.
- 고가용성, 고확장성을 가지고.
- 보장옵션을 선택하게 하면 좋을텐데.
- 현재는 Amazon SQS 가 그것에 가장 가까웠다.
Akka
- 최근에 Akka와 Actor model의 디자인도 잠깐 검토할 일이 있었다.
- Akka는 해주는게 거의 없는 틀 이었다.
- 나는 이런 프레임워크를 좋아한다.
- 보통은 X를 보장하면 Y가 떨어진다.
- 풍선을 누르면 다른 부분이 올라가는 것 처럼.
- 세상의 일은 대부분 tradeoff 다.
- 어떤 프레임워크가 X를 보장한다고 주장한다고 해도.
- 사실은 그 보장의 경계를 증명하기 위해 많은 비용을 써야한다.
- Akka는 오버헤드가 없는 틀만 있고 대부분을 개발자에게 위임한다.
- 그리고 actor model이 구조적으로 살을 붙이기 좋아 보였다.
vim
- vim 관련 링크들.
- 2016 NYC Vim talk에서 있었던 “vim 플러그인이 하는 일의 90% 를 플러그인 없이 하는 방법” 이라는 제목의 발표.
- 영상 , 슬라이드
- 재밌게 보긴 했지만, 남는건 별로 없었다.
- 다른 내용은 좀 억지스럽고 부자연스럽게 문제를 해결하려는것 같았다.
- 플러그인으로 하면 쉬운데 왜 이렇게까지? 하는 기분.
- file browser는 나도 nerdtree 보다 netrw 계열을 쓰는데 동의한다.
- 하지만 nerdtree 를 여전히 사용은 하고 있다.
- 그리고 내장된 순수 netrw 는 문제가 좀 있다.
- vim 스크립트 칫싯.
- 파이콘2016 에서 vim과 gnome-desktop을 사용하시는 분이 있었다.
- ruby의 byebug 같은 역할을 python에서는 pudb로 하는것 같다.
- gdb와 매핑되는 네이밍으로 보인다.
- 근데 저렇게 UI까지 제공하는건 좋은 선택일까?
- nautilus 를 터미널에서 입력하시는거 보니 오래된 gnome-desktop 유저 분이시구나 하는 생각이 들었다.
- vim에서 python 자동완성을 위해 jedi-vim 을 사용하신다.
- redis를 만든 antirez가 vim을 어떻게 사용하는지 쓴 글을 읽었다.
- antirez가 쓰는 전체 vimrc 는 이것인듯.
- 특별한건 없고, vim을 최소한의 설정으로 사용한다.
- 실수방지를 위해
map 4 $
을 한건 귀요미.
- 나도 설정해봤는데.
- 너무 불편하여 며칠후에 관뒀다.
r!date
는 나도 설정해서 쓰는데, 나같은 사람을 또 만나다니!
java
- java 생태계는 unix철학을 따르지 않고, 내가 쓰기엔 불편한 점이 많다.
- 예를 들어.
- 현재 프로젝트의 dependency 목록을 보여주는 shell 함수를 만들고 싶었다.
- 당연히
mvn help:effective-pom | xml2json | jq '...생략...'
이런식으로 간단히 되겠지. 라고 생각했다.
- 하지만
mvn help:effective-pom
결과는 xml 외에도 info log정보를 (verbose하게) stdout에 뿌린다.
- xml만 출력하려면 파일에 쓰고, 그 파일을 읽으면서 작업해야한다.
- 불편하다.
- verbose 옵션이 디폴트라니.
- quite 옵션도 없다니.
- remote 의존성을 shell에서 검색하고 싶었다.
- 만약 ruby라면
gem search kafka
- (덧, ruby kafka 라이브러리가 옛날 버전만 지원하는 것을 보고 좀 우울해졌다.)
- 만약 python이라면
pip search kafka
- 만약 docker라면
docker search kafka
- 만약 apt라면
apt search kafka
- 를 했는데. java에서는 도대체 왜
mvn search kafka
같은게 없는걸까.
- 라고 생각했는데
mvn-search kafka
식으로 만들 수 있게, 누군가 savant 라는 도구를 만드셨다.
- 모든 dependency의 문자열 검색을 ag 같은 외부 툴로 하고 싶었다.
- ruby라면
ag ~/.rvm/gems/ruby-2.3.1/gems/
으로 검색하면 된다.
- 실제로 이런 검색을 하는 vim 커맨드를 만들고, 키 하나로 찾아간다.
- java에서도 이걸 해볼까 해서 시도했는데.
- 일단 maven repository 에 소스를 올리지 않는 라이브러리가 많다.
- 그리고 모두 jar로 압축된 형태로
~/.m2/repository
아래에 저장된다.
- jar를 풀고 class 를 decompile 해서 저장해야.
- ag 같은 외부 툴로 검색하는 기능을 만들 수 있다.
- 악.
- 안 한다 안 해!
- java에도 타입추론이 제안되었다.
- 자바커뮤니티는 세계 최고의 보수적인 프로그래머 집단이기 때문에
- 스칼라와 코틀린의 기능들을 아주 천천히 흡수하고 있다.
- neovim 의 핵심기능을 vim8 이 흡수하면서 neovim을 죽이고.
- coffeescript 같은 언어도 결국 흡수되면서 죽는 것 처럼.
- kotlin 같은 언어는 (너무!) 좋지만 언젠가 죽을 운명의 기술이라 생각한다.
- 타입추론의 문법은 아래 중 하나로 결정될 것 같다.
- var x = expr only (like C#)
- var, plus val for immutable locals (like Scala, Kotlin)
- var, plus let for immutable locals (like Swift)
- auto x = expr (like C++)
- const x = expr (already a reserved word)
- final x = expr (already a reserved word)
- let x = expr
- def x = expr (like Groovy)
- x := expr (like Go)
- 나는 Go 스타일의
x := expr
으로 선택되면 좋겠는데.
- 자바스럽지 않다며 기각되었다.
- The Go syntax (a different kind of assignment operator) seems pretty un-Javaish.
- 자바스럽지 않다니! (하.)