# 싱글 노드와 멀티 노드 차이점

#### 싱글 노드 (Single Node)

싱글 노드는 ROS2에서 하나의 노드로 실행되는 프로그램이다. 일반적으로 노드는 **퍼블리셔(Publisher)**, **서브스크라이버(Subscriber)**, **서비스(Service)**, **액션(Action)** 등의 통신 메커니즘을 통해 다른 노드와 데이터를 주고받는다.

싱글 노드는 하나의 프로세스 내에서 실행되며, 해당 노드가 여러 작업을 수행할 수 있도록 설계될 수 있다. 싱글 노드는 ROS2에서 독립적으로 동작하고, 하나의 프로세스가 단일 목적을 위한 노드로서 역할을 한다. 이를 통해 시스템을 더 쉽게 디버깅하거나 유지보수할 수 있다.

#### 멀티 노드 (Multi-Node)

멀티 노드는 여러 개의 노드가 동시에 실행되어 서로 협력하는 구조이다. ROS2의 장점 중 하나는 분산 시스템을 지원하며, 여러 노드를 통해 작업을 나누고 병렬로 실행할 수 있다는 것이다.

멀티 노드는 ROS2의 **마스터리스 구조**에서 각 노드가 독립적으로 실행되며, 필요할 때만 서로 데이터를 교환한다. 이를 통해 각 노드는 개별적인 역할을 수행하면서도 전체 시스템의 일부로 동작할 수 있다.

#### 성능 비교

멀티 노드를 사용하면 싱글 노드와 비교해 병렬 처리 및 분산 처리가 가능해지므로 성능적으로 유리할 수 있다. 예를 들어, 센서 데이터 수집과 제어 명령 전송을 별개의 노드로 처리하면, 작업의 부하를 나눌 수 있다.

다음 수식을 통해 노드 간 데이터 교환을 수학적으로 표현할 수 있다. 노드 $i$에서 노드 $j$로 데이터를 전송할 때, 데이터 전송 시간 $T\_{ij}$는 다음과 같이 정의될 수 있다:

$$
T\_{ij} = \frac{L}{B}
$$

여기서:

* $L$은 전송할 데이터의 크기 (bits),
* $B$는 네트워크 대역폭 (bits/sec)이다.

따라서 노드 간 데이터 전송 시간이 짧을수록, 멀티 노드 시스템에서의 효율성이 증가할 수 있다. 이 수식은 노드 간 네트워크 성능에 따라 달라질 수 있으며, ROS2에서는 **DDS(Data Distribution Service)** 프로토콜을 사용하여 이와 같은 데이터를 관리한다.

#### 노드 간 통신 구조

멀티 노드 환경에서는 노드 간의 통신이 매우 중요하다. ROS2에서는 퍼블리셔-서브스크라이버 모델을 사용하여 노드 간 데이터를 주고받을 수 있으며, 노드는 네트워크 상에서 서로 통신하기 위해 다양한 메커니즘을 활용한다.

퍼블리셔는 특정 토픽(topic)에 메시지를 게시하고, 서브스크라이버는 해당 토픽을 구독하여 데이터를 수신한다. 이러한 방식으로 멀티 노드는 데이터를 비동기적으로 교환하며, 각 노드는 자신이 필요한 데이터를 선택적으로 주고받을 수 있다.

#### 통신 모델의 차이

싱글 노드와 멀티 노드 간에는 통신 모델에서도 차이가 있다.

1. **싱글 노드 통신**: 싱글 노드는 외부 노드와의 통신이 없거나 매우 제한된 경우에 사용된다. 노드가 독립적으로 동작하는 경우에는 퍼블리셔와 서브스크라이버의 필요성이 적거나, 로컬에서만 데이터를 처리하는 경우가 많다.
2. **멀티 노드 통신**: 멀티 노드는 여러 노드 간의 통신이 핵심이다. 퍼블리셔-서브스크라이버 외에도 **서비스**나 **액션**을 통해 동기 및 비동기 작업을 수행할 수 있다. 특히 멀티 노드 환경에서는 네트워크 트래픽 및 데이터 전송 속도가 중요한 성능 요소로 작용한다.

예를 들어, 노드 $\mathbf{A}$에서 노드 $\mathbf{B}$로 데이터를 전송할 때 발생하는 지연 시간을 수학적으로 표현하면, 네트워크 지연 $D$와 처리 지연 $P$를 포함한 총 지연 시간 $T$는 다음과 같이 나타낼 수 있다:

$$
T = D + P
$$

여기서:

* $D$는 네트워크 레이턴시(지연),
* $P$는 데이터 처리 시간이 된다.

멀티 노드 시스템에서는 이러한 지연을 최소화하는 것이 시스템 성능 최적화에 매우 중요하다.

#### 리소스 관리

싱글 노드와 멀티 노드는 시스템 자원 관리에서도 차이를 보이다. 싱글 노드는 일반적으로 단일 프로세스 내에서 모든 작업을 처리하기 때문에 CPU와 메모리 자원에 대한 부담이 크지 않을 수 있다. 그러나 멀티 노드는 여러 프로세스를 사용하거나, 각 노드가 독립적으로 자원을 할당받아 처리하는 구조를 갖는다.

멀티 노드에서 각 노드가 독립적으로 자원을 사용하기 때문에 전체 시스템 자원을 효율적으로 사용하는 것이 중요하다. 특히 멀티 노드는 다음과 같은 문제를 고려해야 한다:

1. **프로세스 간의 자원 경합**: 여러 노드가 동시에 실행될 때 CPU, 메모리, 네트워크 자원에 대한 경합이 발생할 수 있다.
2. **네트워크 대역폭 관리**: 각 노드가 퍼블리셔와 서브스크라이버 간의 데이터를 전송할 때 네트워크 대역폭을 고려해야 한다.

자원 경합을 수학적으로 모델링하면, 각 노드의 자원 사용량 $R$은 전체 시스템 자원 $R\_{total}$과 개별 노드 수 $N$에 따라 다음과 같이 표현된다:

$$
R = \frac{R\_\text{total}}{N}
$$

따라서 노드 수가 증가할수록, 각 노드가 사용할 수 있는 자원은 줄어들기 때문에 자원의 효율적 분배가 중요하다.

#### 확장성 (Scalability)

멀티 노드의 가장 큰 장점 중 하나는 확장성이다. 시스템이 커지거나 더 많은 기능을 추가해야 할 때, 노드를 추가하여 시스템을 확장할 수 있다. 각 노드는 특정 역할을 맡아 분리되어 있기 때문에, 시스템의 복잡도가 증가하더라도 효율적으로 관리할 수 있다.

멀티 노드 시스템의 확장성을 수학적으로 설명할 때, 시스템 내의 노드 수를 $N$, 각 노드가 수행하는 작업량을 $W$라고 하면, 전체 작업량 $W\_{total}$은 다음과 같이 표현될 수 있다:

$$
W\_{total} = N \times W
$$

따라서 노드 수가 증가하면 전체 시스템의 작업량도 증가하지만, 이를 노드 간에 적절히 분산시켜야 성능 저하 없이 확장이 가능한다. 그러나 너무 많은 노드가 존재할 경우에는 오히려 통신 및 자원 관리에 있어서 병목현상이 발생할 수 있다.

**네트워크 병목**

노드 수가 증가하면 각 노드 간의 데이터 전송 요구가 많아지기 때문에, 네트워크 병목이 발생할 가능성이 있다. 특히 많은 양의 데이터를 전송하는 퍼블리셔-서브스크라이버 구조에서는 대역폭을 효율적으로 관리하는 것이 중요하다.

네트워크 병목을 수식으로 표현하면, 네트워크 대역폭 $B$와 각 노드가 전송하는 데이터의 양 $D\_i$가 있을 때, 노드 간의 총 전송 데이터 양이 대역폭을 초과하는 상황은 다음과 같이 나타낼 수 있다:

$$
\sum\_{i=1}^{N} D\_i > B
$$

이 경우, 멀티 노드 환경에서는 QoS(품질 서비스) 설정을 통해 각 노드 간의 통신 우선순위를 관리하거나, 대역폭을 조절하여 병목 현상을 완화할 수 있다.

#### 멀티 노드의 이점

멀티 노드는 특히 다음과 같은 이점을 제공한다:

1. **병렬 처리**: 멀티 노드는 여러 작업을 병렬로 처리할 수 있기 때문에, 시스템의 처리 속도가 크게 향상된다. 예를 들어, 하나의 노드가 센서 데이터를 수집하는 동안 다른 노드가 제어 명령을 처리할 수 있다.
2. **모듈화**: 각 노드를 독립적으로 개발하고 유지할 수 있으므로, 시스템을 모듈화하여 관리할 수 있다. 이는 시스템의 유지보수를 쉽게 만들고, 코드 재사용성을 높이는 데 기여한다.
3. **유연성**: 시스템의 요구사항에 따라 노드를 추가하거나 제거하여 시스템을 유연하게 확장할 수 있다. 이는 특히 로봇이나 IoT 시스템과 같이 동적으로 변하는 환경에서 유리한다.

멀티 노드를 사용하여 시스템을 설계할 때는 네트워크 성능, 자원 사용, 통신 구조 등 여러 요소를 고려하여 설계해야 하며, 확장성 및 유지보수 측면에서 큰 이점을 얻을 수 있다.

**멀티 노드 시스템 구조 예시 (다이어그램)**

{% @mermaid/diagram content="graph TD;
A\[Sensor Node 1] --> B\[Central Node];
A2\[Sensor Node 2] --> B\[Central Node];
C\[Control Node] --> B\[Central Node];
D\[Actuator Node] --> B\[Central Node];
B --> E\[Data Processing Node];
B --> F\[User Interface Node];" %}

이 다이어그램은 센서 노드, 제어 노드, 액추에이터 노드 등이 모두 중앙 노드로 데이터를 전송하고, 그 데이터를 처리하여 사용자 인터페이스와 연결하는 전형적인 멀티 노드 시스템 구조를 보여준다.
