> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plato.ae/llms.txt
> Use this file to discover all available pages before exploring further.

# قائمة الانتظار وRedis

> قوائم انتظار BullMQ وعزل الطابعة والثبات وأوضاع Redis.

# قائمة الانتظار وRedis

يستخدم برنامج التشغيل Redis وBullMQ حتى تنجو مهام الطباعة من أخطاء العملية وانقطاع الطابعة.

## قوائم الانتظار لكل طابعة

كل `ip_address:port` فريد يحصل على `PrinterStore` مخصص.

على سبيل المثال:

```txt theme={null}
192.168.1.50:9100 -> pc-printer_192_168_1_50_9100
192.168.1.51:9100 -> pc-printer_192_168_1_51_9100
```

يمتلك كل متجر:

* قائمة انتظار BullMQ واحدة.
* عامل واحد BullMQ.
* مستمع أحداث قائمة الانتظار واحد.
* ذاكرة تخزين مؤقت واحدة لحالة الطابعة.
* وحدة تحكم دورة حياة مقبس واحد.

التزامن العامل هو `1`، لذا لا تتلقى طابعة واحدة مطلقًا مهمتين في نفس الوقت. يمكن للطابعات المختلفة أن تقوم بالمعالجة بالتوازي، لأن كل طابعة لها العامل الخاص بها.

## سجل الطابعة

يتم تخزين الطابعات المعروفة في مجموعة Redis:

```txt theme={null}
pc-printer:printers
```

عند بدء التشغيل، يقوم `restorePersistedStores()` بقراءة المجموعة وإعادة إنشاء المخازن وإعادة محاولة المهام الفاشلة.

## إعادة محاولة السلوك

خيارات قائمة الانتظار الافتراضية:

```json theme={null}
{
  "attempts": 2147483647,
  "backoff": {
    "type": "fixed",
    "delay": 5000
  },
  "removeOnComplete": true,
  "removeOnFail": false
}
```

هذا يعنى:

* تتم إزالة المهام المكتملة.
* يتم الاحتفاظ بالوظائف الفاشلة.
* إعادة محاولة المهام الفاشلة مع التراجع الثابت.
* يقوم `maxAttempts` بإعادة المحاولة بشكل فعال إلى الأبد.

## الوظائف المجدولة

`POST /print` يقبل `runAt`.

إذا كان `runAt` في المستقبل، يقوم السائق بإضافة المهمة مع تأخير BullMQ. إذا تم إنشاء مهمة متأخرة لجدول مستقبلي، فلن يقوم منطق الاسترداد بترقيتها مبكرًا.

نماذج `runAt` المقبولة:

* رقم الطابع الزمني بالميلي ثانية.
* سلسلة رقمية.
* سلسلة التاريخ التي يمكن لـ `Date.parse()` تحليلها.

## حالة قائمة الانتظار

يجمع `GET /queue-status` جميع المتاجر المعروفة:

* `waiting`
* `active`
* `delayed`
* `failed`
* `completed`
* `totalPending`
* `isProcessing`

`totalPending` هو `waiting + delayed` في جميع المتاجر.

## جزءا لا يتجزأ من Redis

يبدأ الوضع المضمن من Redis إلى `redis-memory-server`.

في نظام التشغيل Windows، يقوم برنامج التشغيل بفحص أو تنزيل الملف الثنائي Redis المطلوب:

```txt theme={null}
redis-binaries/<version>/Redis-<version>-Windows-x64-msys2/redis-server.exe
```

يتم التحقق من إصدار Redis قيد التشغيل الفعلي بعد بدء التشغيل. إذا كان الإصدار الذي تم اكتشافه لا يساوي `config.redis.version`، فسيتم إلغاء بدء التشغيل.

## مزامنة القرص

عندما يكون `redis.diskSync` صحيحًا، يبدأ Redis بإعدادات اللقطة:

```txt theme={null}
--save <snapshotIntervalSec> 1
--appendonly no
--dir <app-root>
--dbfilename dump.rdb
```

عند إيقاف التشغيل بسلاسة، يحاول السائق إجراء Redis `SAVE`.

استخدم مزامنة القرص عندما تحتاج إلى قوائم الانتظار والطابعات المعروفة للبقاء على قيد الحياة عند إعادة التشغيل.

## خارجي Redis

الوضع الخارجي لا يبدأ أو يوقف Redis. يستخدم السائق:

```json theme={null}
{
  "mode": "external",
  "host": "127.0.0.1",
  "port": 6379,
  "db": 0,
  "username": "",
  "password": ""
}
```

استخدم Redis الخارجي عندما يكون المتجر قد قام بالفعل بإدارة Redis أو عندما تحتاج عمليات برنامج التشغيل المتعددة إلى حالة قائمة انتظار مشتركة. تجنب توجيه برنامجي تشغيل نشطين إلى نفس الطابعات الفعلية ما لم يكن النموذج التشغيلي واضحًا.
