رفتن به متن راهنما
همه‌ی راهنماها

انتخاب سیاست‌ها

ببینید هر محافظت پاسخ کدام مشکل است، طبقه‌بند شما چگونه شکست را تعریف می‌کند و کدام گزینه‌ها را باید خودتان اندازه بگیرید.

برنامه Reqtide PHP 0.1.0آخرین بررسی زمان خواندن 6 دقیقه

در این صفحه

کتابخانهٔ Reqtide برای مهلت‌ها، محدودیت‌ها، پنجره‌ها و تأخیرها مقدار پیش‌فرض ندارد و این راهنماها هم عددی پیشنهاد نمی‌کنند. مقدار درست به وابستگی، ترافیک و ریسک شما بستگی دارد.

هر بلوک کد در راهنماهای محافظت از examples/09-choosing-policies.php (opens in a new tab) یا مثالی هم‌خانواده با آن گرفته شده است. اسکریپتی آن‌ها را اجرا می‌کند و خروجی را با خروجی ثبت‌شده مقایسه می‌کند. عددها فقط کمک می‌کنند هر محافظت در چند خط دیده شود و توصیه نیستند.

همهٔ محدودیت‌ها داخل یک پردازش PHP اعمال می‌شوند. در PHP-FPM پایپ‌لاینی که داخل یک درخواست ساخته شود، هر درخواست را از نو شروع می‌کند. محدودیت‌های Reqtide را ببینید.

کدام مشکل، کدام سیاست

مشکلسیاستفراخوانی builderراهنما
یک تماس کند، فراخوانی‌کننده را بیش از حد معطل می‌کندمهلت کل، به‌علاوهٔ مهلت هر تلاشمتدهای newContext(timeout) و attemptTimeout()، که هر دو الزامی‌اندمفاهیم
خطاهای کوتاه‌مدتی که تلاش دوم ممکن است رفع کندتلاش مجدد با backoff که از سهمیهٔ تلاش مجدد پرداخت می‌شودمتدهای retry() و retryBudget()تلاش مجدد و سهمیه
نباید از سهمیهٔ ارائه‌دهنده بیشتر مصرف کردمحدودیت نرخمتد rateLimit()محدودیت نرخ
یک وابستگی از کار افتاده است و فراخوانی‌کننده‌ها مدام به آن تماس می‌گیرندمدارشکنمتد circuitBreaker()مدارشکن
یک وابستگی کند تمام کار هم‌زمان پردازش را مصرف می‌کندسقف اجرای هم‌زمان (Bulkhead)متد bulkhead()سقف اجرای هم‌زمان و دورهٔ انتظار
سرور گفته است «بعد از N ثانیه دوباره امتحان کن»رعایت Retry-After به‌عنوان کران پایین، به‌علاوهٔ دورهٔ انتظار مشترکمتدهای ExceptionClassifier::retryAfterFrom() و cooldown()تلاش مجدد و سهمیه، سقف اجرای هم‌زمان و دورهٔ انتظار
وقتی تماس شکست می‌خورد، فراخوانی‌کننده‌ها به چیز قابل‌استفاده‌ای نیاز دارندراهکار جایگزین (Fallback)متد fallbackScope() و یک fallback در newContext()راهکار جایگزین
مشکل‌ها، سیاستی که به هر کدام پاسخ می‌دهد و راهنمای مربوط.

فقط برای چیزی که تنظیم کرده‌اید هزینه می‌پردازید. سیاست فقط وقتی وجود دارد که متدش را صدا بزنید.

طبقه‌بند تعیین می‌کند چه چیزی حساب می‌شود

سیاست‌ها روی نتیجهٔ هر تلاش عمل می‌کنند و طبقه‌بند (classifier) شما معنای هر نتیجه را مشخص می‌کند. کلاس ExceptionClassifier محافظه‌کارانه شروع می‌کند:

  • مقدار برگشتی موفقیت است.
  • استثنا دوباره امتحان نمی‌شود و fallback هم جای آن را نمی‌گیرد، مگر اینکه کلاس آن را با retryOn() یا fallbackOn() فهرست کنید.
  • هر استثنا شکست مدار حساب می‌شود. می‌توانید کلاسی را در ignoreForCircuit() بگذارید، مثلاً خطای اعتبارسنجی خود فراخوانی‌کننده، یا با countAsCircuitFailure() شکست‌ها را محدود کنید.

متد unacceptableValuesWhen() مقدار برگشتی را شکست علامت می‌زند. چنین مقداری شکست مدار است، هیچ‌وقت دوباره امتحان نمی‌شود و هیچ‌وقت جایگزین نمی‌شود. متد retryAfterFrom() از یک استثنا مدت انتظار را بیرون می‌کشد. جدول تصمیم در docblock کلاس ExceptionClassifier (opens in a new tab) آمده است.

رد شدن‌های ناشی از محدودیت نرخ، مدارشکن، سقف هم‌زمانی و دورهٔ انتظار، لغوها و خطاهای ذخیره‌سازی خنثی‌اند. هیچ‌کدام شکست وابستگی حساب نمی‌شوند.

استثنایی را که کسی فهرست نکرده، Reqtide دوباره امتحان نمی‌کند، چون تکرار یک شکست غیرمنتظره تصمیمی است که باید صریح بگیرید. با این حال آن را شکست مدار می‌شمارد. مداری که شکست‌های ناشناخته را نادیده بگیرد، در برابر وابستگی‌ای که به شکلی پیش‌بینی‌نشده خراب می‌شود بسته می‌ماند. تطبیق با instanceof انجام می‌شود، پس کلاس والد یا interface فهرست‌شده زیرکلاس‌هایش را هم پوشش می‌دهد.

شروع مشترک همهٔ قطعه‌ها

راهنماهای محافظت پایپ‌لاین‌های خود را با دو گزینهٔ الزامی می‌سازند. مهلت هر تلاش الزامی است. مقدار Cooperative یعنی کد شما زمان را رعایت می‌کند، چون runtime همگام نمی‌تواند آن را متوقف کند. مهلت کلی که به newContext() می‌دهید جدا از آن است و کل عملیات را در بر می‌گیرد.

PHP
/** Every pipeline below starts from the same two required options. */
$base = static fn(): PipelineBuilder => PipelineBuilder::profile('choosing', 'v1')
    ->partition('shop', 'prod', 'catalog-api')
    ->attemptTimeout(Duration::seconds(2), AttemptTimeoutRequirement::Cooperative);

$ok = static fn(): string => 'ok';
$context = static fn(CompiledPipeline $pipeline): ExecutionContext => $pipeline->newContext(Duration::seconds(30));

چه چیزی به چه ترتیبی بررسی می‌شود

برای هر تلاش، Reqtide ابتدا مهلت کل و context را بررسی می‌کند. سپس واجد شرایط بودن برای تلاش مجدد، کمینهٔ زمان باقی‌مانده و رزرو سهمیهٔ تلاش مجدد را می‌سنجد. دو بررسی آخر فقط برای تلاش‌های بعد از اولی انجام می‌شود. بعد نوبت مدارشکن، سقف هم‌زمانی، دورهٔ انتظار مشترک و محدودیت نرخ است و سپس ارسال. اگر یکی از بررسی‌های بعدی رد کند، Reqtide مجوزهای قبلی را آزاد می‌کند. در تأخیر بین تلاش‌ها چیزی نگه داشته نمی‌شود. مفاهیم این ترتیب را در یک جدول نشان می‌دهد.

فهرست اندازه‌گیری

ترکیب تنظیم‌ها را Reqtide هنگام کامپایل بررسی می‌کند و پیام‌هایش نام گزینه را می‌گویند. این‌ها قیدهایی است که اعمال می‌کند و مقدار پیشنهادی نیستند.

  • هر اجاره (lease) باید بیش از 1 ثانیه از مهلت هر تلاش بیشتر باشد. این شامل اجارهٔ سقف هم‌زمانی، اجارهٔ مجوز مدار و اجارهٔ رزرو سهمیهٔ تلاش مجدد می‌شود.
  • متد retry() با بیش از یک تلاش به retryBudget() نیاز دارد. retryBudget() بدون retry() پذیرفته نمی‌شود.
  • کمینهٔ تعداد نمونه‌های مدار نمی‌تواند از پنجرهٔ شمارشی بیشتر باشد. آستانهٔ موفقیت تماس آزمایشی نمی‌تواند از ظرفیت تماس آزمایشی بیشتر باشد.
  • گزینهٔ fallbackScope(IncludeAdmissionRefusals) دست‌کم به یک سیاست پذیرش نیاز دارد.

بقیهٔ موارد تصمیم‌هایی دربارهٔ وابستگی شماست: محدودیت‌ها، پنجره‌ها، تأخیرها و اندازهٔ مخزن‌ها. آن را اندازه بگیرید، مقدارها را یادداشت کنید و پایپ‌لاین را با زمان مجازی آزمون کنید (آزمون با ساعت مجازی).

برای هر محافظت یک راهنما