diff --git a/.DS_Store b/.DS_Store index 89b2089..3333a8d 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index e7ca47e..2a22e68 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -3,8 +3,7 @@ name: CD - Build & Deploy on: push: branches: - - feature/bulk-v3 - - feat/producer-rps-optimization + - main workflow_dispatch: env: diff --git a/README.md b/README.md deleted file mode 100644 index c18ac47..0000000 --- a/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# πŸ‘€ Panopticon - -β€œλͺ¨λ“  μ„œλΉ„μŠ€μ˜ 둜그λ₯Ό ν•œλˆˆμ— κ΄€μ°°ν•˜λ‹€.” - -## 🌿 Branch Naming - -| νƒ€μž… | μ˜ˆμ‹œ | μ„€λͺ… | -| ------------- | ----------------------- | ----------------------------------------------------- | -| **feature/** | `feature/signup-ui` | μƒˆλ‘œμš΄ κΈ°λŠ₯ 개발 | -| **fix/** | `fix/post-api-error` | 였λ₯˜ μˆ˜μ • (일반 + κΈ΄κΈ‰) | -| **refactor/** | `refactor/comment-hook` | λ¦¬νŒ©ν† λ§ (κΈ°λŠ₯ λ³€ν™” μ—†κ³  μ½”λ“œ ꡬ쑰 κ°œμ„ κ³Ό κ΄€λ ¨) | -| **test/** | `test/routing-next` | ν…ŒμŠ€νŠΈ (κΈ°λŠ₯ 개발과 관계없이 ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν• λ•Œ) | -| **...** | `...` | μ½”λ“œ κ΅¬ν˜„κ³Ό κ΄€λ ¨μ—†λŠ” μ΄μ™Έμ˜ μž‘μ—…λ“€μ€ λ°”λ‘œ Main에 컀밋 | - ---- - -> 각 λΈŒλžœμΉ˜λŠ” **μž‘μ—… λͺ©μ μ΄ λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚˜λ„λ‘** 이름을 λΆ™μ΄μ„Έμš” -> 예: `feature/login-api`, `fix/user-auth-bug`, `refactor/dashboard-layout` - ---- - -## πŸ’¬ Conventional Commits - -``` -(): -``` - -- **type**: μ»€λ°‹μ˜ μœ ν˜• (예: `feat`, `fix`, `docs` λ“±) -- **scope**: λ³€κ²½λœ λ²”μœ„λ‚˜ μ˜μ—­ (선택 사항) -- **subject**: κ°„λ‹¨ν•œ λ³€κ²½ λ‚΄μš© μ„€λͺ… - ---- - -| νƒ€μž… | μ„€λͺ… | μ˜ˆμ‹œ | -| ------------------- | ----------------------------------------------------------------- | --------------------------------------------- | -| **feat** | μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ μ‚¬μš© | `[feat(auth)]: μ†Œμ…œ 둜그인 κΈ°λŠ₯ μΆ”κ°€` | -| **refactor** | μ½”λ“œ λ¦¬νŒ©ν† λ§, κΈ°λŠ₯ μΆ”κ°€λ‚˜ 버그 μˆ˜μ • μ•„λ‹˜ | `[refactor(user-service)]: 둜직 μ΅œμ ν™”` | -| **fix** | 버그 μˆ˜μ • μ‹œ μ‚¬μš© | `[fix(api)]: 둜그인 였λ₯˜ μˆ˜μ •` | -| **docs** | λ¬Έμ„œ μˆ˜μ • (μ½”λ“œ λ³€κ²½ μ—†μŒ) | `[docs(readme)]: μ„€μΉ˜ κ°€μ΄λ“œ μ—…λ°μ΄νŠΈ` | -| **style** | μ½”λ“œ ν˜•μ‹μ΄λ‚˜ 포맷 λ³€κ²½ (κΈ°λŠ₯ λ³€ν™” μ—†μŒ) | `[style(global)]: λ“€μ—¬μ“°κΈ° κ·œμΉ™ 톡일` | -| **test** | ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€ λ˜λŠ” μˆ˜μ • | `[test(api)]: 인증 κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μΆ”κ°€` | -| **chore** | λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€ λ³€κ²½, νŒ¨ν‚€μ§€ μ—…λ°μ΄νŠΈ λ“± μ½”λ“œμ™€ 직접 κ΄€λ ¨ μ—†λŠ” μž‘μ—… | `[chore(build)]: μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ μ—…λ°μ΄νŠΈ` | -| **perf** | μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•œ μ½”λ“œ λ³€κ²½ | `[perf(images)]: 이미지 λ‘œλ”© 속도 κ°œμ„ ` | -| **BREAKING CHANGE** | ν˜Έν™˜μ„±μ„ κΉ¨λŠ” λ³€κ²½ 사항을 μ„€λͺ…ν•  λ•Œ μ‚¬μš© | `[BREAKING CHANGE]: μŠ€ν‚€λ§ˆκ°€ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.` | \ No newline at end of file diff --git a/backend/src/shared/common/kafka/kafka.config.ts b/backend/src/shared/common/kafka/kafka.config.ts index 956d5eb..caf0b73 100644 --- a/backend/src/shared/common/kafka/kafka.config.ts +++ b/backend/src/shared/common/kafka/kafka.config.ts @@ -60,6 +60,18 @@ interface KafkaMicroserviceParams { type KafkaSecurityOverrides = Pick; +// fetch μ˜΅μ…˜ κΈ°λ³Έκ°’ (ν™˜κ²½ λ³€μˆ˜κ°€ 없을 λ•Œ μ‚¬μš©) +const DEFAULT_FETCH_MAX_BYTES = 50 * 1024 * 1024; // 50MB +const DEFAULT_FETCH_MAX_BYTES_PER_PARTITION = 10 * 1024 * 1024; // 10MB +const DEFAULT_FETCH_MIN_BYTES = 1 * 1024 * 1024; // 1MB +const DEFAULT_FETCH_MAX_WAIT_MS = 50; + +// μ–‘μˆ˜μΈ μ •μˆ˜ ν™˜κ²½ λ³€μˆ˜λ§Œ μΆ”μΆœν•΄ Kafka fetch μ˜΅μ…˜μ— μ•ˆμ „ν•˜κ²Œ λ°˜μ˜ν•œλ‹€. +function parsePositiveInt(value: string | undefined): number | undefined { + const parsed = Number.parseInt(value ?? "", 10); + return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined; +} + function buildKafkaSecurityConfig(): KafkaSecurityOverrides { const sslEnabled = process.env.KAFKA_SSL === "true"; const sslRejectUnauthorized = @@ -147,6 +159,19 @@ export function createKafkaMicroserviceOptions( process.env.KAFKA_CONCURRENT_PARTITIONS ?? "3", 10, ), + // fetch μš©λŸ‰/λŒ€κΈ° μ‹œκ°„μ„ ν™˜κ²½ λ³€μˆ˜λ‘œ μ‘°μ ˆν•΄ ν•œ λ²ˆμ— 더 λ§Žμ€ λ ˆμ½”λ“œλ₯Ό λŒμ–΄μ˜¬ 수 μžˆλ‹€. + maxBytes: + parsePositiveInt(process.env.KAFKA_FETCH_MAX_BYTES) ?? + DEFAULT_FETCH_MAX_BYTES, + maxBytesPerPartition: + parsePositiveInt(process.env.KAFKA_FETCH_MAX_BYTES_PER_PARTITION) ?? + DEFAULT_FETCH_MAX_BYTES_PER_PARTITION, + minBytes: + parsePositiveInt(process.env.KAFKA_FETCH_MIN_BYTES) ?? + DEFAULT_FETCH_MIN_BYTES, + maxWaitTimeInMs: + parsePositiveInt(process.env.KAFKA_FETCH_MAX_WAIT_MS) ?? + DEFAULT_FETCH_MAX_WAIT_MS, }, }, }; diff --git a/backend/src/stream-processor/common/bulk-indexer.service.ts b/backend/src/stream-processor/common/bulk-indexer.service.ts index 7df3c9b..f26f480 100644 --- a/backend/src/stream-processor/common/bulk-indexer.service.ts +++ b/backend/src/stream-processor/common/bulk-indexer.service.ts @@ -37,10 +37,10 @@ export class BulkIndexerService implements OnModuleDestroy { this.client = this.storage.getClient(); this.maxBatchSize = Math.max( 1, - Number.parseInt(process.env.BULK_BATCH_SIZE ?? "1000", 10), + Number.parseInt(process.env.BULK_BATCH_SIZE ?? "6000", 10), ); const byteLimitMb = Number.parseFloat( - process.env.BULK_BATCH_BYTES_MB ?? "10", + process.env.BULK_BATCH_BYTES_MB ?? "32", ); this.maxBatchBytes = Math.max(1024, Math.floor(byteLimitMb * 1024 * 1024)); this.flushIntervalMs = Math.max( @@ -49,7 +49,7 @@ export class BulkIndexerService implements OnModuleDestroy { ); this.maxParallelFlushes = Math.max( 1, - Number.parseInt(process.env.BULK_MAX_PARALLEL_FLUSHES ?? "3", 10), + Number.parseInt(process.env.BULK_MAX_PARALLEL_FLUSHES ?? "6", 10), ); }