[택배 프로그램]
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개의 택배가 완료되면 그 묶음을 공항으로 보내게 됩니다.
댓글 없음:
댓글 쓰기