S/۰۲ · خدمات
API و بکاند
بخشی که کسی نمیبیند، ساختهشده تا هرگز به چشم نیاید.
APIهای REST و gRPC، وبهوک، کارهای پسزمینه و یکپارچهسازیها، نوشتهشده با Go. سریع، کمهزینه و به بهترین شکل «بیحادثه» — در حالی که همهچیز اطرافشان تغییر میکند، کار میکنند.
- زبان
- Go
- رابطها
- REST، gRPC، وبهوک، رویداد
- همراه با
- تست، مستندات، داشبورد
- ۰۱
وبسایت، اپلیکیشن و پنل مدیریت شما همه به یک داده نیاز دارند.
- ۰۲
بکاند فعلی کند، شکننده یا پرهزینه است.
- ۰۳
به سرویسهای بیرونی وابستهاید که به روشهای خلاقانه از کار میافتند.
- ۰۴
تیمتان به APIای نیاز دارد که بفهمد و گسترشش بدهد.
- D/۰۱
API مستند
قرارداد را پیش از کد مینویسیم: هر endpoint، هر فیلد و هر خطا، با OpenAPI یا protobuf. تیم وب، اپ و شرکای شما از روز اول میتوانند بر اساسش کار کنند، و مستندات از همان فایل ساخته میشود، پس همیشه با کاری که سرور واقعاً میکند یکی است.
شامل
- قرارداد کامل با OpenAPI 3 یا protobuf
- یک نمونهی کارا برای هر endpoint
- کد خطاهایی که میگویند چه اشتباه شد و چه باید کرد
- قواعد نسخهبندی، تا تغییرات کلاینتهای قدیمی را از کار نیندازد
api/openapi.yaml POST /v1/orders · ثبت سفارش
Shop API · v1.4
درخواست
- items: فهرستی از { sku, qty }، دستکم یک قلم.
- هدر Idempotency-Key: یک کلید هرگز دو سفارش نمیسازد.
پاسخها
- 201 Created: سفارش، همراه با هدر Location.
- 409 out_of_stock: کدام SKU، و چند عدد باقی مانده.
- 422 invalid_items: برای هر فیلد یک خطا.
خطاها
- بدنهی همهی خطاها یک شکل دارد: { code, message, field }.
احراز هویت
- توکن Bearer با دسترسی orders:write.
- D/۰۲
دادهی درست
جدولهای PostgreSQL را بر اساس کوئریهایی طراحی میکنیم که محصول شما واقعاً اجرا میکند، با قیدهایی که دادهی نادرست را از همان ابتدا راه نمیدهند. هر تغییر یک مایگریشن نسخهدار است، پس اسکیمای محیط واقعی همیشه همانی است که در مخزن کد هست.
شامل
- اسکیما با کلیدها، قیدها و توضیح هر ستون
- مایگریشنهای نسخهدار که رو به جلو و عقب اجرا میشوند
- ایندکسهایی که با پلن واقعی کوئریها سنجیده شدهاند
- پشتیبانگیری، و بازیابیای که آزموده شده است
migrations/0004_orders.sql - D/۰۳
کارهای پسزمینه
هر کار کند یا ناپایداری از دل درخواست بیرون میرود: فرستادن رسید، همگامسازی موجودی، ساختن گزارش. کارها از یک صف میگذرند، کار ناموفق با فاصلهی فزاینده دوباره اجرا میشود، و کاری که مدام شکست میخورد جایی مینشیند که یک آدم آن را ببیند.
شامل
- صف و workerهایی به اندازهی بار شما
- کارهای زمانبندیشده در خود کد، نه پنهان در یک crontab
- تلاش مجدد با فاصلهی فزاینده، و کارهایی که تکرارشان بیخطر است
- صف پیامهای ناموفق، با هشدار وقتی پر میشود
docs/jobs.mmd - D/۰۴
یکپارچهسازی
هر سرویس بیرونی یک لایهی نازک دور خودش میگیرد، با مهلت، تلاش مجدد و راه جایگزین مخصوص به خودش. روزی که درگاه پرداخت یا سامانهی پیامک مشکل دارد، سفارشهایتان منتظر میمانند یا از مسیر دیگری میروند و از دست نمیروند، و میتوانید یک سرویسدهنده را بیآنکه به بقیهی کد دست بزنید عوض کنید.
شامل
- یک آداپتور کوچک برای هر سرویسدهنده، پشت یک رابط واحد
- مهلت، تلاش مجدد و راه جایگزین برای هر کدام
- پردازش وبهوک با بررسی امضا و نادیده گرفتن تکراریها
- سرویسدهندههای ساختگی برای تست، تا هیچ چیز اشتباهی سرویس واقعی را صدا نزند
internal/integrations/README.md سرویس مهلت تلاش مجدد وقتی از کار بیفتد پرداخت ۵ ثانیه ۳ بار، با فاصله سفارش در انتظار میماند و یک کار دوباره بررسی میکند پیامک ۳ ثانیه ۵ بار، با فاصله به سرویسدهندهی دوم میرود ایمیل ۱۰ ثانیه ۵ بار، با فاصله در صف میماند و سفارش معطل نمیشود نقشه ۲ ثانیه ۱ بار نتیجهی ذخیرهشده، وگرنه فقط کد پستی ارسال ۸ ثانیه ۳ بار برچسب بعداً صادر میشود و به مشتری خبر میدهیم - D/۰۵
مشاهدهپذیری
هر درخواست لاگ ساختیافته، متریک و یک trace به جا میگذارد که میشود آن را میان سرویسها دنبال کرد. داشبوردها همان چند عددی را نشان میدهند که مهم است، و هشدارها روی چیزی به صدا درمیآیند که کاربر حس میکند، مثل کند شدن پرداخت یا بلند شدن صف.
شامل
- لاگ JSON ساختیافته با شناسهی درخواست
- متریک و trace با OpenTelemetry
- داشبورد تأخیر، خطا، ترافیک و صفها
- هشدارهایی با یک یادداشت کوتاه دربارهی اولین چیزی که باید بررسی شود
grafana · shop-api تأخیر p95
۴۲ ms
هدف: زیر ۱۵۰ میلیثانیه
نرخ خطا
۰٫۰۳٪
خطاهای 5xx، ۲۴ ساعت گذشته
درخواست در ثانیه
۲۸۰
اوج، عصر جمعه
تأخیر صف
۱٫۸ s
هشدار بالای ۳۰ ثانیه
- D/۰۶
تست و CI
تستهای واحد منطق برنامه را پوشش میدهند، تستهای یکپارچگی روی یک PostgreSQL واقعی داخل کانتینر اجرا میشوند، و هر دو با هر push اجرا میشوند. تغییری که تستی را بشکند، از linter رد نشود یا مایگریشنی را جا بیندازد، ادغام نمیشود.
شامل
- تست واحد برای قواعد کسبوکار و حالتهای مرزی
- تست یکپارچگی روی پایگاه داده و صف واقعی
- پایپلاینی که lint، تست و ساخت کانتینر را انجام میدهد
- تشخیص race و گزارش پوشش در هر اجرا
ci · pipeline #482 $ go vet ./... && staticcheck ./...
✓ no issues
$ go test -race -cover ./...
✓ 412 passed · coverage 81%
$ go test -tags=integration ./internal/store
× TestReserveStock: stock went below zero
! merge blocked until the pipeline is green
- ۰۱
اول قرارداد
API را همراه با کسانی که صدایش میزنند طراحی میکنیم، پیش از نوشتن کد پشتش.
- ۰۲
ساخت برشبهبرش
هر برش از پایگاه داده تا endpoint کامل کار میکند و زود مستقر میشود.
- ۰۳
تست بار و خرابی
آن را از ترافیک مورد انتظار فراتر میبریم و وابستگیهایش را از زیر پایش میکشیم.
- ۰۴
تحویل
راهنمای اجرا، داشبوردها و یک جلسهی مرور، تا تیمتان با اطمینان مالکش باشد.
ساخت یک بکاند تازه معمولاً هشت تا دوازده هفته طول میکشد و اولین برش کارا ظرف سه هفته بالا میآید. هر هفته آن را روی سرور آزمایشی در حال کار میبینید، پس پیشرفت واقعی را خودتان میسنجید، نه از روی یک گزارش وضعیت.
- هفتهی ۱
قرارداد API، نوشتهشده با کسانی که صدایش میزنند، و مدل دادهی پشت آن.
- هفتهی ۲ و ۳
اولین برش از پایگاه داده تا endpoint، مستقر روی سرور آزمایشی، همراه با CI.
- هفتهی ۴ تا ۸
باقی برشها، یکپارچهسازیها و کارهای پسزمینه، هر کدام همان وقت که کار کرد تحویل میشود.
- هفتهی ۹ و ۱۰
تست بار و خرابی، و بعد تنظیم داشبوردها و هشدارها بر اساس آنچه یاد گرفتیم.
- هفتهی ۱۱ و ۱۲
راهاندازی، راهنمای اجرا و یک جلسهی مرور با تیم شما.
کد
کل مخزن کد، با تاریخچهاش، در حساب Git خود شما.
قرارداد API
فایلهای OpenAPI یا protobuf، با مستندات و کتابخانههای کلاینتی که از آنها ساخته میشود.
مایگریشنهای پایگاه داده
هر تغییر اسکیما به شکل یک فایل نسخهدار که میتواند پایگاه داده را از صفر بسازد.
داشبوردها و هشدارها
به شکل کد، تا همراه سرویس به هر محیطی منتقل شوند.
راهنماهای اجرا
وقتی هشداری آمد چه باید کرد، و چطور مستقر کرد، برگرداند و بازیابی کرد.
یک ماه پشتیبانی پس از راهاندازی
تا تیمتان جا بیفتد، برای سؤالها و اصلاحها در دسترسیم.
- Go
- PostgreSQL
- Redis
- NATS
- gRPC
- OpenAPI
- OpenTelemetry
- Docker
چرا Go؟
به یک فایل اجرایی کوچک کامپایل میشود، ترافیک سنگین را روی سختافزار معمولی تحمل میکند و برای نگهدارندهی بعدی خوانا میماند.
میتوانید با بکاند فعلی ما کار کنید؟
بله. اغلب یک API تمیز جلوی سیستم قدیمی میگذاریم و آن را تکهتکه جایگزین میکنیم.
میزبانیاش با کیست؟
با شما، با ما، یا روی کلاد شما راهاندازی میکنیم. همهچیز به شکل کانتینر و زیرساخت بهصورت کد تحویل میشود.
چقدر طول میکشد؟
برای بیشتر بکاندهای تازه هشت تا دوازده هفته. یک API تمیز جلوی سیستمی که از قبل هست میتواند ظرف چهار هفته بالا بیاید.
برنامهنویسهای خودمان میتوانند تحویلش بگیرند؟
بله، و از اول برای همین برنامهریزی میکنیم. کد Go ساده با وابستگیهای کم است، و تستها، مستندات و راهنماهای اجرا برای هر کسی نوشته شدهاند که بعد از ما سراغشان میرود.
بگویید چه چیزی میسازید.
هر پروژه با یک جلسهی مشاوره شروع میشود: شما ایده و هر آنچه میدانید را میآورید، ما آن را به طرحی تبدیل میکنیم که بشود رویش ساخت.
رزرو مشاوره