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

مقایسه با کتابخانه‌های دیگر

مقایسهٔ ثبت‌شدهٔ Reqtide با شش کتابخانهٔ دیگر PHP روی 21 سناریوی رفتاری: روش کار، نتیجه‌ها، محدودیت‌های آزمون و راه تکرار آن.

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

در این صفحه

چه چیزی مقایسه شد

ابزار آزمون (harness) در benchmarks/comparison/ (opens in a new tab) مخزن قرار دارد. 21 سناریو دارد که هیچ‌کدام نام کتابخانه‌ای را در خود ندارند. دو نمونه: «مهلت کل، تلاش‌های مجدد و انتظارها را در بر می‌گیرد» و «آزادسازی دیرهنگام نمی‌تواند مجوز دیگری را آزاد کند».

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

هر سناریو فقط برای کتابخانه‌هایی نمره می‌گیرد که دامنه‌شان بتواند آن را بیان کند. مثلاً یک محدودکنندهٔ نرخ برای تلاش مجدد نمره نمی‌گیرد. به همین دلیل بیشتر خانه‌ها «قابل اعمال نیست» را نشان می‌دهند.

کتابخانه (نسخهٔ آزموده)دامنه در آزمونموفقناموفققابل اعمال نیست یا قابل بیان نیست
کتابخانهٔ Reqtide (نسخهٔ کاری پیش از 0.1.0)پایپ‌لاین با همهٔ سیاست‌ها، backendهای حافظه، ساعت مجازی1810
بستهٔ symfony/rate-limiter 8.1.6محدودیت نرخ3115
بستهٔ symfony/http-client 8.1.8کلاینت‌های تلاش مجدد و محدودسازی نرخ2611
بستهٔ caseyamcl/guzzle_retry_middleware 3.0.0میان‌افزار (middleware) تلاش مجدد3313
بستهٔ spatie/guzzle-rate-limiter-middleware 2.2.0میان‌افزار محدودیت نرخ1216
بستهٔ ackintosh/ganesha 4.0.0مدارشکن3412
بستهٔ matheus85/duat 0.2.0پایپ‌لاین مبتنی بر callable667
نتیجهٔ 21 سناریو برای هر کتابخانه، بر اساس نسخهٔ آزموده.

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

نتیجه‌ها را چطور بخوانید

  • یک نفر هم سناریوها را نوشته، هم آداپتورهای کتابخانه‌های دیگر و آداپتور Reqtide را. سناریوها از پژوهشی آمده‌اند که خود پروژه دربارهٔ خلأهای موجود انجام داده بود، پس ممکن است به نفع کارهایی باشند که Reqtide برای آن‌ها ساخته شده است.
  • بعضی نتیجه‌های Reqtide به انتخاب‌هایی بستگی دارند که آداپتور انجام داده است. چون Reqtide پیش‌فرض ندارد، آداپتور مقدارها را خودش انتخاب کرده است. شش سناریو به چنین انتخاب‌هایی یا به برداشتی آسان‌گیرانه وابسته‌اند: اندازهٔ سهمیهٔ تلاش مجدد، تلاش مجدد نشدن POST به‌صورت پیش‌فرض، probe رهاشده، آزادسازی دیرهنگام، ردهای دارای نوع و برگشت ساعت به عقب. ابزار آزمون هر کدام را علامت می‌زند. کتابخانه‌های دیگر با پیش‌فرض‌های خودشان اجرا شدند.
  • تنها شکست Reqtide سناریوی S15 است و از طراحی می‌آید. درخواستی که بعد از پذیرش و پیش از ارسال لغو شود، واحد نرخ خود را نگه می‌دارد، چون Reqtide هرگز هزینهٔ نرخ را پس نمی‌دهد. سناریو این را شکست حساب می‌کند. کتابخانه‌های دیگر نتوانستند همین زیرحالت را اجرا کنند، پس این ردیف با بقیه هم‌سنگ نیست. دو تا از آن‌ها وقتی محدودکننده بیرون از لایهٔ تلاش مجدد باشد، سهمیه را کمتر می‌شمارند و ابزار آزمون آن‌ها را وابسته به ترکیب‌بندی نمره می‌دهد.
  • سناریوی S12 قابل بحث است. این سناریو می‌گوید اوج هم‌زمانی هرگز نباید از یک بیشتر شود. هیچ سقف هم‌زمانی مبتنی بر اجاره نمی‌تواند این را به معنای تحت‌اللفظی برآورده کند: وقتی اجاره تمام شود و callback بعدی پذیرفته شود، ممکن است callback اول هنوز در حال اجرا باشد. ابزار آزمون این خانه را با این معیار نمره می‌دهد که آیا فراخوانی سوم در حالی که دومی در حال اجراست، وارد می‌شود یا نه.
  • خانهٔ موفق معنای محدودی دارد. یعنی ابزار آزمون در همان یک سناریو و با همان پیکربندی رفتار مورد انتظار را دید.
  • فقط حافظهٔ محلی پردازه و ساعت مجازی آزموده شده است. این مقایسه دربارهٔ سرعت، حالت مشترک، transportهای واقعی یا آمادگی برای محیط تولید چیزی نمی‌گوید. از ganesha فقط آداپتور APCu آن اجرا شد، آن هم روی یک جایگزین درون‌پردازه‌ای برای توابع APCu.
  • نسخه‌ها تغییر می‌کنند و کتابخانه‌های دیگر اصلاحیه منتشر می‌کنند. نتیجه‌ها نسخه‌های جدول را در روز اجرا توصیف می‌کنند.

چطور از مقایسه استفاده کنید

  • اگر فقط یک محافظت لازم دارید، از کتابخانه‌ای استفاده کنید که برای همان ساخته شده است. محدودکنندهٔ نرخ یا مدارشکن اختصاصی ممکن است بهتر از یک پایپ‌لاین به کار شما بیاید.
  • ترکیب این محافظت‌ها را Reqtide ارائه می‌کند: یک ترتیب ثابت از تصمیم‌ها، یک مهلت کل برای همهٔ آن‌ها، نتیجه‌های دارای نوع و آزمون روی زمان مجازی.
  • اگر یکی از تفاوت‌های جدول برایتان مهم است، سناریو را روی پیکربندی خودتان اجرا کنید.

اجرا را تکرار کنید

ابزار آزمون به PHP 8.4 یا بالاتر نیاز دارد، چون دو تا از کتابخانه‌های مقایسه‌شده آن را لازم دارند. در یک clone از مخزن و با Docker، یک بار وابستگی‌های قفل‌شده را نصب کنید. بعد ابزار آزمون را اجرا کنید:

Bash
docker compose -f tools/docker/compose.yaml run --rm -e COMPOSER_VENDOR_DIR=/app/build/comparison/vendor php84 composer install -d benchmarks/comparison
docker compose -f tools/docker/compose.yaml run --rm php84 php benchmarks/comparison/run.php

جزئیات در فایل README ابزار آزمون آمده است. محدودیت‌های Reqtide را هم ببینید.