2024년 10월 3일 목요일

택배 프로그램 RxJS

 [택배 프로그램]


1000개의 택배가 1초에 한번씩 배송이 된다

택배를 받으면 그 즉시 아래의 작업을 실행한다


1. 상품 개봉

2. 상품 검사

3. 상품 사용


이때 택배 회사에는 종업원이 3명 밖에 없기 때문에 위 작업은 최대 3명에 의해서 동시에 실행될 수 있다.

즉, 동시에 4개 이상의 작업은 실행될 수 없다


각 택배들에 대해서 상품 사용까지 종료된 택배들을 10개씩 묶어서 공항으로 보낸다


이 문제를 해결하기 위해 RxJS를 사용하여 택배 처리 시스템을 모델링할 수 있습니다. 아래는 요구사항에 맞춘 RxJS 코드입니다:


1. **1000개의 택배가 1초에 한 번씩 배송된다.**

2. **상품 개봉, 상품 검사, 상품 사용** 작업을 최대 3명이 동시에 처리할 수 있다. (`concurrent limit: 3`)

3. 각 10개의 택배가 완료되면 묶어서 공항으로 보낸다.


```typescript

import { interval, of } from 'rxjs';

import { map, mergeMap, bufferCount, delay, take } from 'rxjs/operators';


// 각 작업에 걸리는 시간을 흉내 내기 위한 가상 함수

const openPackage = (id: number) => of(`상품 ${id} 개봉`).pipe(delay(1000));

const inspectPackage = (id: number) => of(`상품 ${id} 검사`).pipe(delay(1000));

const usePackage = (id: number) => of(`상품 ${id} 사용`).pipe(delay(1000));


// 종합 작업 함수 (개봉 -> 검사 -> 사용)

const processPackage = (id: number) => {

  return openPackage(id).pipe(

    mergeMap(() => inspectPackage(id)),  // 개봉 후 검사

    mergeMap(() => usePackage(id))       // 검사 후 사용

  );

};


// 1000개의 택배, 1초에 한 번씩 도착

const packages$ = interval(1000).pipe(

  take(1000),  // 1000개의 택배를 처리

  map(id => id + 1)  // 택배 ID 1부터 시작

);


// 최대 3개 작업 동시에 처리, 10개 완료되면 공항으로 묶어서 보냄

packages$.pipe(

  mergeMap(id => processPackage(id), 3),  // 동시에 3개 작업만 처리

  bufferCount(10),  // 10개씩 묶어서

).subscribe(packages => {

  console.log(`10개의 택배 완료: ${packages.map(p => p)}`);

  console.log("공항으로 보냅니다.");

});

```


### 코드 설명:


1. **`interval(1000)`**: 1초에 한 번씩 새로운 택배가 도착하는 것을 시뮬레이션합니다. `take(1000)`으로 1000개의 택배만 처리하도록 제한합니다.

  

2. **`processPackage` 함수**: 이 함수는 각 택배의 세 가지 작업(개봉, 검사, 사용)을 차례대로 처리합니다. 각 작업은 `delay(1000)`을 통해 1초간 지연을 시뮬레이션합니다.


3. **`mergeMap(id => processPackage(id), 3)`**: 최대 3개의 작업이 동시에 처리되도록 `mergeMap`의 두 번째 인자로 3을 설정하여 동시성을 제한합니다.


4. **`bufferCount(10)`**: 10개의 택배가 처리되면 이를 묶어서 공항으로 보낸다는 로직을 구현합니다.


5. **`subscribe`**: 택배가 10개 완료될 때마다 로그로 확인하고 공항으로 보내는 동작을 수행합니다.


### 결과:

- 택배는 1초에 하나씩 도착하고, 각 택배에 대해 **최대 3개**의 작업이 동시에 실행됩니다.

- 10개의 택배가 완료되면 그 묶음을 공항으로 보내게 됩니다.

댓글 없음:

댓글 쓰기