https://github.com/jun-labs/async-parallel-scan
π³ ν
μ΄λΈ νμ€μΊκ³Ό λΉλκΈ°/λ©ν° μ°λ λλ₯Ό νμ©ν λ°μ΄ν° μ²λ¦¬.
https://github.com/jun-labs/async-parallel-scan
async async-parallel full-scans parallel table
Last synced: 2 months ago
JSON representation
π³ ν μ΄λΈ νμ€μΊκ³Ό λΉλκΈ°/λ©ν° μ°λ λλ₯Ό νμ©ν λ°μ΄ν° μ²λ¦¬.
- Host: GitHub
- URL: https://github.com/jun-labs/async-parallel-scan
- Owner: jun-labs
- Created: 2024-03-09T13:23:36.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-03-26T16:30:47.000Z (almost 2 years ago)
- Last Synced: 2025-01-21T01:11:32.432Z (about 1 year ago)
- Topics: async, async-parallel, full-scans, parallel, table
- Language: Kotlin
- Homepage:
- Size: 322 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Full Table Scan with Async & Parallel
λΉλκΈ°λ₯Ό νμ©ν ν
μ΄λΈ ν μ€μΊ μ±λ₯ ν
μ€νΈ.
> ν
μ΄λΈ ν μ€μΊμ ν
μ΄λΈμ λͺ¨λ rowλ₯Ό μ‘°ννκΈ° λλ¬Έμ, λ°μ΄ν°κ° λ§μ κ²½μ° μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμ΅λλ€. νμ§λ§ λ°μ΄ν°κ° λ§λλΌλ `λΆν `κ³Ό `λΉλκΈ°λ₯Ό νμ©ν λ³λ ¬ μ²λ¦¬`λ₯Ό νλ©΄ νΉμ μν©μμλ κ½€ μ’μ
> μ±λ₯μ λΌ μ μμ΅λλ€.
## 1. μꡬ μ¬ν
μ΄λ²€νΈ νλ‘μ°λ λ€μκ³Ό κ°μ΅λλ€. μλ¦Ό μ‘μ μ λ³λμ μμ€ν
μ΄ νμνκΈ° λλ¬Έμ κ³ λ €νμ§ μμ΅λλ€.
1. μλ¦Ό λ©μμ§λ₯Ό μ μ‘νλ€.
2. μ 체 μ¬μ©μλ 2,000 λ§ λͺ
μ΄λ©°, μλ¦Ό μμ μ λμν μ¬μ©μμκ²λ§ μλ¦Όμ μ μ‘νλ€.
3. λ¨μΌ μ ν리μΌμ΄μ
/λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ€.
### Step1. λΉλκΈ°λ₯Ό νμ©ν΄ μλ¦Όμ μ μ‘νλ€.
λ°μ΄ν°κ° λ§μ κ²½μ°, ν
μ΄λΈ ν μ€μΊμ μ¬μ©νλ©΄ λͺ¨λ rowλ₯Ό μ½κΈ° λλ¬Έμ μκ°μ΄ μ€λ 걸릴 μ μμΌλ―λ‘, `λΉλκΈ°`λ₯Ό νμ©ν΄ μ΄λ₯Ό κ°μ νλ€.
1. λΉλκΈ°λ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ€.
2. λͺ¨λν°λ§μ ν΅ν΄ μμ μ¬μ©λ₯ μ 체ν¬νλ€.
### Step2. νμ€ν¬ μ μ€μ λλΉνλ€.
λ©μΈμ§ ν(Message Queue)λ₯Ό μ¬μ©νλ κ²½μ°, μλμΉ μκ² νμ€ν¬κ° μ μ€λλ κ²½μ° κ° λ°μνλ€. λ©μμ§κ° μ μ€λ κ²½μ°, μ΄λ₯Ό λλΉν μ μλλ‘ νλ€.
1. λ©μμ§ μ μ€μ λλΉνλ€.
2. λ©μμ§ νλ μ΄λ€ κ²μ μ¬μ©ν΄λ μκ΄μλ€.
3. μΈλΆ λ©μμ§ μμ€ν
μ λμ
νμ μ, μ±λ₯ λ³νλ₯Ό μΈ‘μ νλ€.
## 2. μμ΄λμ΄
μμ΄λμ΄λ `λΆν `κ³Ό `λΉλκΈ°λ₯Ό νμ©ν λ³λ ¬ μ²λ¦¬` μ
λλ€.
- λΆν
- λΉλκΈ°λ₯Ό νμ©ν λ³λ ¬ μ²λ¦¬
λ¨Όμ νλμ ν° νμ€ν¬λ₯Ό μ μ ν λ¨μ(chunk)λ‘ λΆν ν©λλ€.

κ° νμ€ν¬λ μμ μ΄ μ²λ¦¬ν μμ
μ μμ/λμ μ μκ³ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ `λ°μ΄ν° μ€λ³΅ μ²λ¦¬λ₯Ό λ°©μ§`νλ©°, `μΈλ±μ€(Index)λ₯Ό νμ©`ν μ μκ² λ©λλ€.

μ΄ν κ° νμ€ν¬λ₯Ό `λΉλκΈ°λ₯Ό ν΅ν λ³λ ¬λ‘ μ²λ¦¬`ν©λλ€.

## 3. κ²°κ³Ό
2,000λ§ κ±΄ μ²λ¦¬ μ 1λΆ ~ 1λΆ 45μ΄.
```shell
# μ½, 1λΆ 31μ΄(91.16)
127.0.0.1:6379> get time::string::startTime
"1710619193857"
127.0.0.1:6379> get time::string::endTime
"1710619285018"
```
```shell
# μ½ 1λΆ 26μ΄(86.45)
127.0.0.1:6379> get time::string::startTime
"1710619455453"
127.0.0.1:6379> get time::string::endTime
"1710619541899"
```
```shell
# μ½ 1λΆ 38μ΄(98.73)
127.0.0.1:6379> get time::string::startTime
"1710619665364"
127.0.0.1:6379> get time::string::endTime
"1710619764089"
```
## 4. νκ³
νμ€ν¬ μ€ν μ€ μλ‘μ΄ λ°μ΄ν°κ° μΆκ° λμ λ, μ΄λ₯Ό μ²λ¦¬ν μ μλ λ°©μμ΄ μμ΅λλ€. μλ₯Ό λ€μ΄, 2,000λ§ μ¬μ©μμκ² μλ¦Όμ λ°μ‘νλ λμ€ μλ‘μ΄ μ¬μ©μκ° κ°μ
μ νλ€λ©΄ μ΄λ₯Ό λμ²ν λ°©λ²μ΄ μμ΅λλ€. λ°λΌμ
λͺ¨λ λ‘μ§μ΄ λλ ν, μλ‘ μΆκ°λ μ¬μ©μλ€μ λ³λμ λ‘μ§μΌλ‘ μ²λ¦¬ν΄μ€μΌ ν©λλ€.
```kotlin
interface UserRepository : JpaRepository {
@Query("SELECT u FROM user u WHERE u.id > maxUserId")
fun findByIdOver(maxUserId: Long): List
}
```
> λν μ΄ μΈμλ μ°λ λ ν κ°μ μ€μ , 컀λ₯μ
κ΄λ¦¬, λͺ¨λν°λ§ λ±μ μΆκ° μ΄μκ° μμ΅λλ€. μμΈ λ΄μ©μ λΈλ‘κ·Έλ₯Ό μ°Έμ‘°ν΄μ£ΌμΈμ.