Kinesis 는 Kafka랑 뭐 비슷하겠지
처음에 Amazon Kinesis 를 붙일 때는 되게 가벼운 마음이었다.
AWS 안에서 해결되고, 따로 브로커 신경 안 써도 되고, 그냥 넣으면 흘러가는 구조니까.
비슷한 계열인 Apache Kafka 는 직접 설치 구성해서 오래동안 컨피그 하나하나 설정해가며
주키퍼랑 같이 디테일하게 운영해 봤던 관계로, Kinesis 정도야 금방 익숙해지겠지 하고 접근했다.
문제는 실제로 데이터 저장하고 Consumer 를 붙히기 시작하면서 부터 였다.
On-Demand mode 에서 Kinesis 는 초당 처리량에 따라 자동으로 Shard 를 증가시킨다. 그래서 ingest 규모가 커지면 순식간에 Shard 가 50개~ 100 개~ 200개~ 막 늘어난다.
이 Shard 수는 개발자가 제어할 수 가없다. 이게 데이터 소비할때 Kafka 와 큰 차이를 만들어 낸다.
Provisoned Mode 는 샤드고정이라 좋기는한데 많이 쓰지 않아도 Shard 수만큼 고정비용을 무조건 내야한다.
또 Provisioned Mode 라 해도 어차피 처리 한계량 ( 1 MB/s 또는 1,000 records/s) 이 있어 트래픽이 많다면 위험할 수 있다.
이 글에서는 On-Demand 를 사용했을때에 대해 이야기한다.
Kinesis 즉시 소비를 요하는 스트리밍 Queue
Kafka 시나리오를 보자.
클러스터 노드수, 디스크량, 컨슈머 수 등을 고려하여 Queue 의 파티션을 생성한다.
데이터를 저장하면 고정된 파티션에 저장되고, Consumer 는 파티션 개수만큼 붙어 순차적으로 데이터를 가져온다.
만약 컨슈머 하나가 파티션 2개를 담당하게 되더라도, 파티션 2개만큼 스레드가 생성되 동시에 fetch 하는게 아니라,
하나의 스레드가 2개 파티션에서 한번의 fetch 개수 만큼 나눠서 가져와 제어가 가능했다 ( 물론 옵션을 통해 동시 처리 스레드를 늘릴수 있었다. )
그런데 Kinesis 는 Shard 가 자동으로 늘어나는 구조라고 했다.
(게다가, 트래픽 확장을 고려하면 고정모드로 쓰는것도 무서우니)
그러니까 Consumer 를 전략적으로 운영할 수 가없는것이다.
Shard 개수만큼 Consumer 의 워커 스레드를 강제로 생성하고 동시에 fetch 한다.
AWS SDK Kinesis 옵션을 살펴보면, 이걸 제한할 옵션도 지원하지 않는다.
(최근 버전이었는데 아마 지금도 그럴것이다 )
보통 AWS Kinesis SDK 를 사용하니, Shard 수가 250 개라면, 컨슈머가 붙는 순간 컨슈머의 워커 스레드가 250개가 생성되어
동시에 fetch 한다...
정말 난감한 순간이었다.
보통은 fetch 문제가 아니라, 그걸 가공하여 다음 스텝으로 던져줘야 하므로,
다음 스텝의 인프라가 소형이거나 받아줄수 없다면 문제가 될수 밖에 없다.
Message Push, Event 알림, 채팅에 적합
만약 이러한 유형의 비즈니스라면 참 괜찮았을 것이다.
Consume 받은 메시지를 Virtual Thread 로 I/O 를 동시 다발적으로 처리해버리면 아름답게
대량의 데이터를 처리할 수 있엇을 것이다.
( 아 물론 개념적으로 말이 그렇다는거다. )
그러나 사정상 처리 결과를 받는 최종 목적지가 소형이었고 Queue 를 바꿀수도 없는 상황이라
Semapore Global Lock 으로 어쩔수 없이 울며겨자 먹기로 제어를 했다.
컨슈머 스레드의 시작 지점에 Global Lock 개수를 제한하여 대기후, 정해진 스레드만 동작하도록 한것이다.
만약 Kinesis Consumer 를 구현하게 된다면 이게 무슨말이고 어디에 구현해야 되는지 알게 될것이다.
난 분명 이러한 이유로 Kafka 를 사용하려고 했지만 여러 사정상 어쩔수 없이 Kinesis 를 써야만 했다...
하지만 이러한 제약사항에도 불구하고 코드 자체는 아름답게 짰으니 다행이라면 다행일까?
이러한 문제로 Shutdown 시 이벤트를 받아 Lock 으로 인한 대기열 스레드가 모두 소진되면 그때서야 종료되도록 처리 했다.
물론 갑자기 서버가 죽으면 날라간다.. ( 뭐 그건 다른 Queue 도... 하지만 좀더 손실 범위가 적으니.. )
다들 알겠지만 혹시나 Kinesis 를 선택할때 이러한 특성을 한번쯤 확인해 도움이 되었으면 좋겠다.