12/18/2024

RabbitMQ와 Kafka를 사용하는 경우

 

어제 테크 미팅 때, RabbitMQ와 Kafka에 대한 이야기가 나왔다.

본 글에서는 두 가지 기술을 더 광범위한 관점에서 생각해보고, 두 시스템이 제공하는 기능에 초점을 맞췄다. 이를 통해 어떤 시스템을 언제 사용하는게 좋은지 결정을 내리는데 도움이 되었으면 좋겠다.

웹 검색을 했을 때, 일부 글은 RabbitMQ보다 Kafka가 더 뛰어나다고 주장하고, 다른 글에서는 그 반대인 경우가 많다. 그렇기 때문에 서로 혼선이 오는 것 같다.

RabbitMQ와 Kafka 중 무엇을 선택할지에 대한 결정은 프로젝트의 요구 사항에 따라 달라지며, 적절한 시나리오에서 둘 다 사용해 본 경우에만 비교가 가능하다는 것을 아는 것이 중요하다.

두 시스템 모두 큐 또는 토픽을 통해 생산자와 소비자 간 메시지를 전달한다. 메시지에는 모든 종류의 정보가 포함될 수 있다. 예를 들어서 웹사이트에서 발생한 이벤트 혹은 다른 애플리케이션에서 이벤트를 트리거하는 메시지가 될 수 있다.

RabbitMQ와 Kafka 같은 시스템은 서로 다른 구성 요소를 연결하고, 데이터를 전달하는 용도로 사용될 때 이상적이다.


비교해보기

RabbitMQ는 AMQP, MQTT, STMOP 등과 같은 다양한 프로토콜을 지원하는 메시지 브로커이다. 높은 처리량을 처리할 수 있다.

Kafka는 높은 유입 데이터 스트림과 메시지 재생에 최적화된 메시지 버스이다. 애플리케이션이 디스크에서 스트리밍된 데이터를 처리하고 다시 처리할 수 있는 내구성 있는 메시지 브로커로 볼 수 있다.

RabbitMQ는 2007년에 출시되었고, Kafka는 2011년에 출시되었기에, 2024년이 지금 시점에서는 둘 다 신뢰할 수 있는 성숙한 시스템으로 인지할 수 있다.

그리고 세월이 흘러서 RabbitMQ도 Stream을 지원하기 시작했다. 브로커로서 RabbitMQ의 메시지는 소비되고 확인되면 큐에서 삭제된다. 이런 특성으로 인해 데이터를 장기로 보관해야 하는 지속성이나 메시지를 다시 재생해야 하는 시나리오에는 적합하지 않았다. 그러나 RabbitMQ v3.9에서는 모든 것이 바뀌었다.

Stream Queues는 RabbitMQ v3.9에 도입되었다. 지속적이고 복제되며, 기존 큐와 마찬가지로 소비자가 읽을 수 있도록 메시지를 버퍼링한다. 그러나 Streams는 아래 측면이 기존 큐와 다르다.

  • 생산자가 메시지를 쓰는 방법
  • 소비자들이 메시지를 읽는 방법

Stream에 쓰여진 메시지는 지울 수 없고, 읽을 수만 있다. RabbitMQ에서 Stream의 메시지를 읽으려면 하나 이상의 소비자가 구독해야 하고 원하는 횟수만큼 동일한 메시지를 읽는다.

위 기능은 RabbitMQ의 스트림 큐를 Kafka와 유사한 기능을 찾는 사용자에게 매력적인 옵션으로 만든다.

RabbitMQ의 Streams에 대한 설명을 여기까지 하고 본론으로 돌아가서 두 가지 기술을 바라볼때, 가장 중요한 점은 “언제 Kafka를 사용하고, 언제 RabbitMQ를 사용해야 하는가?” 이다.

메시지 처리 (메시지 재생)

기존 RabbitMQ 큐는 소비자가 메시지를 수신할 때까지만 메시지를 저장했지만, Streams는 이를 대폭적으로 변경했다.

메시지 재생에 관해 RabbitMQ와 Kafka는 모두 같은 방식으로 처리한다. Kafka와 RabbitMQ Streams에 전송된 데이터는 지정된 보관 기간(기간 또는 크기 제한)이 지날 때까지 저장된다. 메시지는 보관 기간/크기 제한을 초과할 때까지 큐에 남아 있으므로 소비된 메시지는 제거되지 않는다. 대신 여러 번 재생되어 소비될 수 있다.

RabbitMQ와 Kafka에서 제공하는 리플레이에 대한 기능은 소비자에게 버그가 있어서 일부 또는 모든 메시지를 다시 처리해야 하는 경우다. 이 경우외에 이벤트를 여러 번 재생하는 것은 바람직하지 않다.

규약

RabbitMQ는 AMQP, MQTT, STOMP 등과 같은 여러 표준화된 프로토콜을 지원한다.

Kafka는 애플리케이션과 클러스터 간 통신을 위해 TCP/IP 기반 자체 프로토콜을 사용한다. 이 프로토콜은 간단히 제거하여 교체할 수 없다. 이것만 쓰기 때문이다.

따라서, RabbitMQ가 다양한 프로토콜을 지원하기에 다양한 시나리오에서 사용할 수 있다.

라우팅

RabbitMQ의 가장 큰 이점은 메시지를 유연하게 라우팅 할 수 있다는 것이다. 다이렉트 또는 정규 표현식 기반 라우팅을 사용하면 추가 코드 없이도 메시지가 특정 대기열에 도달할 수 있다.

RabbitMQ는 다이렉트, 토픽, 팬아웃 및 헤더 교환의 라우팅 옵션이 있다.

Kafka는 라우팅을 지원하지 않는다. Kafka 토픽은 변경 불가능한 순서로 메시지를 포함하는 파티션으로 나뉜다. RabbitMQ의 라우팅을 대체하기 위해 소비자 그룹과 영구 토픽을 사용할 수 있다. 모든 메시지를 해당 토픽으로 보내지만 소비자 그룹이나 다른 오프셋에서 구독하도록 할 수 있다.

오프셋은 각 메시지에 부여된 고유 ID로, 메시지 로그에서 메시지의 순서를 나타낸다.

Kafka 스트림을 사용하면 이벤트를 토픽에 동적으로 라우팅하는 것을 만들 수 있지만, 이 기능은 기본 기능이 아니다.

메시지 우선 순위

RabbitMQ는 우선순위 대기열이라는 것을 지원하는데, 이는 대기열에 다양한 우선순위로 설정할 수 있다는 것을 의미한다. 각 메시지의 우선순위는 게시될 때 설정할 수 있다.

우선순위 대기열은 언제 사용할 수 있을까? 예를 들면, 어떤 데이터를 매일 백업을 하는데 수천 개의 백업 이벤트가 순서 없이 추가되는 상황에서, 새 백업 이벤트를 우선순위를 높여서 먼저 처리하게 하고 싶을때 사용할 수 있다.

Kafka는 메시지를 우선순위 수준으로 보내거나 우선순위 순서대로 전달할 수 없다. Kafka의 모든 메시지는 수신 순서대로 저장되고 전달된다.

확인(Commit or Confirm)

확인이라는 단어의 의미는 전송되거나 메시지가 수신되었음을 나타내기 위한 신호이다.

Kafka와 RabbitMQ는 게시된 메시지가 브로커에 안전하게 도달했는지 확인하기 위해 생산자 확인 기능을 지원한다.

노드가 소비자에게 메시지를 전달할 때, 소비자가 메시지를 수신한 것으로 간주해야 하는지 결정해야 한다.

RabbitMQ는 메시지가 전송되면 전달된 것으로 간주하거나, 메시지를 수신한 후 소비자가 수동으로 확인할 때까지 기다릴 수 있다.

Kafka는 파티션의 각 메시지에 대한 오프셋을 유지한다. 커밋된 위치는 저장된 마지막 오프셋이다. Kafka를 사용하는 소비자는 오프셋을 주기적으로 자동 커밋하거나 커밋된 위치를 수동으로 제어하도록 선택할 수 있다. (Kafka에서 메시지 소비에 대해 추적하는 방식은 버전마다 다르다.)

RabbitMQ는 메시지를 처리하지 못할 때 메시지를 nack 할 수 있다. 메시지는 마치 새 메시지인 것처럼 원래 있던 큐로 반환된다. 이는 소비자 측에서 일시적인 오류가 발생한 경우에 유용하다.

대기열 처리

RabbitMQ의 기존 큐는 비어 있을 때 가장 빠르다. 그러나 RabbitMQ Streams와 Kafka는 모두 대량의 메시지를 보관하고 배포하도록 설계되었다.

RabbitMQ의 기존 큐는 “지연 모드”를 사용할 수 있다. 지연 큐는 메시지가 자동으로 디스크에 저장되어 메모리 사용량을 최소화하지만 처리량의 시간을 늘리는 큐이다. 지연 큐는 더 나은 예측 성능을 가진 안정적인 클러스터를 만든다. 한 번에 많은 메시지를 보내는 경우 혹은 소비자가 게시자의 속도를 지속적으로 따라가지 못할 것이라고 생각되는 경우 지연 큐를 활성화 하는 것이 좋다.

스케일링

스케일링은 시스템의 용량을 늘리거나 줄이는 과정을 의미한다. RabbitMQ와 Kafka는 다양한 방식으로 스케일링을 할 수 있으며, 소비자 수, 브로커의 파워를 조정하거나 시스템에 노드를 추가할 수 있다.

소비자 확장

RabbitMQ에서 소비할 수 있는 것보다 더 빨리 메시지가 게시되면 대기열이 커지게 되고, 많은 메시지가 생겨 결국 RabbitMQ의 메모리가 소진될 수 있다. 이 경우 메시지를 처리(소비)하는 소비자의 수를 확장할 수 있다. RAbbitMQ의 각 대기열에는 많은 소비자가 있을 수 있으며 이러한 소비자는 모두 대기열의 메시지를 소비하기 위해 “경쟁” 할 수 있다. 메시지 처리가 모든 활성 소비자에게 분산되기에 RabbitMQ에서 확장 또는 축소는 소비자를 추가하고 제거하기만 하면 된다.

Kafka에서 소비자를 분산하는 방법은 토픽 파티션을 사용하는 것이다. 이렇게 되면 그룹의 각 소비자는 하나 이상의 파티션을 사용한다. 파티션 매커니즘을 사용하여 각 파티션에 비즈니스 키(사용자ID 등)에 따라 다른 메시지 세트를 보낼 수 있다.

브로커 확장

RabbitMQ는 수평 확장이 항상 더 나은 성능을 제공하지 않는다. 가장 좋은 성능 수준은 수직 확장으로 달성된다. 수평 확장도 가능하지만, 노드 간에 클러스터링을 설정해야 하기에 설정 속도가 느려질 수 있다.

Kafka는 클러스터에 노드를 더 추가하거나 토픽에 파티션을 더 추가하여 확장할 수 있다. 이는 RabbitMQ가 해야 하는 것처럼 기존 머신의 CPU나 메모리를 추가하는 것보다 더 쉬울 수 있다.

로그 압축

RabbitMQ에는 없지만 Kafka에는 있는 기능이 로그 압축 전략이다. 로그 압축은 Kafka가 단일 토픽 파티션의 큐내에서 각 메시지 키에 대해 항상 마지막인 값을 유지하도록 보장한다. Kafka는 단순하게 메시지의 최신 버전을 유지하고 동일한 키를 가진 이전 버전을 삭제한다.

로그 압축은 Kafka를 데이터베이스로 사용하는 방법으로 볼 수 있다. 보존 기간을 “영구”로 설정하거나 토픽에서 로그 압축을 활성화하면 데이터가 영원히 저장된다.

압축된 로그는 충돌이나 장애 후 시스템을 복원해야 할 때 유용하다.

모니터링

RabbitMQ는 웹 브라우저에서 서버를 모니터링할 수 있다. 대기열, 연결, 채널, 교환, 사용자 및 사용자 권한을 브라우저에서 처리할 수 있으며 메시지 속도도 모니터링하고 메시지를 수동으로 보내고 받을 수 있다.

Kafka는 모니터링을 위해 오픈소스 툴을 사용해야 한다.

Push와 Pull

RabbitMQ에서는 메시지를 소비자에게 푸시한다. 소비자가 받을 수 있는 여력을 보장하기 위해 사전에 제한을 구성하는 것이 중요하다. (소비자가 처리하는 것보다 메시지가 빠르게 갈 경우) 소비자는 RabbitMQ에서 메시지를 풀링할 수 있지만 권장하지 않는다.

Kafka는 풀 모델을 사용한다. 소비자는 주어진 오프셋에서 메시지를 요청한다. (소비자가 처리하는 것보다 메시지가 빠르게 갈 수 없는 장점)

라이센스

RabbitMQ는 2023년에 브로드컴의 일부가 되었다. 그러나 소스 코드는 모질라 퍼블릭 라이센스로 공개되어 있다. 라이센스는 변경된 적이 없다.

Kafka는 링크드인에서 만들었다. 2011년에 Apache 재단으로 넘어갔다. 따라서 Kafka는 Apache 2.0 라이센스의 적용을 받는다.

두 라이센스 모두 무료 오픈 소스 라이센스이다.

복잡성

개인적인이긴 하지만 RabbitMQ가 더 쉽다. 그 이유는 Kafka의 경우는 토픽/파티션/메시지 오프셋 등과 같은 더 많은 개념을 이해해야 한다. 그래서 더 많은 복잡성이 있다.

Kafka 생태계

Kafka는 단순한 브로커가 아니라 스트리밍 플랫폼이다. 그래서 Kafka와 쉽게 통합할 수 있는 많은 도구가 존재한다. 예를 들어 Kafka Core, Kafka Streams, Kafka Connect, Kafka REST Proxy 등이다. 그러나 대부분 도구는 Confluent에서 제공되며 Apache의 일부가 아니다.

도구가 많다는 점은 연결되는 시스템을 구성할 수 있다는 장점이 있다.

Kafka REST Proxy는 클러스터에서 메타 데이터를 수신하고 간단한 REST API를 통해 메시지를 생성하고 소비할 수 있도록 제공한다.

Kafka Connect는 다른 시스템을 Kafka와 통합할 수 있다.

일반적인 사용 사례

지금까지는 각 시스템이 무엇을 할 수 있고, 못하는지에 대한 얘기를 했다. 이제는 어떤 시스템을 사용할지 생각하고 결정을 내리는 방법에 대해서 설명하려고 한다.

RabbitMQ의 사용 사례

일반적으로 단순하고 전통적인 Pub-Sub 메시지 브로커를 원한다면 RabbitMQ가 확실한 선택이다. 채널 및 큐를 통해 통신을 처리하고 스트리밍을 옵션으로 추가하는 것이 요구 사항이라면 RabbitMQ를 선택했을 것이고 초보자에 더 친화적인 옵션이라고 생각할 수 있다. 그리고 Streams 지원이 있다.

복잡한 라우팅

RabbitMQ는 복잡한 라우팅에서 빛을 발한다. 다른 메시징 시스템과 달리 메시지 라우팅 프로세스를 완벽하게 제어할 수 있다. 콘텐츠 유형, 메시지 우선 순위 및 비즈니스 로직과 같은 여러 조건에 따라 메시지를 라우팅하도록 시스템을 구성할 수 있다.

우선 순위 대기

RabbitMQ는 특정 메시지를 다른 메시지보다 우선시할 수 있는 기능인 우선 순위 큐를 지원한다. 우선 순위 큐를 사용하면 시스템에 부하가 많을 때에도 중요한 메시지가 먼저 처리되도록 할 수 있다.

다중 프로토콜

RabbitMQ는 여러 프로토콜을 지원하기 위해 기능을 확장하고 있다. 현재 AMQP, MQTT, STOMP를 지원한다. 그러나 RabbitMQ의 아키텍처는 AMQP를 위해 설계되었기에 다른 프로토콜을 효율적으로 실행하는데에는 어려움을 겪을 수 있다.

Kafka의 사용 사례

일반적으로 스트리밍 데이터를 저장, 읽기(다시읽기), 분석하기 위해 순수하게 설계된 것을 원한다면 Kafka를 사용해야 한다. 감사를 받는 시스템이나 메시지를 영구적으로 저장해야 하는 시스템에 이상적이다.

즉, 로그 처리, 스트림 처리, 분산 시스템에 특히 유용하다.

높은 처리량

Kafka의 가장 주목할 만한 특징은 대량의 데이터를 처리할 수 있는 능력이다. 초당 수십만 개의 메시지를 처리하도록 설계되어 실시간으로 대량의 데이터를 처리해야 하는 애플리케이션에 탁월한 선택이다.

로그 처리 및 스트림 처리

Kafka는 로그 처리 및 스트림 처리에도 적합하다. Kafka는 내장된 로그 저장 시스템을 통해 다양한 소스의 로그 데이터를 효율적으로 저장하고 처리할 수 있다. 또한 스트림 처리를 지원하여 데이터가 도착하는대로 실시간으로 처리할 수 있다.

분산 시스템

Kafka는 분산 시스템에 탁월하다. 분산 아키텍처를 통해 수평적으로 확장하여 증가된 데이터 부하를 수용할 수 있다. 또한 일부 서버가 실패해도 데이터가 안전하게 보호되도록 한다.


어떤 상황에서 어떤 시스템을 쓸 것인지, 현명하게 결정해야 한다.


10/10/2024

개발자와 AI의 관계

 


개발자들은 종종 AI에 회의적이다. 하지만 AI 도구의 잠재력은 좋아하든 싫어하든 더 빠른 릴리즈와 더 나은 제품을 만들 수 있게 도와준다.

Stack Overflow에서 2024년에 진행한 개발자 설문 조사에 의하면 개발자의 43%만 AI 도구의 결과를 신뢰했다. 반대 의견은 AI가 복잡한 작업을 처리하는데 어렵다고 말했다.

이런 상황에도 ChatGPT는 코딩의 새로운 시대를 열었다고 생각한다. 더 이상 Google, Stackoverflow에서 코딩에 대해 질문이나 답을 할 필요가 없다.

이번에 Cursor AI IDE를 이용하자고 함께 일하는 동료들에게 제안했다.

이유는 일부 개발자들이 Copilot or ChatGPT를 이용하여 코딩에 도움을 받고 있기 때문이다.

Cursor를 사용해보니 AI에 긍정적인 개발자의 경우 생산성이 향상 될 것으로 판단되었기 때문이다.

본 글은 AI를 개발에 이용하면서 느낀 것들에 대한 정리이다.

AI가 개발자를 대체할 것인가?

나의 대답은 당장은 대체하지 않을 것이다. 그러나 AI는 이미 개발자가 코드를 작성하는데 도움을 주고 있다.

ChatGPT, Copilot, Codex등 AI 기반 코딩 어시스턴트는 개발자가 더 나은 코드를 더 빨리 작성하도록 도움이 된다.

개발자의 진정한 가치는 그들이 만드는 것을 어떻게 만들어야 하는지 아는 것이다.

AI가 비즈니스의 가치를 이해하고 무엇을 먼저 개발해야 하는지를 알때까지는 시간이 필요할 것이다. 그래서 개발자의 역할은 항상 있을 것이라 생각된다.

신뢰할 수 있는가?

AI가 아무것도 없이 prompt만으로 처음부터 끝까지 요구사항에 맞는 코드를 작성할 수 있다고 믿을 수는 없다. 그렇지만 생산성을 높이기 위해 사용할 수 있다는 것에 부정하지 않는다.

개발자가 작업하는 영역중에서 수동적으로 처리해야 하는 부분에 대해서 AI의 잠재력을 주로 활용했다. 다이어그램을 만들때도 prompt를 작성한 후 AI가 만드는 동안 다른 작업에 몰두 할 수 있었다.


그리고 API를 만들고 테스트를 생성하도록 요청한다. 이렇게 하면 코드를 테스트하고 오류를 식별하는 데 걸리는 시간이 크게 줄어든다.

물론, AI가 생성한 테스트 스크립트를 검토해야하지만 그럼에도 매우 효율적이다. AI에게 명확한 경계를 제공하면 잘 작동하고 많은 시간을 절약할 수 있다.

AI가 작성한 코드를 신뢰하려면 검토를 해야 한다. 업무를 지시한 사람이 AI가 작업한 작업물에 책임을 져야 한다.

생산성이 향상되고, 품질이 좋아지더라도 AI에게 prompt를 작성하는 사람은 항상 선장이 되어야 한다. AI의 도움을 받는 다는 것은 지름길을 선택한 것이다. 지름길에는 리스크가 있을 수 있다. 그래서 결과에 대해 주의를 기울여야 한다.

AI 진화는 아직 빙산의 일각이라 생각한다. AI에 대한 믿지 못하는 상황이 100% 사라지지 않을 것이기에 AI의 품질은 더욱 향상 될 것이다.

  1. AI가 신뢰할 수 있는 코드를 작성할 수 있는 상황이 발생할 수 있을까?
  2. AI는 인간이 작성한 방대한 양의 코드를 학습했다.
  3. 인간은 100% 신뢰할 수 있는 코드를 작성하지 못한다. 실수가 발생한다.

따라서 AI가 신뢰할 수 있는 코드를 작성할 가능성은 낮다.

위 논리에 따라 100% 완벽한 코드를 AI가 작성하긴 어려울 것 같다. 그래서 검토를 할 수 있는 개발자가 필요하다.

생산성은?

같이 일하는 동료들의 의견을 받아봐야 알겠지만, 내가 판단했을 때는 AI 도구를 사용하는 개발자는 코드 생성, 리팩토링, 테스트 등에 대해서 사용하지 않는 개발자보다 20% ~ 30% 더 생산성이 나올 것 같다.

코딩에서 AI를 사용하게 되면 시간 절약이 꽤 된다. 다만, 코드를 어느정도 이해하는 수준을 지니고 있을 때 가능한 이야기이다. 내가 어떤 코드를 짜야하는지, 이 코드가 제대로 된 코드인지 판단할 수 없는 사람일 경우에는 큰 도움이 되지 않는다고 생각한다. 이런 사람들을 개발자라고 부르진 않으니까.

결론

AI 코딩 어시스턴트는 생산성을 높이고, 생산성에 대한 경쟁 우위를 유지할 수 있다고 생각한다. 물론, 코드를 이해하고 컨트롤 할 수 있는 개발자일때만 가능하다.

시대가 변하고 있다. 새로운 기술을 최대한 활용하는 것이 중요하다. 증기기관이 처음 나왔을 때, 기계와 대결한 “John Henry”의 이야기를 상기했으면 한다.

개발자들이여 AI에 대해 회의적으로 접근하지 마세요!

AI 코딩 어시스턴트를 작업에 통합하는데 익숙해지도록 하세요.

당신의 지시를 따르는 어시를 고용한다고 생각하세요.

10/04/2024

풀스택 개발자, 현실적으로 가능한가?

본 글은 지극히 개인적인 관점이라는 점을 서두에 언급한다.


과거 동안 “풀스택 개발자”라는 용어가 인기를 끌었고, 동료들에게도 원하는 이상향이 “풀스택”이다. “풀스택”은 현대 애플리케이션 개발 시 모든 측면을 처리하는데 능숙한 프로그래머를 지칭한다. 즉, 풀스택 개발자는 프론트엔드(사용자 인터페이스)와 백엔드(서버)을 모두 개발 할 수 있는 전문가이다.

두 영역을 작업할 수 있는 능력은 엄청나다. 이 능력을 유지하기 위해서는 기술이 계속 발전하는 상황에서 최신 도구 및 프레임워크, 패턴, 아키텍처 그리고 다양한 기술들을 얻기위한 지속적인 학습이 필요하다. 이것 외에 클라우드, DevOps 혹은 AI 서비스 연동과 같은 것들을 융합해야 한다.

“풀스택”이라는 용어가 탄생했는지는 과거를 살펴볼 필요가 있다. 현재까지 개발자는 항상 새로운 기술에 적응하고 다양한 도구를 활용하여 애플리케이션을 만들어야 했다. 과거에는 사용자 인터페이스(UX)가 단순 했기에 개발자는 주로 비즈니스 로직을 최적화 하는데 주력했다. 그러다가 Web 2.0 시대가 되면서 프론트엔드의 개발 가능성이 크게 성장했다.

이런 상황이 발생하자, 다방면에 뛰어난 개발자에 대한 수요가 커졌다. 그 당시 많은 스타트업(Uber, Airbnb)들이 탄생했고, 그들의 성공은 사용자 경험을 개선하고 기술 기반 비즈니스를 만드는 것에 대한 중요성을 보여주었다.

시장의 변화로 인해 다재다능한 개발자에 대한 Needs가 증가했다. 풀스택 개발자를 고용하면 각 분야별 개발자를 고용하는 것보다 비용이 낮아지기 때문이다. 그리고 새로운 기능을 빠르게 개발 할 수 있기에 풀스택의 중요성이 강조되었다. 아마도 Node.js가 출시되면서 “풀스택”에 대한 중요성이 더 강조되었던 것 같다. 이유는 프론트엔드와 백엔드 모두 Javascript라는 동일한 언어를 사용하기에 이론적으로 둘다 작업하기 위한 기술을 갖추었다고 판단되기 때문이다.

모든 분야에서 뛰어난 사람은 존재하기 어렵다. 일반적으로 한 개발 분야에서는 뛰어나지만 다른 개발 분야에서는 뛰어나지 않은 상황이 많다. 이유는 필요한 모든 기술을 습득하는데 어려움이 있기 때문이다. 사용자 경험(UX)와 프론트엔드 기술에 뛰어난 개발자는 클라우드 기반의 마이크로서비스 아키텍처의 전문가가 될 가능성이 적다. 불가능하지는 않지만 필요한 고급 기술을 얻기는 매우 어렵다.

이제까지 많은 숙련된 전문가들과 일을 해왔지만, 프론트엔드와 백엔드 개발에서 모두 뛰어난 사람을 본적은 없었다. 그 이유는 개인적인 관심사가 크게 작용하기 때문이다. 어느 한쪽에 전문성이 깊으면서 다른 부분도 잘하는 분들을 뵌적은 있다.

앞으로는 백엔드의 복잡성이 줄어들고 사용자 경험에 더 집중되는 형태로 애플리케이션 개발이 진행될 것으로 예상된다. 그래서 백엔드에 전문성을 갖춘 분들은 프론트엔드에 관심을 가지고 준비하고, 프론트엔드에 전문성을 갖춘 분들은 반대로 백엔드에 관심을 가지고 준비하면 두 분야를 모두 잘하지는 못하겠지만, 풀스택에 가까워지는 상황이 발생하지 않을까 생각한다.

풀스택 전문가가 아니더라도 특정 분야에 대해서 이해가 있으면 커뮤니케이션을 할때 큰 도움이 되기 때문이다. 기술적으로 상대방을 이해하는 것이 효율적인 제품을 구축하는데 매우 중요하기 때문이다.

9/23/2024

Linux Atomic desktops

지난 주말 오래된 노트북에 Fedora Atomic Desktop을 설치했다. 이제까지 사용했던 리눅스와는 생소한 개념을 갖고 있기에 여기에 글을 정리한다.

Linux Atomic Desktops이란?

Linux Atomic Desktops은 Fedora의 Atomic Host를 통한 Atomic update 개념을 활용한다. 이 아이디어는 데스크톱을 구성하는 최소한의 것들을 변경 불가능한 것으로 취급하여 애플리케이션 업데이트 및 변경 사항을 필요한 경우 쉽게 롤백할 수 있는 개념을 적용한 것이다. 이 접근 방식은 시스템 중단을 최소화하고 시스템 수정에 대한 안정성을 강하게 만든다.

이 개념은 약 10년전 Atomic Host 개발과 함께 시작되었다.

Linux Atomic Desktop은 어떻게 동작되는가?

Atomic update

  • Transaction update: 업데이트는 단일 트랜잭션으로 적용된다. 업데이트 프로세스에 문제가 발생하면 이전 상태로 롤백하여 시스템이 안정적이고 사용 가능한 상태를 유지할 수 있도록 만든다.
  • Ostree: Atomic update의 핵심은 부팅 가능한 파일 시스템을 관리하는 Ostree이다. 각 업데이트는 새로운 트리로 구성되기에 롤백과 병렬 설치가 가능하다.

컨테이너화

  • Flatpak: 애플리케이션은 Flatpak을 사용하여 격리된 환경에서 실행된다. 이는 애플리케이션이 시스템에 엑세스 하는 것을 제한하여 보안을 강화하고 다양한 애플리케이션들이 서로 충돌없이 다양한 버전의 라이브러리를 사용할 수 있도록 만든다.
  • Podman: 복잡한 애플리케이션의 경우에는 Podman이 Docker와 유사한 방식으로 컨테이너를 실행하기에 Atomic 개념에 부합된다.

Immutable Infrastructure

  • Read Only System: 코어 시스템의 파일은 읽기 전용으로 처리되고 특정 영역에서만 변경이 허용된다. 이렇게 하면 시스템 손상 및 수정의 위험이 줄어든다. 읽기 전용으로 처리되는 주요 루트 폴더는 다음과 같다.
    • /usr: 바이너리와 라이브러리가 위치하는 곳
    • /boot: 부트 로더 파일이 위치하는 곳
  • 통제 가능 영역
    • /etc: ostree에서 변경사항이 추적되고 관리된다.
  • 계층형 패키지: 사용자는 기본 이미지 위에 레이어 형태로 RPM 패키지를 설치할 수 있다. 이는 추적되고 Atomic하게 관리된다.

장점

  • 신뢰성: 업데이트와 잠재적 충돌의 영향을 최소화하기에 데스크톱 환경의 안정성이 향상된다.
  • 일관성: 각 인스턴스를다른 인스턴스와 일관성을 유지하여 소프트웨어 버전 및 동작의 불일치를 줄인다.
  • 보안: 애플리케이션의 격리와 시스템 구성 요소의 변경 불가로 인해 보안을 강화한다.
  • 롤백 및 재현성: 쉬운 롤백 기능과 환경을 재현하는 기능으로 관리와 문제 해결이 편리해진다.

단점

일반적으로 “컨테이너 = 복잡하다” 라고 주장하는 사람들에게는 어려울 수 있다. 근데 실제 사용해보면 사용자는 이 차이를 잘 느끼지 못한다. Flatpak을 사용해본 경험이 있다면, 전혀 다를게 없다고 느낄 수 있다.

다른 배포판은 없는가?

물론 “Immutable distro (불변 배포판)” 라는 이름으로 이런 개념이 적용된 배포판이 존재한다. 최근에는 Atomic이라는 용어를 사용하고 있다. 아래는 “Immutable distro” 목록이다.

1. Carbon OS

carbonOS는 Flatpak 및 컨테이너 우선 접근 방식을 취한다. carbonOS는 시스템 업데이트시 검증된 부팅을 제공하는 것을 목표로 한다.

2. Fedora Silverblue

Siverblue는 불변성을 갖춘 Fedora Workstation의 변형이다. (내가 사용하고 있다.)

사용자 인터페이스 및 경험은 Fedora Workstation과 변함이 없다.

Siverblue는 테스트 및 컨테이너 기반 소프트웨어 개발에 유용한 안정적인 경험을 제공하는 것을 목표로 한다. 업데이트 후 문제가 발생하면 이전 버전으로 롤백할 수 있다.

3. Flatcar 컨테이너 리눅스

Flatcar는 컨테이너 워크로드에 맞춰 커뮤니티에서 만든 리눅스 배포판이다.

컨테이너를 실행하는데 필요한 도구만 포함된 최소한의 OS 이미지가 제공된다.

4. NixOS

NixOS는 사용 가능한 가장 진보된 리눅스 배포판 중 하나이다. 패키지 관리자를 여러 운영체제에서 사용할 수 있다.

5. GUIX

GUIX는 NixOS와 비슷하지만, 안정적인 시스템 사용 및 업그레이드에 대한 제어를 위한 고급 사용자를 위해 제작되었다.

6. 바닐라 OS

Vanilla OS는 불변 OS 분야에서 최근에 진입한 기업이다. 신뢰성과 변경 불가능한 기능을 갖춘 쉬운 데스크탑 환경을 제공하는 것을 목표로 한다.

7. BlendOS

BlendOS는 다른 배포판의 모든 장점을 제공하는 것을 목표로 한다.

불변성과 업데이트에 대한 안정성을 확보하면서 RPM, DEB등 다양한 패키지를 이용해 애플리케이션을 설치할 수 있다. (개인적으로 궁금한 배포판이다.)

결론

Linux Atomic Desktops는 데스크탑 환경이 관리되고 유지되는 방식에 많은 변화를 가져다준다. 그리고 사용자에게 일관된 데스크탑 경험을 제공한다. 이 기술이 성숙해지게 되면 Linux 생태계에서 도태되고 있던 데스크탑 환경의 안정성 및 새로운 표준으로 자리매김 할 것으로 예상된다.