بهینه سازی و ذخیره سازی مجمع
(بخش: تکنولوژی و زیرساخت)
خلاصه ای کوتاه
سرعت CI/CD در iGaming به طور مستقیم بر میزان انتشار، هزینه دقیقه و ثبات p99 در بارهای پیک تاثیر می گذارد. کلید اصلی حافظههای نهان صحیح (وابستگیها، مصنوعات، لایههای محفظه، نتایج کامپایل میانی)، ساختهای افزایشی و جبرگرایی است. ساخت «خوب» به سرعت با ورودی بدون تغییر تکرار می شود و ناتوانی حافظه پنهان قابل پیش بینی و کنترل است.
1) کش نقشه و آنچه ما کش
وابستگی ها: بسته های NPM/PNPM، چرخ های پیپ/شعر، MAVEN/GRADLE، رفتن MODS، محموله جعبه، NuGet.
مصنوعات کامپایل متوسط: «~/.cache/pip»، «~/.m2»، «.gradle»، «~/.cargo/registry/»،« $ GOMODCACHE »،« هدف/»، «build/»،« node _ modules/.pnpm-store ».
لایه های کانتینر: حافظه پنهان لایه Docker (حافظه پنهان BuildKit/GHA)، حافظه پنهان مبتنی بر رجیستری، چند مرحله ای.
ابزارها و SDK ها: Toolchains/microimages (اهداف JDK، Node، Python، Rustup).
Mono/polyrepo-meta: Nx/Turborepo/Bazel remote-cache برای وظایف (lint/test/build).
داده های تست و رفع e2e: عکس های فوری پایگاه داده که توسط بسته های UI تهیه شده است.
ML/data: مجموعه داده های آماده، جاسازی، موتورهای کامپایل شده (TensorRT/ONNX).
2) اصول مونتاژ سریع و قابل پیش بینی
1. جبرگرایی: نسخه های ثابت (lockfiles), تصاویر پایه پین, پلاگین های hermetic → خروجی تجدید.
2. Idempotence: همان مونتاژ → همان مصنوعات و هش ها.
3. افزایش: بازسازی تنها تغییر (DAG/needs/matrix/affected).
4. محل و «گرما»: انبارها در کنار دونده ها/در رجیستری، گرم شدن قبل از قله.
5. ناتوانی صریح: کلیدهای کش توسط فایل های lockfile/configuration و با هش محتوا.
6. بهداشت: TTL/' expire _ in '، تمیز کردن خودکار، کنترل اندازه کش و مصنوعات.
7. امنیت زنجیره تامین: کش ≠ سطل زباله برای اسرار ؛ امضای SBOM/artifact همچنان اجباری است.
3) Docker/OCI: تصاویر سریع بدون مونتاژ
الگو ها
چند مرحله ای (سازنده → زمان اجرا).
حداقل زمان اجرا (distroless/ubi-micro، فقط لازم است so/ca-certs).
ترتیب لایه: ابتدا به ندرت تغییر می کند (بخش ها)، سپس کد.
'.dockerignore': حذف '.git'، آزمایشات/وسایل، حافظه های محلی.
BuildKit: «cache-from/to» → کش مشترک بین کارها و شاخه ها.
مثال پرونده اسناد) گره + pnpm (
dockerfile syntax=docker/dockerfile:1.7
FROM node:20-bookworm AS deps
WORKDIR /app
COPY pnpm-lock.yaml./
RUN corepack enable && pnpm fetch
FROM node:20-bookworm AS builder
WORKDIR /app
COPY --from=deps /root/.cache/pnpm /root/.cache/pnpm
COPY package.json pnpm-lock.yaml./
RUN corepack enable && pnpm install --offline
COPY..
RUN pnpm build
FROM gcr.io/distroless/nodejs20 AS runtime
WORKDIR /app
COPY --from=builder /app/dist./dist
USER 10001
CMD ["dist/server.js"]
BuildKit в CI (اقدامات GitHub)
yaml
- uses: docker/setup-buildx-action@v3
- uses: actions/cache@v4 with:
path: /tmp/.buildx-cache key: buildx-${{ github.ref }}-${{ github.sha }}
restore-keys: buildx-${{ github.ref }}-
- uses: docker/build-push-action@v6 with:
push: true tags: ${{ env.IMAGE }}
cache-from: type=gha cache-to: type=gha,mode=max
4) اکوسیستم زبان: چه به کش و چگونه
جاوا/کاتلین (MAVEN/GRADLE)
کش از راه دور Gradle، همزمانی، پیکربندی بر اساس تقاضا.
کلید نهانگاه: hash 'build. gradle [.kts] '+ lockfiles +' بسته بندی gradle. املاک و مستغلات
انتشار ساخت گره کش به شی ذخیره سازی/HTTP.
کامپایل افزایشی و تست تقسیم شده توسط بسته.
yaml
GitLab CI cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/caches,.gradle/wrapper ]
script:
-./gradlew --build-cache --parallel build
گره ها js (npm/pnpm/نخ)
حافظه نهان محلی ('~/.npm'، '~/.cache/pnpm')، کلید lockfile.
Nx/Turborepo remote-cache (S3/Redis) برای وظایف (lint/test/build).
'turbo run build --cache-dir = .turbo' و حالت «آسیب دیده» برای monorepos.
پایتون (پیپ/شعر)
چرخ کش + virtualenv ؛ کلید با درخواست شعر رو قفل کن قفل کن.
مونتاژ چرخ ها در یک مرحله جداگانه، استفاده مجدد بین ماتریس ها.
برای برنامه های افزودنی C - 'pip wheel' + 'auditwheel' در تصویر سازنده.
برو برو
Кэш «GOMODCACHE»، «GOCACHE» ؛ رفع 'GOTOOLCHAIN '/نسخه ها.
مراحل را تقسیم کنید: «go mod download» → یک کپی از کد → «go build».
برای مونوریل های بزرگ - Bazel/Bazelisk یا «mage» با ساخت لایه.
زنگ زدن
'~/.cargo/registry', '~/.cargo/git', 'target/'; sccache (از راه دور/محلی).
به اشتراک گذاری کش بین شاخه ها در Cargo. قفل کن.
C/C + +
ccache/sccache + کلید توسط پرچم کامپایلر و نسخه های SDK.
زنجیره ابزار را در یک تصویر اساسی جداگانه بیرون بیاورید.
5) Bazel/Nx/Turborepo: وظیفه و حافظه پنهان نمودار
کش از راه دور بازل (HTTP/ابر) - محتوا آدرس پذیر; سفت و سخت، جعبه های شن و ماسه.
Nx/Turborepo - حافظه نهان خروجیهای وظیفه و اجرای «فقط تحت تأثیر» در monorepos.
معلولیت: بستگی به ورودی های مرحله (فایل ها/پرچم ها/متغیرها) دارد.
6) استراتژی های ناتوانی کش
Key = هش ورودی ها: فایل های قفل، پیکربندی کامپایلر، مانیفست ها.
ناتوانی خفیف: 'بازگرداندن کلید' (GHA )/پیشوند (GLCI).
ناتوانی سخت: چرخش فضای نام/کلید برای تغییرات بحرانی.
جداسازی لایه: deps vs sources - کد را بدون شکستن وابستگی های سنگین تغییر دهید.
7) ساخت افزایشی و ماتریس
DAG/نیازها: جابجایی های وابسته را به صورت موازی اجرا کنید، منتظر توالی نباشید.
Paths-filter - فقط برای اجزای آسیب دیده فعال می شود.
تست های شارد: توسط دایرکتوری ها/دانه، مدت زمان تراز.
دونده گرم استخر: تصاویر از قبل گرم/انبارها قبل از قله (مسابقات/مبارزات).
8) مصنوعات در مقابل کش: چگونه متفاوت است
کش: ورودی استفاده مجدد/نتایج متوسط، منطقه کثیف، TTL کوتاه/متوسط.
مصنوعات: مجامع نهایی (تصاویر، باینری، نمودار)، غیر قابل تغییر، امضا شده، با SBOM.
قوانین: حافظه پنهان به شدت تمیز می شود، مصنوعات با توجه به سیاست انتشار ذخیره می شوند.
9) قابلیت مشاهده، KPI و FinOps
معیارها (بر اساس خط لوله/مخزن):- نرخ ضربه کش (٪)، شروع گرم در مقابل زمان شروع سرد، مدت زمان متوسط/متوسط مراحل.
- هزینه در هر خط لوله/کار، کش/اندازه مصنوع، توان (شغل/ساعت).
- سهم «تحت تاثیر اجرا می شود» در monorepo، بازسازی بدون تغییر (زباله).
- نرخ ضربه به زیر آستانه سقوط می کند، زمان تصویر را افزایش می دهد، مصنوعات باد می کنند، SLO از دست می رود.
10) امنیت کش و زنجیره تامین
هیچ رازی در نهانگاه/مصنوعات وجود ندارد ؛ ماسک وارس، اسکن اسرار.
پین SHA اقدامات خارجی/پلاگین ها، فقط دونده مورد اعتماد.
امضای ظروف/باینری (cosign), SBOM (CycloneDX/SPDX) و چک کردن برای CD.
جداسازی: فضای نام کش جداگانه برای 'dev/stage/prod'، حقوق فقط خواندنی برای شاخه های خارجی.
11) قالب های عملی
اقدامات GitHub - زبان + کانتینر
yaml name: ci on: [push, pull_request]
concurrency: { group: ${{ github.ref }}, cancel-in-progress: true }
jobs:
build:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: { node-version: '20' }
- uses: actions/cache@v4 with:
path: ~/.cache/pnpm key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- run: corepack enable && pnpm i --frozen-lockfile
- run: pnpm build
- uses: docker/build-push-action@v6 with:
tags: ${{ env.IMAGE }}
cache-from: type=gha cache-to: type=gha,mode=max
GitLab CI - کش از راه دور Gradle
yaml variables:
GRADLE_USER_HOME: ".gradle"
cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/wrapper,.gradle/caches ]
build:
stage: build script:
-./gradlew --build-cache --no-daemon build artifacts:
paths: [ "build/libs/.jar" ]
expire_in: 3 days
جنکینز - ccache/sccache
groovy pipeline {
agent { label 'cpp' }
environment { CCACHE_DIR = '/cache/ccache' }
stages {
stage('Build') {
steps {
sh 'ccache -M 10G'
sh 'cmake -B build -S. && cmake --build build -j$(nproc)'
}
}
}
post { always { sh 'ccache -s' } }
}
12) ML/data: سرعت بخشیدن به مجموعه های سنگین
موتورهای TensorRT/ONNX قبل از مونتاژ به عنوان مصنوعات انتشار ؛ استفاده مجدد در استنتاج
کش از مدل/تعبیه/مجموعه داده در دونده NVMe محلی ؛ نسخه بندی هش.
مصنوعات خرد شده (تقسیم) برای مدل های بزرگ ؛ TTL و تمیز کردن به تعویق افتاد.
13) چک لیست پیاده سازی
1. lockfiles و تصاویر پایه را مرتکب شوید فعال کردن BuildKit.
2. لایه های جداگانه Docker: گروه ها → کد ؛ '.dockerignore' را اضافه کنید.
3. بالا بردن کش از راه دور (Gradle/Bazel/Nx/Turbo) ؛ پروکسی وابستگی را شروع کنید.
4. پیکربندی نهانگاه وابستگی در CI توسط lockfile ؛ شامل ماتریس ها و «paths-filter» است.
5. بیلهای افزایشی و «فقط تحت تأثیر» را در مونورپو وارد کنید.
6. اندازه گیری نرخ ضربه، زمان گرم/سرد، هزینه ؛ هشدارها را بالا ببرید
7. SBOM/امضا را فعال کنید، اسرار را در حافظه پنهان انکار کنید.
8. گرم کردن انبارها قبل از انتشار پیک ؛ TTL/احتباس را تنظیم کنید.
9. ناتوانی حافظه پنهان سند و کتابهای اجرا به عنوان «حافظه پنهان شکسته».
10. به طور منظم تمیز «ابدی» انبارها و آرشیو مصنوعات سنگین.
14) ضد گلوله
Dockerfile بزرگ با مراحل اغلب در حال تغییر قبل از نصب گروه ها.
به اشتراک گذاشته «دائمی» کش بدون کلید/TTL → تکه و زباله.
مخلوط کردن مصنوعات و کش ؛ بدون امضا/SBOM.
نسخههای غیرفشرده ابزارها → «cache is, but not repeated».
ماتریس «برای همه» در هر روابط عمومی ؛ عدم هماهنگی " را لغو کند.
دونده تک بدون کش گرم و بدون پروکسی وابستگی.
نتایج به دست آمده
بهینه سازی مجمع یک کار سیستماتیک با کش، افزایش و جبرگرایی است. ساختار Dockerfile صحیح، کش از راه دور برای ساخت، پروکسی وابستگی و نظم و انضباط ناتوانی را به خطوط لوله سریع، ارزان و تجدید پذیر. قوانین مشاهده و ایمنی را اضافه کنید - و نسخه های شما مکرر، پایدار و اقتصادی خواهد بود.