arehs
Version:
The arehs ensures the best possible large batch processing, which is oriented towards event-driven chunk processing.
132 lines (97 loc) β’ 5.33 kB
Markdown
<p align="center">
<img src="https://github.com/seongjin605/arehs/blob/main/arehs.svg" width="400px" alt="Arehs Logo" />
<p>
# ποΈ Arehs
`μλ μ€`λ μ΄λ²€νΈ μ€μ¬μ chunk processingμ μ§ν₯νλ μ΅μμ λκ·λͺ¨ λ°°μΉ μ²λ¦¬λ₯Ό 보μ₯ν©λλ€.
μ΄λ 첫 λ²μ§Έ λΉλκΈ° μμ
νΈμΆμ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬μ§ μκ³ λ€μ λΉλκΈ° μμ
νΈμΆμ μ¦μ ν λΉνμ¬ μ‘°λ°νκ² νλ‘μΈμ€λ₯Ό μνν©λλ€.
**μ΄λ₯Ό ν΅ν΄ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§λ₯Ό λ¬μ±ν μ μμ΅λλ€:**
* νλ‘λ―Έμ€ νμ λμμ±μ μ€μ νμ¬ μλΉμ€ μ²λ¦¬λμ μ μ΄ν μ μμ΅λλ€.
* νλ‘λ―Έμ€ νμ λμμ±μ μ€μ νμ¬ λ€μ΄μ€νΈλ¦Ό μλΉμ€μ λΆνλ₯Ό κ΄λ¦¬ν©λλ€.
* μ ν리μΌμ΄μ
μ μ±λ₯ ν₯μ
* CPU μ ν΄ μκ° κ°μ λ±
## π Getting Started
`arehs`λ CommonJSμ ES Modulesλ₯Ό μ§μν©λλ€.
### CommonJS
```javascript
const { Arehs } = require("arehs");
```
### ES Modules
```javascript
import { Arehs } from "arehs";
```
### Example
* `create`: create λ©μλμ λͺ©μ μ νΉμ ν λ°μ΄ν° λ°°μ΄λ‘λΆν° Arehs μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν¨μ
λλ€.
* `withConcurrency`: λ³λ ¬ μ²λ¦¬ κ°μ μ€μ νκ³ νμ¬ μΈμ€ν΄μ€λ₯Ό λ°ννλ λ©μλμ
λλ€. (default: 10)
* `timeoutLimit`:Default κ°μ 0 μ
λλ€. (0λ³΄λ€ ν¬λ©΄ μ΅μ
μ΄ λμνλ©°, νμμμ μκ°(ms)λ³΄λ€ μμ
μκ°μ΄ κΈΈλ©΄ μλ¬κ° λ°μν©λλ€.
* `mapAsync`: mapAsync ν¨μλ₯Ό νΈμΆνλ©΄ μ
λ ₯ λ°μ΄ν°λ₯Ό λΉλκΈ°μ μΌλ‘ μ²λ¦¬νκ³ κ²°κ³Όλ₯Ό λ°ννλ νλ‘μΈμ€κ° μμλ©λλ€.
μ΄λ κ° μμ
μ λμμ μ¬λ¬ μμ
μ΄ μ€νλ μ μμ§λ§, concurrency μ€μ μ λ°λΌ μ νλ©λλ€.
μ΄κ²μ λκ·λͺ¨ λ°μ΄ν° μ²λ¦¬ μμ
μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ μ μ΄νκΈ° μν μ μ©ν λκ΅¬λ‘ μ¬μ©λ μ μμ΅λλ€.
```typescript
import { Arehs } from "arehs";
const dataArr = [
{ id: 1, name: "John" },
{ id: 2, name: "Alice" },
{ id: 3, name: "Bob" }
];
const result = await Arehs.create(dataArr)
.withConcurrency(10)
.mapAsync(async data => {
return await someAsyncFunction(data);
});
```
## β‘οΈ Performance
ν
μ€νΈ κ²°κ³Ό `Arehs`λ `Promise.all`μ λΉν΄ μ½ 30% μ΄μ ν₯μλ μ μλ κ²μΌλ‘ λνλ¬μ΅λλ€.
```javascript
import { Arehs } from "arehs";
const delay = (i) => {
return new Promise((res, rej) => {
setTimeout(() => {
res(i);
}, 150 + Math.random() * 1000);
});
};
(async () => {
const tasks = Array.from({ length: 1000 }).map((d, i) => i);
const startArehs = performance.now();
await Arehs.create(tasks).withConcurrency(50).mapAsync(delay);
const endArehs = performance.now();
console.log(`Arehs: ${endArehs - startArehs}ms`);
const startPromiseAll = performance.now();
while (tasks.length > 0) {
const chunkedTasks = tasks.splice(0, 50);
await Promise.all(chunkedTasks.map(delay));
}
const endPromiseAll = performance.now();
console.log(`Promise.all: ${endPromiseAll - startPromiseAll}ms`);
})();
```
```bash
promiseAllTime: 19.859867874979972(s)
promisePoolTime: 13.55725229203701(s)
```
### Promise.all
보μλ€μνΌ, `Promise.all`μ λ°°μΉμμ κ°μ₯ λλ¦° νλ‘λ―Έμ€λ§νΌ μ€λ μ€νλ©λλ€.
λ°λΌμ λ©μΈ μ€λ λλ κΈ°λ³Έμ μΌλ‘ "μ무κ²λ νμ§ μλ" μνμ΄λ©° κ°μ₯ λλ¦° μμ²μ΄ μλ£λκΈ°λ₯Ό κΈ°λ€λ¦¬κ³ μμ΅λλ€.
Promise λ°°μ΄μμ κ°μ₯ κΈ΄ νλ‘λ―Έμ€μΈ **4λ²**μ΄ μ²ν¬μ μ€ν μκ°μ΄ λ©λλ€.
μ΄λ‘ μΈν΄ κ°μ₯ κΈ΄ νλ‘λ―Έμ€κ° μλ£λ λκΉμ§ λ€μ νλ‘λ―Έμ€κ° μ무 μμ
λ μννμ§ μλ λΉν¨μ¨μ μΈ λ¬Έμ κ° λ°μν©λλ€.
<p align="center">
<img src="https://velog.velcdn.com/images/preciou_star/post/d35894aa-4ce4-4bf1-aa04-3486745964ed/image.webp" width="700px" alt="Code Crafters Logo" />
<p>
### Arehs
`Arehs`λ νλ‘λ―Έμ€ ν ν¨ν΄μ μ€ννμ¬ Node.jsμ λ©μΈ μ€λ λλ₯Ό μ΅λν νμ©νλ κ²μ΄ ν΅μ¬μ
λλ€.
νμ©λλ₯Ό λμ΄λ €λ©΄ API νΈμΆ(λλ λ€λ₯Έ λΉλκΈ° μμ
)μ μ‘°λ°νκ² ν¨νΉνμ¬ κ°μ₯ κΈ΄ νΈμΆμ΄ μλ£λλ λμ κΈ°λ€λ¦¬μ§ μλλ‘ ν΄μΌ ν©λλ€.
κΈ°λ€λ¦¬μ§ μκ³ μ²« λ²μ§Έ νΈμΆμ΄ μλ£λλ μ¦μ λ€μ νΈμΆμ μμ½ν©λλ€.
<p align="center">
<img src="https://velog.velcdn.com/images/preciou_star/post/e49061b9-f18a-4d59-8c6d-aaf240fd9085/image.webp" width="700px" alt="Code Crafters Logo" />
<p>
## πββοΈFAQ
**`Arehs`λ νμ `Promise.all`λ³΄λ€ μ’λμ?**
μλ¨, **No Silver Bullet(μννμ μλ€)**.
λ§μ API νΈμΆκ³Ό λΉλκΈ° μμ
μ ν λ μ ν리μΌμ΄μ
μ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
λν, κ° νλ‘λ―Έμ€μ μμ
μκ°μ΄ κ±°μ λμΌν μν©μμλ ν° μ°¨μ΄λ₯Ό λ§λ€μ§ λͺ»ν μλ μμ΅λλ€.
μ¬μ© μ€μΈ νκ²½μμ `Promise.all`λ‘ λ μ΄μ μ±λ₯ ν₯μμ μ»μ μ μλ€λ©΄ μλν΄ λ³Ό μλ μμ§λ§,
`Promise.all`λ‘ μΆ©λΆνλ€λ©΄ κ΅³μ΄ μ¬μ©ν νμλ μμ΅λλ€.
λ°λΌμ μ±λ₯ κ°μ μ΄ νμν νλ‘μ νΈμ `Arehs`λ₯Ό μ¬μ©νλ €λ©΄ μΆ©λΆν ν
μ€νΈλ₯Ό κ±°μΉ νμ μ¬μ©ν΄ 보μΈμ.
λμμ΄ λκΈΈ λ°λλλ€. κ°μ¬ν©λλ€.
## π¨βπ©βπ§βπ¦ Contributors
- Author: Jin Park