트랜잭션 엔진 일람

사람들이 말하는 프로그래밍은 대부분 원주율 계산이 아니라 소프트웨어 시스템 구축이다. 소프트웨어 시스템 구축에 있어서 애플리케이션 상태 관리가 핵심이다. 따라서 백엔드 프로그래밍에서 트랜잭션 엔진이야말로 핵심 요소다. 그 중요성이 너무 덜 강조된 것과 대조되게 말이다.

튜링 머신

당연히 모든 트랜잭션 처리 수단은 이 범주에서 벗어나지 못한다. 문제 연산을 위해 발명되었지만, 소프트웨어 시스템 구축에 더 많이 쓰이는 것 같다.

메모리(Random Access Memory)

메모리에서 당연히 트랜잭션을 처리할 수 있다. 문제는 트랜잭션 중간 상태에서 정전이나 고장이 발생할 경우, 트랜잭션의 원자적 적용에만 실패하는 것이 아니라, 원 상태마저 누락하는 재난이 발생해버린다.

우리가 사용하는 메모리 장치가 용량이 무한대이고 절대 정전이나 고장이 발생하지 않는 추상적인 “완벽한” 메모리라면 데이터베이스를 발명할 필요도 없었을 것이다.

관계형 데이터베이스(RDBMS)

흔히 백엔드 프로그래밍에 node.js를 써야 하나 python을 써야 하나 하는 토론이 발생하지만, 정작 중요한 부분은 왕왕 DBMS 쪽이라는 것이 간과되곤 한다. RDBMS는 오랜 역사 기간동안 트랜잭션 엔진 영역의 왕좌를 지켜왔다. 그러다 최근에 왕좌에서 끌려 내려왔는데, 스케일 문제 때문이었다. RDBMS는 수평확장성이 좋지 않았다.

여러 문서간 트랜잭션을 지원하지 않는 NoSQL

애플리케이션이 트랜잭션 처리 기능을 포함해야 한다. 이것을 잘하기 아주 어려움. 잘 해도 더러워짐. 확장성의 대가.

액터 모델(Actor Model)

애플리케이션이 트랜잭션 처리 기능을 포함해야 한다. 쉬운 확장성의 대가. 액터 모델은 상태 변경 명령을 전달하는 방식으로 작동한다. 다중 객체 상태의 동시 settlement에 약하다.

LMAX 아키텍처 (싱글 스레드, 이벤트 소싱을 통한 레플리케이션)

이 방식은 LMAX 외환 거래소, 한국거래소, 됴쿄증권거래소, 상하이증권거래소 같은 곳에 모두 적용되어 있다. 한마디로 높은 빈도의 트랜잭션 처리 영역을 장악하고 있다.

싱글스레드 모델. 수평확장 불가. 아이러니하게 TPS가 가장 높음 (6백만 TPS) . 저장공간 수평확장 불가한 것이 최대 단점.

참고: https://martinfowler.com/articles/lmax.html

고신뢰성 분산 키값 저장소 (a.k.a 분산 코디네이터)

Apache Zookeeper, etcd, Google Chubby 등 구현이 있다.

분산 저장소지만 기본적으로 중앙화된 저장소라고 봐야 한다. 다만 클라이언트에 데이터 누락의 위험 없이 최신 상태를 지속적으로 (최종 일관성) 동기화 해준다는 보장을 한다. (클라이언트로의) 분산 동기화에 특화되어 있는 저장 백엔드라고 봐야 한다.

장점:

  • 거의 완벽한 안전성.

단점:

  • 여러 문서간 트랜잭션 기능 미제공
  • TPS
  • 수평확장 불가

트랜잭션 기능 있는 클라우드 스케일 NoSQL DBMS

단점이 거의 없음. ACID + 확장성. 레이턴시를 대가로 CAP 모두 만족할 수 있음. 범용적임.

가상 액터 + 트랜잭션 패치(즉 Microsoft Orleans)

레플리케이션 불가. 하지만 상태 랜딩 (영구화) 백엔드가 레플리케이션 기능 있는 DB일 경우 레플리케이션 기능 생긴다. 단 레플리케이트 되려면 컨시스턴트한 쓰기를 해야 함. 이는 레이턴시를 대가로 함. 객체 데이터베이스(Object Database)라 할 정도의 높은 표현력이 킬링 포인트. 다른 장점: 투명한 분산 / 쉬운 수평확장. Stateless 서비스에 준하는 배포 민첩성.

레플리케이션 활성화된 Redis

장점: 높은 TPS (백만 TPS), 안전성.

단점:

  • 레플리카 랙 기간동안의 아주 미약한 데이터 불안전성 (크로스 리전 20ms 대. 베어 메탈 로컬 네트워크 1ms 대)
  • Redis의 자료형 표현력의 한계 (메모리 주소 쓸 수 없음)
  • 그로 인한 프로그래밍 표현력 부족. 애플리케이션 상태 의존적인 트랜젹션은 제한된 lua로 짜야 함.
  • 수평확장 불가 (수평확장 시 트랜잭션 불가)
  • 수직 확장의 공간 한계가 낮음(메모리 한계). 콜드 데이터를 디스크로 랜딩 시키는 기제(와 온디맨드 로딩 기제)가 필요할 경우 애플리케이션 단에서 제공해야 함.

블록체인?!

크게 퍼블릭 체인과 프라이빗 체인으로 나뉨. 퍼블릭의 경우 크게 POW와 POS로 나뉨. 각각 아주 많은 종류가 있다. 종류에 따라 TPS, 데이터 redundancy 수준, 분산 공격 가능성 모두 다름. 단점도 각각 다름. 장점이 뭐냐 라고 한다면, 퍼블릭 프라이빗을 막론하고 한가지로 요약할 수 있음. 가트너의 평가를빌자면:

멀티 파티 신뢰 문제를 해결함.

(It allows untrusted parties to exchange commercial transactions.)

Gartner Top 10 Strategic Technology Trends for 2018

즉 트랜잭션 엔진의 멀티 파티 소유가 가능해짐. 그중 “파티”의 뜻은? RFC 7519(JSON Web Token)의 서언에서 말하는 “two parties”의 “파티”와 같은 뜻. 한발 나아가 그 어떤 파티에도 소유되지 않은 트랜젹션 엔진이 탄생했음을 의미. 역사상 처음으로 애플리케이션의 상태에 대한 글로벌 컨센서스를 독점 외의 수단으로 달성할 수 있게 됨.

단점: 블록체인 트릴레마(불가능 삼각형)각자 단점이 모두 다르지만, 공통된 단점: 레이턴시. 아직까지 효과적인 수평확장이나 계층화된 확장 솔루션이 구현 및 실천에서 성공한 기록이 없음(이론과 소규모실천에는 많음). 애플리케이션 상태의 비밀성 부재. 결정론성 요구 때문에 상단 애플리케이션에서 외부 상태 참조 불가.

결론

CAP 이론이 소프트웨어 개발, 그중에서도 트랜잭션 엔진에 무엇을 의미하는지 지금까지도 업계가 오해해왔던 만큼, 업계가 이 영역에 대해 모르는 것도 많을 것이다. 많은 토론이 필요한 이유다.

《도시의 승리》 독서필기

마침내 자동차가 엘리베이터에 승리를 거두자 미국인들 다수가 도시와 자연이 융합된 교외 거주지에 살게 되었다.

샌프란시스코 지역의 아름다운 풍경 속에는 탁 트인 산등성이와 보호받는 해안 조망이 끊임없이 펼쳐진다. 실리콘밸리의 컴퓨터 분야 거물들은 특별한 기후뿐만 아니라 세계에서 가장 엄격한 토지 용도 규제로 인해 개발로부터 보호되는 아름다운 배경을 선사하는 지역에 거주한다.

석탄은 제2차 세계대전이 끝난 뒤까지도 미국 도시들의 하늘을 갈색으로 물들였다.

가정용 난방을 위한 탄소 배출로 인해서 스노 벨트(Snow Belt: 미국 북부와 동북부의 대설 지대)는 온화한 기후의 캘리포니아에 비해서 덜 푸르러 보인다.

캘리포니아 해변 지대는 미국에서 최고의 녹색 지대에 속한다. 샌프란시스코에 있는 가구는 멤피스에 있는 가구에 비해서 탄소 배출량이 60퍼센트 적다.

캘리포니아는 여름철 냉방이나 겨울철 난방이 많이 필요하지 않은 축복받은 기후를 갖고 있다.

성장을 제한함으로써 캘리포니아가 더 푸르게 보일지 몰라도 그런 제한은 미국 전체를 더 갈색으로 만들면서 전 세계 탄소 배출량을 늘리고 있다.

환경보호주의자들이 녹색 지역에서 개발을 중단시키면 갈색 지역에서 개발이 일어날 것이다.

오늘날 중국에서는 주로 산업 분야에서 탄소가 많이 배출된다. 과거 피츠버그나 맨체스터를 뒤덮었던 검은 연기처럼 탄소는 급성장하는 산업 발전의 부산물이다. 지금까지 중국 가정들은 놀라울 정도로 적은 에너지를 사용했다. 워싱턴 D.C. 지역의 일반 가정이 연간 43톤의 이산화탄소를 배출하는 반면 베이징의 일반 가정은 3.997톤의 이산화탄소만을 배출하지만 베이징은 중국에서 손꼽히는 ‘갈색 도시(the brownest place)’ 중 하나이다. 중국의 유전 도시이자 가장 갈색 도시인 다칭(大庆)의 가구당 연간 탄소 배출량은 미국에서 가장 녹색 도시인 샌디에이고의 탄소 배출량의 5분의 1에 불과하다.

국가 경제가 발전하면서 에어컨이 등장하기 훨씬 전부터 난방이 등장한다. 미국에서 가장 탄소 배출량이 많은 곳들은 덥고 습하지만 오늘날 중국에서 가장 탄소배출량이 많은 곳들은 추운 곳들이다. 중국은 난방은 하지만 아직까지 냉방은 하지 않기 때문이다. 미국 가정에서 나오는 탄소 배출량의 절반이 개인 교통수단의 사용에서 나오지만 중국에서는 현재 이 양의 10분의 1 정도만 자동차에서 나온다. 중국에서 차량과 에어컨 사용이 비교적 적어 현재 탄소 배출량이 낮은 수준을 유지하고 있으나 점점 더 부유해지는 중국인들이 미국인들이 당연하게 여기는 사치품 구입을 포기하리라 기대하기는 어려울 수 있다. 더군다나 인도에서는 에어컨을 써야 할 명분이 더욱 강한 것 같다.

중국과 인도가 전통적인 농업에 종사하기를 바라고 싶을지도 모르지만 24억에 달하는 사람들을 영원히 피폐한 가난 속에 살게 만드는 것이 기후 변화의 해법은 아니다. 과거 중국과 인도가 농업 사회였을 때 전염병에 걸려 많은 아이들이 숨졌고 굶주렸다. 영원한 가난이란 인간이 최첨단 의학 기술의 도움 없이 다스릴 수 있는 온갖 전염병에 수십억명이 노출된다는 것을 의미한다. 가난은 독재 정권을 길러내는 온상이기 때문에 인도와 중국이 가난한 상태를 유지한다면 전 세계 나머지 나라 사람들은 이웃의 강력한 독재 국가들로 인한 군사적 위험에 직면할 것이다. 그러나 환경적 위험을 줄이면서 번영과 성장을 이끌어낼 수 있는 길이 있다. 무엇보다 이 길을 걷기 위해서는 미국 준교외 지역의 자동차가 아니라 고밀도 도시 생활이 요구된다.

미래 중국이 더 나은 대중교통과 고층 주거 공간을 갖춘 초고밀도 사회가 된다면 우리가 사는 세상은 더 안전해질 것이다.

그러나 경고 신호들도 나오고 있다. 각각 2,000만 명과 1,700만 명이 거주하고 있는 상하이와 베이징의 혼잡도는 뉴욕 시와 비교하면 10분의 1 정도이고 로스앤젤레스와 비교하면 절반 미만인 광대한 도시들이다. 최근 인도와 중국에서 자동차 사용이 급증하고 있다. 이처럼 매년 30퍼센트씩 자동차 등록 대수가 늘어나는 현상이 몇 년간만 지속되더라도 2020년이 되면 중국 내 자동차 등록 대수는 5억 대에 이를 수 있다.

나도 같은 부류에 속하지만, 오늘날 아시아인들에게 에너지 절약을 설득하고 있는 에너지에 미친 미국인들은 매우 위선적이라고 말할 수밖에 없다. 한 저명한 경제학자는 이런 모습을 보고 “SUV 운전자들의 나라가 자전거 운전자들의 나라에게 모페드(모터 달린 자전거)를 몰지 말라고 설득하는 것과 같다”라고 꼬집었다. 서양이 지구온난화에 대해서 어떤 식으로든 도덕적 권위를 얻을 수 있는 유일한 방법은 자신부터 솔선수범하는 것이다.

고밀도 도시는 운전을 줄이고 냉난방을 적게 해도 되는 집에서 살 수 있는 방법을 제공한다. 아마도 미래 언젠가 우리는 탄소를 사실상 전혀 배출하지 않고도 운전하고 냉난방을 할 수 있겠지만 그때까지는 아스팔트만큼 푸른 것은 없다. 인류와 지구를 위해서, 도시는 우리를 ‘미래로 인도할 물결(wave of future)’이며 또 반드시 그렇게 되어야 한다.

Redux 공부 필기

  1. Redux의 혁신은 상태를 한곳에 몰아넣은 것, 상태와 ‘상태 변경자’들을 분리한 것이다. 맞다, WAS들이 이미 하고 있는 그것 맞다. (AWS Lambda가 왜 ‘람다’인지 생각해보라.)
  2. 상기 혁신을 통해 핫 리로딩(hot-reloading)을 지원한 것이 키 피처중 하나였다. 역시 WAS들이 이미 하고 있는 그것 맞다.
  3. 모듈화는 상태를 찢어놓음으로 달성한게 아니라 함수를 찢어놓음으로 달성한다. 찢어진 함수들은 ‘함수 합성’을 통해 다시 합쳐질 수 있다.
  4. 키 피처중 다른 하나는 시간 여행 디버깅(Time Travel Debugging)이다. (Redux라는 네이밍의 중의적 의미중 하나. 후술.) Visual Studio나 WinDbg에서 지원하는 그거 맞다. 다만 Redux가 먼저 나왔고 따라해도 VS와 WinDbg가 따라했을 것 같다.
  5. 시간여행의 비결이 뭐냐? 애플리케이션 상태를 1개의 불변(immutable) 객체에 저장하는 것이다. 상태가 바뀔 때 어떠카냐고? 불변형 객체를 하나 새로 만들면 된다.
  6. 그렇게 하게되면 메모리 사용량이 무식하게 늘어나지 않냐? 아니다. 최적화되어 필요한 부분만 증분으로 늘어난다. 즉 상태변경을 하는 일반 애플리케이션과 큰 차이가 없다. (특히 웹앱의 생명주기상 더욱 문제 안된다.)
  7. 메모리 사용량이 폭증하지 않는 마법의 비결이 뭐냐? 답은 의외로 간단했다. 얕은 복사(Shallow Copy)다. 진짜 천재다.
  8. 물론 이상 모두 Redux의 핵심을 짚었다고 할 수 없다. Flux – Redux 진화 라인의 핵심은 액션의 단방향 흐름이다. 즉 이벤트 소싱이다.
  9. 이벤트 소싱과 상태의 예측성 모두 게임 쪽에서 훨씬 일찍부터 태동하고있던 사상이었고, DB쪽에서는 옛날부터 이미 구현된 현실이었다.
  10. 물론 수렴 진화(Convergent evolution)에서 그 어떤 가지도 모두 동등하게 중요하고 대체불가하다.
  11. 함수형 프로그래밍 신도들은 immutable 의 승리가 보일 것이고, 데이터베이스 힙 가이들은 “THE LOG IS THE DATABASE”가 보일 것이고, 이벤트 소싱파들은 이벤트 소싱이 보일 것이고, CRDT연구자들은 CRDT가 보일 것이고, Redis 애호가들은 Redis가 보일 것이고, 블록체인 신도들은 블록체인이 보일 것이다.
  12. “Redux”는 “Reduce”(“맵리듀스”의 그 “리듀스” 맞다)와 같은 라틴어 어원을 갖는다. 위에서 언급한 것처럼 “(과거의 것을) 되찾음”이란 뜻이 있다. 그리고 reduce는 함수형 프로그래밍에서 잘 알려진 패턴인데 억지번역을 해보자면 ‘귀납 합병’ 같은거다. 필자도 지금 알게 된건데 “fold”가 더 표준적인 용어더라.
  13. 정말 블록체인으로 Redux를 구현한 사람이 있다.
  14. Redux는 놀랍도록 짧다. 핵심 코드 99줄 구현을 갖고있는 것으로 유명하다. 그도 그럴것이 React Europe이란 컨퍼런스에 ‘핫 리로딩’ 관련 기술공유를 하기 위해 PoC 목적으로 급조해 만들어졌다고 한다. (거봐 그냥 WAS를 본딴거라니까)
  15. Redux 발명자는 이미 페이스북에서 채갔다.