작성
·
188
·
수정됨
0
안녕하세요 데브원영님!
현재 카프카를 적용한 프로젝트 개발 중에 있습니다.
카프카 스트림즈(DSL)를 자바 애플리케이션안에 자바 모듈로 구현을 한 상태입니다.
현재 카프카 브로커로 들어오는 데이터는 초당 50건~200건 가량이며 한 건 당 2000byte 정도 데이터를 받고 있습니다. 현재는 모든 데이터를 한 토픽에서 받고, 그 모든 데이터가 담긴 토픽을 목적별로(차, 청소 등..) 만든 토픽에 필터링 하고 있습니다. 필터링하는 로직이 복잡하지는 않습니다. (코드상 10줄 미만)
그런데 이런 상황에서 운영 중에 만약에 ,
카프카 스트림즈가 부하가 많아질 경우나 네트워크 등 다른 이슈로 스트림즈 애플리케이션이 죽지는 않을까 하는 걱정이 있습니다.
질문입니다.
혹시 이렇게 자바 코드로 작성한 스트림즈 애플리케이션이 죽는 상황이 있나요? (부하 또는 기타 문제로...)
있을 경우 대비를 한다면 스트림즈 애플리케이션을 자바 코드가 아닌 따로 프로젝트를 만들어(WAS를 따로 생성) 운영을 해야할까요?
스트림즈 애플리케이션이 죽는 경우는 어느정도의 부하(초당 몇 바이트정도인지.. 보통..)가 있어야 죽는 경우가 발생하나요? (CPU성능, 메모리 등 PC스펙이 충분하다고 할 경우에요..)
만약 WAS를 따로 만들어서 운영해야 한다면, WAS를 보통 여러 개 정도 두나요? 아니면
WAS를 1개만 만들고 WAS 내 스트림즈 스레드를 여러 개로 만들어서 운영하나요? 아니면 여러개 WAS에 여러개 스레드를 띄우나요?
WAS를 여러개 두는 경우, 1개 WAS가 죽으면 자동으로 fail over 가 되나요? 안된다면 어떻게 fail over가 되도록 구현해야 하나요?
미리 감사합니다.
답변 2
0
안녕하세요~
카프카 스트림즈를 사용한 데이터 파이프라인 처리에 대한 질문을 남겨주셨는데, 답변드리겠습니다.
혹시 이렇게 자바 코드로 작성한 스트림즈 애플리케이션이 죽는 상황이 있나요? (부하 또는 기타 문제로...)
스트림즈 애플리케이션은 부하 또는 기타 문제로 인해 언제든지 죽을 수 있습니다. 제대로된 내부 로직 관리가 되지 않는 다면 대표적으로 OOM(Out of Memory)와 같은 상황으로 인해 프로세스가 종료될 가능성이 있습니다.
있을 경우 대비를 한다면 스트림즈 애플리케이션을 자바 코드가 아닌 따로 프로젝트를 만들어(WAS를 따로 생성) 운영을 해야할까요?
스트림즈의 이슈 때문이 아니라 자바 로직으로 인한 장애는 프로젝트를 따로 만들더라도 여전히 장애가 발생할 수 있습니다. 다만, 말씀대로 프로젝트를 기존 로직과 분리하는 경우 장애에 대비하기 쉬워지고 리소스 관리 측면에서 더욱 유용하므로 분리하는 것을 추천드립니다.
스트림즈 애플리케이션이 죽는 경우는 어느정도의 부하(초당 몇 바이트정도인지.. 보통..)가 있어야 죽는 경우가 발생하나요? (CPU성능, 메모리 등 PC스펙이 충분하다고 할 경우에요..)
CPU, 메모리 성능이 데이터 처리량에 비해 충분할 경우 죽지 않는다고 볼 수 있습니다. 다만, 잘못된 로직으로 인해 메모리가 관리가 되지 않는다면 성능과 무관하게 자바 프로세스는 죽을 수 있습니다.
만약 WAS를 따로 만들어서 운영해야 한다면, WAS를 보통 여러 개 정도 두나요? 아니면WAS를 1개만 만들고 WAS 내 스트림즈 스레드를 여러 개로 만들어서 운영하나요? 아니면 여러개 WAS에 여러개 스레드를 띄우나요?
따로 스트림즈 애플리케이션을 만들어 운영할 경우 1개 애플리케이션당 스레드 개수는 1개씩 운영하는 것이 가장 효율적입니다. 다만, 파티션 개수가 많을 경우 프로세스 개수가 너무 많아질 가능성이 있으므로 상황에 따라 프로세스당 카프카 스트림즈 스레드 개수 다르게 운영하는 것이 좋습니다.
WAS를 여러개 두는 경우, 1개 WAS가 죽으면 자동으로 fail over 가 되나요? 안된다면 어떻게 fail over가 되도록 구현해야 하나요?
카프카 스트림즈 애플리케이션의 경우 여러개 프로세스로 돌릴 때, 일부 프로세스가 죽으면 나머지 프로세스에 리밸런싱 과정을 통해 지속적으로 데이터가 처리되도록 구현되어 있습니다.
아마 말씀한 WAS는 웹서비스를 위한 api server로 보이는데요. 일반적으로 데이터 파이프라인 처리를 위해서는 따로 애플리케이션(프로세스)을 띄우는 것을 권장합니다. 왜냐면 데이터 처리상 리소스의 효율적인 사용을 위해서 튜닝이 필요한데, 이러한 경우 MSA가 아니면 어렵기 때문입니다.
그래서 특정 기능을 하는 스트림즈 애플리케이션을 WAS와 분리해서 띄우되, 파티션 개수만큼 프로세스를 띄우는 것이 가장 효율적입니다.
0
안녕하세요, 인프런 AI 인턴입니다.
데브원영님의 질문에 대해 답변드립니다.
카프카 스트림즈 애플리케이션은 과부하나 네트워크 문제 등 외부 요인으로 인해 충돌하거나 죽을 수 있습니다. 정확히는, 애플리케이션 로직이나 자바 가상 머신(JVM)의 메모리 한계, 스레드 관리 문제 등 다양한 이유로 실패할 수 있습니다.
대비책으로, 애플리케이션의 복원력을 높이기 위해 여러 인스턴스로 분산 처리를 구현하는 것이 좋습니다. 카프카 스트림즈는 병렬 처리와 스케일 아웃을 위한 내장 기능을 제공하여, 각 인스턴스가 동일한 애플리케이션을 실행하면 카프카가 자동으로 로드 밸런싱을 합니다.
스트림즈 애플리케이션이 실패하는 구체적인 부하 수준은 애플리케이션의 구현, 실행 환경, 사용하는 하드웨어의 성능에 따라 달라집니다. 일반적으로, 메모리 누수나 스레드 관리 미흡 등 애플리케이션 내의 문제가 아닌 이상, 대용량 처리가 가능하도록 설계되었습니다.
WAS의 수는 애플리케이션의 요구 사항과 인프라 용량에 따라 결정됩니다. 카프카 스트림즈의 경우 WAS가 아니라 별도의 스트림즈 애플리케이션 인스턴스로 분산 처리할 것을 권장합니다. 필요에 따라 여러 인스턴스에서 스트림즈 애플리케이션을 실행하여 로드 밸런싱과 리밸런싱을 통해 처리량을 관리할 수 있습니다.
카프카 스트림즈 애플리케이션이 다수의 인스턴스로 구성되어 있다면, 카프카 클러스터는 자체적으로 한 인스턴스의 실패를 감지하고 해당 작업을 다른 인스턴스로 자동 재할당하여 failover 처리를 수행합니다. 이를 위해 카프카 스트림즈 애플리케이션을 설계할 때는 상태 저장, 체크포인팅 등의 기능을 효과적으로 활용하여 복원력을 확보해야 합니다.
답변이 도움이 되었기를 바랍니다. 추가 질문이 있으시면 언제든지 문의해주세요.
마지막 답변이 잘 이해가 안되서 다시 여쭤봅니다.ㅜㅜ
was를 여러개 두라는 말씀이신지,
아니면 1개의 was에서 여러개의 스트림즈애플리케이션을 두라는 말씀이신지요..?
was를 여러개 두면 failover가 자동으로 되지는 않을 것 같아서,
데브원영님께서 답변 주신 내용이 1개의 was에서 여러개의 같은 기능을 하는 스트림즈 애플리케이션을 두라는 말씀인 것 같은데 맞나요?
그리고 만약 was를 여러개 두면 active 서버, standby 서버를 따로 두어야 하나요?..