GH GambleHub

gRPC: پروتکل های باینری و عملکرد

TL ؛ دکتر متخصص

gRPC = HTTP/2 + Protobuf + قراردادهای سختگیرانه + جریان. این تاخیر کم، ترافیک کارآمد و قراردادهای پایدار بین خدمات را فراهم می کند. ایده آل برای تماس های داخلی شمال-جنوب/شرق-غرب، کانال های زمان واقعی (جریان سرور/مشتری/بیدی)، و همچنین یک جبهه تلفن همراه از طریق gRPC-وب. موفقیت توسط: پیش قراردادهای کوچک، مهلت و لغو، retrays نمایی با idempointency، اتصال pooling، نماینده در لبه، mTLS، رمزگذاری کلید و مشاهده کامل ارائه شده است.


1) هنگامی که gRPC را انتخاب کنید و زمانی که نه

مناسب برای:
  • API های داخلی بین سرویس های میکرو (تعادل، محدودیت ها، محاسبه، ضد تقلب).
  • نمایش داده شد با فرکانس بالا با SLO ها سخت توسط p95/p99.
  • جریانهای طولانی مدت (جداول/مسابقات، رویدادهای زنده، وضعیت پرداخت).
  • مشتریان تلفن همراه (از طریق gRPC-Web یا BFF).
ترک REST/GraphQL برای:
  • یکپارچگی عمومی، وب سایت ها، تیم های پرداخت با idemotency سخت و ذخیره سازی CDN.
  • رابط کاربری مدیریت با نمونه برداری تجمع غنی (GraphQL-BFF بیش از gRPC).

2) قراردادها و تکامل (Protobuf)

اصول طرح: ما فقط فیلدها را اضافه می کنیم، اعداد را دوباره استفاده نمی کنیم ؛ اجباری - از طریق اعتبار، نه «مورد نیاز».
نسخه بندی: بسته ها/فضای نام ('پرداخت. v1، پرداخت ها. v2 ') ؛ defrecate از طریق پنجره های مهاجرت و «deprecated = true».
معناشناسی: پیامهای «نازک» بدون آرایههای صدها کیلوبایت ؛ نمونه های بزرگ - جریان یا صفحه بندی.

مثال (ساده شده):
proto syntax = "proto3";
package payments.v1;

service Payouts {
rpc Create (CreatePayoutRequest) returns (CreatePayoutResponse) {}
rpc GetStatus (GetStatusRequest) returns (GetStatusResponse) {}
rpc StreamStatuses (StreamStatusesRequest) returns (stream StatusEvent) {}
}

message CreatePayoutRequest {
string idempotency_key = 1;
string user_id = 2;
string currency = 3;
int64 amount_minor = 4; // cents
}

message CreatePayoutResponse { string payout_id = 1; }
message GetStatusRequest { string payout_id = 1; }
message GetStatusResponse { string state = 1; string reason = 2; }
message StreamStatusesRequest { repeated string payout_ids = 1; }
message StatusEvent { string payout_id = 1; string state = 2; int64 ts_ms = 3; }

3) حمل و نقل و اتصالات

HTTP/2 بسیاری از RPC ها را به یک اتصال TCP متصل می کند: کانال های طولانی مدت با اتصال به شبکه (در یک مشتری، 2-4 کانال/هدف بالادست معمولا کافی است).
Keepalive: ارسال پینگ کمتر از زمان های متعادل کننده (به عنوان مثال، هر 30 ثانیه)، محدود کردن 'max _ pings _ without _ data'.
کنترل جریان/فشار پشتی: HTTP/2 تنظیمات پنجره + مرزهای صف مشتری/سرور.


4) عملکرد: آنچه واقعا تاثیر می گذارد

اندازه پیام: هدف - ≤ 64-128 کیلوبایت ؛ فعال کردن gzip/brotli برای پاسخ های بزرگ برای بارگیری بزرگ - جریان.
سریال سازی Protobuf 5-10 × فشرده تر از JSON است. از «string» برای اعداد و «map <string, string>» در صورت امکان اجتناب کنید.
CPU/تخصیص: کدک مشخصات و resolvers ؛ استفاده از بافر «صفر کپی» و قبل از تخصیص.
Threading: سرورهای gRPC به قفل حساس هستند - I/O را به async بیاورید، مهلت را در پایگاه داده های خارجی قرار دهید.
ناگل/ACK تاخیر: معمولا به طور پیش فرض ترک ؛ آزمایش را با دقت انجام دهید.


5) مهلت، لغو، عقب نشینی، idempointence

همیشه «خط تعریف» را روی مشتری تنظیم کنید (× 2 بالادست p95)، زمینه را در سرویس ها/پایگاه داده پرتاب کنید.
اگر در سرویس گیرنده لغو شود، سرور باید منابع را قطع و آزاد کند.
Retrai: فقط برای عملیات idempotent (GET آنالوگ، وضعیت، خواندن جریان). برای تغییر، از کلید 'idempotency _ key' استفاده کنید و نتیجه را ذخیره کنید.
سیاست برگشت با لرزش نمایی است. محدودیت تلاش و «بافر retray» در مشتری.
کدهای وضعیت gRPC: استفاده از «DEADLINE _ EXCEEDED»، «UNAVAILABLE» (retracted)، «FAILED _ PRECONDITION»، «ALREADY _ EXISTED»، «ABORTED» و غیره - معانی باریک موجب صرفه جویی در اعصاب می شود.


6) جریان: سرور، مشتری، بیدی

جریان سرور برای پاسخ های طولانی و تغذیه (بررسی برای نشت حافظه زمانی که مشتری کند است).
جریان مشتری - بارگیری/دسته.
دو طرفه - تعاملی (جداول زنده، رویدادهای داخلی).
اضافه کردن دنباله/افست در پیام ها برای سفارش و ادامه در سطح برنامه (gRPC به تنهایی پخش پس از اتصال مجدد را فراهم نمی کند).


7) تعادل و توپولوژی

xDS/Envoy به عنوان داده های هواپیما: L7-balancing، شکستن مدار، تخلیه بیرونی.
هش سازگار (توسط 'user _ id '/' table _ id') - کلید های داغ را در یک بالادست نگه می دارد، قفل های متقابل گره را کاهش می دهد.
هجینگ/آینه: مراقب باشید ؛ کمک می کند تا برای دم P99 اما بار را افزایش می دهد.
چند منطقه: نقاط انتهایی محلی با مسیریابی جغرافیایی ؛ پین کردن «منطقه خانه» توسط جلسه.

نمونه فرستاده (قطعه):
yaml load_assignment:
endpoints:
- lb_endpoints:
- endpoint: { address: { socket_address: { address: svc-a-1, port_value: 8080 } } }
- endpoint: { address: { socket_address: { address: svc-a-2, port_value: 8080 } } }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s circuit_breakers:
thresholds:
max_connections: 1024 max_requests: 10000

8) ایمنی

mTLS بین تمام هاپ (دروازه ↔ خدمات) ؛ گواهینامه TTL کوتاه، چرخش اتوماتیک (ACME/مش).
AuthZ: JWT/OIDC در لبه، تخمگذار ادعا به خدمات ؛ ABAC/RBAC در سطح دروازه/مش.
PII/PCI: فیلتر کردن فیلدها، غیرفعال کردن ورود اطلاعات حساس ؛ رمزگذاری نشانه در حمل و نقل/در حالت استراحت.
gRPC-Web: همان اصول auth، اما پوسته از طریق HTTP/1. 1 (نماینده پروکسی).


9) قابلیت مشاهده

معیارها: rps، p50/p95/p99 تاخیر در هر روش، میزان خطا توسط کد، جریان فعال، اندازه پیام، اشباع موضوع/استخر.
ردیابی: W3C/' traceparent 'در ابرداده ؛ دهانه در مشتری و سرور انتشار زمینه به پایگاه داده/کش.
سیاهههای مربوط: همبستگی با 'ردیابی _ id'، نمونه برداری، پنهان کردن دقیق.
Helschecks: خدمات جداگانه "بهداشت" ("grpc. سلامتی. V1 Health/Check ") و" Watch "برای سلامت جریان.


10) فشرده سازی، محدودیت ها و حفاظت

فعال کردن فشرده سازی پیام (در هر تماس)، محدود کردن 'max _ receive _ message _ length '/' max _ send _ message _ length'.
نرخ/سهمیه در سطح دروازه ؛ قطع کننده مدار با خطا/تاخیر.
بودجه مهلت: به مهلت های بی نهایت طولانی بین هاپ ها نچسبید - هر پیوند بودجه خود را کاهش می دهد.
حفاظت در برابر درخواست های «گران»: محدود کردن اندازه/تعداد عناصر در پیام، قطع جریان های طولانی.


11) دروازه ها و قابلیت همکاری

gRPC-Gateway/Transcoding: صادرات بخشی از روش ها به عنوان REST (برای شرکا/مدیران).
gRPC-Web: جلو به طور مستقیم به Envoy، که transcoded شده است.
GraphQL-BFF: حلال ها می توانند در gRPC راه بروند ؛ برای جهش دامنه پرداخت، REST با idempotency ترجیح داده می شود.


12) عدم توانایی در عملیات اصلاح

الگو:
  • مشتری «idempotency _ key» را تولید می کند.
  • سرور نتیجه را با کلید TTL ذخیره می کند (به عنوان مثال، 24 ساعت).
  • تکرار «Create» با همان کلید همان وضعیت «payout _ id »/را باز می گرداند.
شبه:
go if exists(key) { return storedResult }
res:= doBusiness()
store(key, res)
return res

13) خطاها و نقشه وضعیت

وضعیت خطاهای دامنۀ محلی →. با جزئیات '(گوگل. RPC. ErrorInfo) با کدها:
  • 'INVALID _ ARGUMENT' (اعتبارسنجی)، 'NOT _ FOUND'، 'ALREADY _ EXISTS'،
  • 'FAILED _ پیش شرط'، 'ABORTED'،
  • 'تایید نشده '/' اجازه _ تکذیب شد'،
  • 'RESOURCE _ EXPIRED' (سهمیه/محدودیت)،
  • 'UNAVAILABLE' (شبکه/بالادست)، 'DEADLINE _ EXCESSED'.
  • برای مشتری: فقط «UNAVAILABLE»، «DEADLINE _ EXCESSED» و موارد مشخص شده با idempotent را رد کنید.

14) تست و UAT

تست های قرارداد توسط «.proto» (فایل های طلایی).
بار: p50/p95/p99 تاخیر، توان، CPU، حافظه، GC.
جریان: تست فشار پشتی، وقفه، رزومه کاری.
شبکه ها: شبیه سازی از دست دادن/لرزش ؛ تست های زمانبندی/هجینگ.
امنیت: mutators از نشانه/serts، کلید های روتا در زمان اجرا.

چک لیست:
  • مهلت در هر تماس مشتری.

عقب نشيني ها فقط جاهايي هستن که شکست ناپذيرن

  • محدودیت اندازه پیام.
  • بهداشت/سازمان دیده بان و هشدار در p95/p99.
  • mTLS و چرخش.
  • ردیابی پایان به پایان.
  • فرستاده مدار شکستن и outlier-تخلیه.
  • gRPC-Web e2e برای مرورگر (در صورت نیاز).

15) ضد الگوهای

مهلت های بی پایان و بدون لغو

پیام های غول پیکر به جای جریان.
تکرارهای جهشهای ناایمن تکراری هستند.
بدون اتصال اتصال - طوفان اتصالات.
فقدان سلامت/ساعت - شکست «کور».
قرار دادن PII در مسیرها/سیاهههای مربوط.
یکپارچه یک استخر نقطه پایانی برای تمام جهان - بدون نزدیکی منطقه ای.


16) NFT/SLO (نشانه ها)

لبه → افزودنی خدمات: ≤ 10-30 ms p95 در منطقه.
تاخیر روش: p95 ≤ 150-250 ms (عملیات کسب و کار)، p99 ≤ 500 ms.

میزان خطا (5xx/' UNAVAILABLE '): ≤ 0. 1 درصد از RPS

زمان آماده به کار: ≥ 99. 95٪ برای خدمات مهم

جریان: حفظ اتصال ≥ 24 ساعت، قطره نرخ <0. 01 %/ساعت


17) مینی مشخصات و تنظیمات نمونه

مهلت مشتری/بازپرداخت (شبه برو):
go ctx, cancel:= context.WithTimeout(ctx, 300time.Millisecond)
defer cancel()
resp, err:= cli.GetStatus(ctx, req, grpc.WaitForReady(true))
سیاست Retray (جاوا، مشخصات YAML):
yaml methodConfig:
- name: [{service: payments.v1.Payouts, method: GetStatus}]
retryPolicy:
maxAttempts: 4 initialBackoff: 100ms maxBackoff: 1s backoffMultiplier: 2.0 retryableStatusCodes: [UNAVAILABLE, DEADLINE_EXCEEDED]
gRPC-Gateway (قطعه OpenAPI برای transcoding):
yaml paths:
/v1/payouts/{id}:
get:
x-grpc-service: payments.v1.Payouts x-grpc-method: GetStatus

خلاصه رزومه

gRPC یک bus end-to-end برای میکروسرویس های iGaming است: پروتکل های باینری فشرده، قراردادهای سخت و جریان قدرتمند. به طوری که آن را به ارمغان می آورد مزایای واقعی، نگه داشتن قرارداد کوچک و پایدار، پیاده سازی مهلت/لغو/retrays با idempotency، بهره برداری Envoy/xDS و mTLS، اندازه گیری p95/p99 و آموزش سیستم تحت فشار پس زمینه زندگی می کنند. در رابطه با REST webhooks و GraphQL-BFF، شما یک لایه API سریع، مقرون به صرفه و امن دریافت می کنید که با محصول مقیاس می شود.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.