تتيح لك واجهة برمجة التطبيقات Play Games Services Publishing API تحميل صورة لموارد لعبة.
خيارات التحميل
تتيح لك واجهة برمجة التطبيقات Play Games Services Publishing API تحميل أنواع معيّنة من البيانات الثنائية أو الوسائط. يمكنك الاطّلاع على الصفحة المرجعية لأي طريقة تتيح تحميل الوسائط للتعرّف على الخصائص المحدّدة للبيانات التي يمكنك تحميلها:
الحد الأقصى لحجم ملف التحميل: الحد الأقصى للبيانات التي يمكنك تخزينها باستخدام هذه الطريقة.
أنواع MIME المقبولة للوسائط: أنواع البيانات الثنائية التي يمكنك تخزينها باستخدام هذه الطريقة.
يمكنك تقديم طلبات تحميل بأيّ من الطرق التالية. حدِّد الطريقة التي تستخدمها مع مَعلمة طلب uploadType.
التحميل البسيط:
uploadType=media
. لنقل سريع لملفّات أصغر حجمًا، مثل 5 ميغابايت أو أقلالتحميل المتعدّد الأجزاء:
uploadType=multipart
. لنقل سريع للملفات الصغيرة والبيانات الوصفية، يتم نقل الملف مع البيانات الوصفية التي تصف الملف، وكل ذلك في طلب واحد.التحميل القابل للاستئناف:
uploadType=resumable
. لنقل موثوق، وهو أمر مهم بشكل خاص مع الملفات الأكبر حجمًا باستخدام هذه الطريقة، يمكنك استخدام طلب بدء جلسة يمكن أن يتضمّن اختياريًا بيانات وصفية. هذه استراتيجية جيدة لاستخدامها مع معظم التطبيقات، لأنّها تعمل أيضًا مع الملفات الأصغر حجمًا مقابل طلب HTTP إضافي واحد لكل عملية تحميل.
عند تحميل الوسائط، يتم استخدام عنوان URL خاص. في الواقع، تتضمّن الطرق التي تتيحتحميل الوسائط نقطتَي نهاية لمعرّف الموارد المنتظم:
معرّف الموارد المنتظم /upload للوسائط تنسيق نقطة نهاية التحميل هو معرّف الموارد المنتظم العادي مع البادئة "/upload". استخدِم معرّف الموارد المنتظم (URI) هذا عند نقل بيانات الوسائط نفسها.
مثال:
POST /upload/games/v1configuration/images/resourceId/imageType/imageType
معرّف الموارد المنتظم (URI) للبيانات الوصفية إذا كان المورد يحتوي على أي حقول بيانات، تُستخدَم هذه الحقول لتخزين البيانات الوصفية التي تصفملف الذي تم تحميله. يمكنك استخدام عنوان URL هذا عند إنشاء قيم البيانات الوصفية أو تعديلها.
مثال:
POST /games/v1configuration/images/resourceId/imageType/imageType
تحميل بسيط
إنّ الطريقة الأسهل لتحميل ملف هي من خلال تقديم طلبتحميل بسيط. يكون هذا الخيار مناسبًا في حال استيفاء أيٍّ من المتطلّبات التالية:
يكون الملف صغيرًا بما يكفي ليتم تحميله مرة أخرى بالكامل في حال تعذّر الربط.
لا تتوفّر بيانات وصفية لإرسالها. قد يكون هذا صحيحًا إذا كنت تخطّط لإرسال بيانات وصفية لهذا المورد في طلب منفصل، أو إذا لم تكن هناك بيانات وصفية متوافقة أو متوفّرة. لاستخدام ميزة "التحميل البسيط"، يمكنك إرسال طلب POST أو PUT إلى مسار URI الخاص بالطريقة /upload وإضافة مَعلمة الطلب uploadType=media. مثلاً:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=media
تشمل عناوين HTTP التي يجب استخدامها عند إجراء طلب تحميل بسيط ما يلي:
Content-Type
. اضبطه على أحد أنواع بيانات الوسائط المقبولة لتحميلها باستخدام الطريقة، كما هو موضّح في مرجع Publishing API.Content-Length
. اضبط هذا الخيار على عدد وحدات البايت التي تحمّلها. غير مطلوب إذا كنت تستخدم ترميز النقل المجزّأ.
مثال: عملية تحميل بسيطة
يعرض المثال التالي استخدام طلب تحميل بسيط لواجهة برمجة التطبيقات Play Services Publishing API.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=media HTTP/1.1
Host: www.googleapis.com
Content-Type: image/png
Content-Length: number_of_bytes_in_file
Authorization: Bearer your_auth_token
PNG data
إذا نجح الطلب، يعرض الخادم رمز الحالة HTTP 200 OK
مع
أي بيانات وصفية. مثلاً:
HTTP/1.1 200
Content-Type: application/json
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
التحميل المتعدّد الأجزاء
إذا كانت لديك بيانات وصفية تريد إرسالها مع البيانات المطلوب تحميلها،
يمكنك تقديم طلب multipart/related
واحد. هذا خيار جيد إذا كانت البيانات التي يتم إرسالها صغيرة بما يكفي لتحميلها مرة أخرى بالكامل في حال تعذّر الربط.
لاستخدام ميزة "التحميل المتعدّد الأجزاء"، يمكنك إرسال طلب POST
أو PUT
إلى معرّف الموارد المنتظِمة
/upload الخاص بالطريقة وإضافة مَعلمة طلب البحث uploadType=multipart
. مثلاً:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=multipart
تشمل عناوين HTTP ذات المستوى الأعلى التي يجب استخدامها عند تقديم طلب تحميل متعدّد الأجزاء:
-Content-Type
. اضبط القيمة على multipart/related وأدرِج سلسلة الحدود التي تستخدمها لتحديد أجزاء الطلب.
-Content-Length
: يتم ضبطه على إجمالي عدد وحدات البايت في نص الطلب. يجب أن يكون جزء الوسائط من الطلب أصغر من الحد الأقصى لحجم الملف المحدَّد لهذه الطريقة.
يتم تنسيق نص الطلب كنوع محتوى متعدّد الأجزاء/مرتبط RFC2387 ويحتوي على جزأين بالضبط. يتم تحديد الأجزاء من خلال سلسلة حدود، ويتبع سلسلة الحدود النهائية واصلة.
يحتاج كل جزء من الطلب المتعدّد الأجزاء إلى عنوان Content-Type إضافي:
جزء البيانات الوصفية: يجب أن يأتي أولاً، ويجب أن يتطابق Content-Type مع أحد تنسيقات البيانات الوصفية المقبولة.
جزء الوسائط: يجب أن يأتي ثانيًا، ويجب أن يتطابق Content-Type مع أحد أنواع MIME المقبولة للوسائط في الطريقة.
اطّلِع على مرجع Publishing API لمعرفة قائمة أنواع MIME المقبولة للوسائط والحدود القصوى لحجم الملفات المحمَّلة لكل طريقة.
مثال: التحميل المتعدّد الأجزاء
يعرض المثال أدناه طلب تحميل مكوّن من أجزاء متعددة لواجهة برمجة التطبيقات Play Games Services Publishing API.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=multipart HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer your_auth_token
Content-Type: multipart/related; boundary=foo_bar_baz
Content-Length: number_of_bytes_in_entire_request_body
--foo_bar_baz
Content-Type: application/json; charset=UTF-8
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
--foo_bar_baz
Content-Type: image/png
PNG data
--foo_bar_baz--
إذا تمكّن الطلب من إكمال العملية بنجاح، يعرض الخادم رمز الحالة HTTP 200 OK
مع أي بيانات وصفية:
HTTP/1.1 200
Content-Type: application/json
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
استئناف عملية التحميل
لتحميل ملفات البيانات بشكل أكثر موثوقية، يمكنك استخدام بروتوكول التحميل القابل للاستئناف. يتيح لك هذا البروتوكول استئناف عملية تحميل بعد أن يؤدي أحد أخطاء الاتصالات إلى إيقاف تدفق البيانات. ويُعدّ ذلك مفيدًا بشكل خاص إذا كنت تنقل ملفات كبيرة وكان احتمال انقطاع الشبكة أو حدوث أي نوع آخر من أخطاء النقل مرتفعًا، على سبيل المثال، عند التحميل من تطبيق العميل المتوافق مع الأجهزة الجوّالة. ويمكن أن يقلل ذلك أيضًا من استخدامك لسعة النطاق في حال حدوث أخطاء في الشبكة لأنّه لن يكون عليك إعادة بدء عمليات تحميل الملفات الكبيرة من البداية.
تشمل خطوات استخدام ميزة "التحميل القابل للاستئناف" ما يلي:
ابدأ جلسة يمكن استئنافها. قدِّم طلبًا أوليًا إلى معرّف الموارد المنتظم (URI) لتحميل المحتوى الذي يتضمّن البيانات الوصفية، إن توفّرت.
احفظ معرّف الموارد المنتظم (URI) للجلسة التي يمكن استئنافها. احفظ عنوان URL للجلسة الذي تم إرجاعه في الردّ على الطلب الأوّلي، وسيتم استخدامه للطلبات المتبقّية في هذه الجلسة. حمّل الملف.
أرسِل ملف الوسائط إلى معرّف الموارد المتسلسل (URI) للجلسة التي يمكن استئنافها.
بالإضافة إلى ذلك، يجب أن تتضمّن التطبيقات التي تستخدم ميزة "التحميل القابل للاستئناف" رمزًا لاستئناف عملية تحميل متوقفة. إذا انقطعت عملية التحميل، يمكنك معرفة مقدار البيانات التي تم استلامها بنجاح، ثم استئناف التحميل من تلك النقطة.
بدء جلسة يمكن استئنافها
لبدء عملية تحميل قابلة للاستئناف، يمكنك إرسال طلب POST
أو PUT
إلى معرّف الموارد المنتظم (URI) لطريقة
/upload وإضافة مَعلمة طلب البحث uploadType=resumable
. مثلاً:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable
بالنسبة إلى هذا الطلب الأوّلي، يكون النص إما فارغًا أو يحتوي على البيانات الوصفية فقط، وسيتم نقل المحتوى الفعلي للملف الذي تريد تحميله في الطلبات اللاحقة.
استخدِم عناوين HTTP التالية مع الطلب الأوّلي:
X-Upload-Content-Type
. اضبط هذا الحقل على نوع MIME للوسائط لبيانات التحميل التي سيتم نقلها في الطلبات اللاحقة.X-Upload-Content-Length
. يتم ضبطه على عدد وحدات البايت لبيانات التحميل التي سيتم نقلها في الطلبات اللاحقة. إذا لم تكن المدة معروفة في وقت هذا الطلب، يمكنك حذف هذا الرأس.في حال تقديم بيانات وصفية:
Content-Type
. يتم ضبطه وفقًا لنوع data البيانات الوصفية.Content-Length
. يتم ضبطه على عدد وحدات البايت المقدَّمة في نص هذا الطلب الأوّلي. لا يكون مطلوبًا في حال استخدام ترميز النقل المجزّأ.
اطّلِع على مرجع واجهة برمجة التطبيقات Publishing API للحصول على قائمة بأنواع MIME المقبولة للوسائط والحدود القصوى لحجم الملفات التي يتم تحميلها في كل طريقة.
مثال: طلب بدء جلسة يمكن استئنافها
يوضّح المثال التالي كيفية بدء جلسة يمكن استئنافها لواجهة برمجة التطبيقات Play Games Services Publishing API.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer your_auth_token
Content-Length: 38
Content-Type: application/json; charset=UTF-8
X-Upload-Content-Type: image/png
X-Upload-Content-Length: 2000000
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
يصف القسم التالي كيفية معالجة الاستجابة.
حفظ معرّف الموارد المنتظم (URI) للجلسة التي يمكن استئنافها
إذا تمكّن طلب بدء الجلسة من إكمال العملية بنجاح، يستجيب خادم واجهة برمجة التطبيقات برمز حالة HTTP 200
OK
. بالإضافة إلى ذلك، يوفّر عنوان Location
الذي
يحدّد معرّف الموارد المنتظم (URI) للجلسة التي يمكن استئنافها. يتضمّن العنوان Location
، المعروض في المثال أدناه، جزءًا من مَعلمة طلب البحث upload_id
الذي يقدّم معرّف التحميل الفريد لاستخدامه في هذه الجلسة.
مثال: استجابة بدء جلسة يمكن استئنافها
في ما يلي ردّ على الطلب في الخطوة 1:
HTTP/1.1 200 OK
Location: https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable&upload_id=xa298sd_sdlkj2
Content-Length: 0
قيمة رأس Location
، كما هو موضّح في مثال الاستجابة أعلاه، هي
عنوان URL الخاص بالجلسة الذي ستستخدمه كنقطة نهاية لبروتوكول HTTP لإجراء عملية تحميل الملف الفعلية
أو طلب حالة التحميل.
انسخ معرّف الموارد المنتظم (URI) للجلسة واحفظه حتى تتمكّن من استخدامه في الطلبات اللاحقة.
تحميل الملف
لتحميل الملف، أرسِل طلبًا بتنسيق PUT
إلى معرّف الموارد المنتظِم لتحميل الملفات الذي حصلت عليه في
الخطوة السابقة. تنسيق طلب التحميل هو:
PUT session_uri
تشمل رؤوس HTTP التي يجب استخدامها عند تقديم طلبات تحميل الملفات القابلة للاستئناف
Content-Length
. اضبط هذا الخيار على عدد البايتات التي تحمّلها في
هذا الطلب، والذي يمثّل بشكل عام حجم ملف التحميل.
مثال: طلب تحميل ملف قابل للاستئناف
في ما يلي طلب يمكن استئنافه لتحميل ملف PNG بالكامل الذي يبلغ حجمه 2,000,000 بايت في المثال الحالي.
PUT https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable&upload_id=xa298sd_sdlkj2 HTTP/1.1
Content-Length: 2000000
Content-Type: image/png
bytes 0-1999999
إذا نجح الطلب، يردّ الخادم برمز HTTP 201 Created
، بالإضافة
إلى أيّ بيانات وصفية مرتبطة بهذا المورد. إذا كان الطلب الأولي لجلسة
الترجيع هو PUT
لتعديل مورد حالي، سيكون الردّ على
النجاح هو 200 OK
، بالإضافة إلى أي بيانات وصفية مرتبطة بهذه
المورد.
إذا انقطع طلب التحميل أو إذا تلقّيت HTTP 503 Service Unavailable
أو أيّ ردّ آخر 5xx
من الخادم،
اتّبِع الإجراء الموضّح في مقالة استئناف عملية تحميل متوقّفة.
تحميل الملف على أجزاء
من خلال عمليات التحميل القابلة للاستئناف، يمكنك تقسيم ملف إلى أجزاء وإرسال سلسلة من الطلبات لتحميل كل جزء بالتسلسل. وهذا ليس النهج المفضّل، لأنّ هناك تكاليف أداء مرتبطة بالطلبات الإضافية، وهناك حلول أخرى لا تتطلّب ذلك بشكل عام. ومع ذلك، قد تحتاج إلى استخدام ميزة تقسيم البيانات لتقليل كمية البيانات المنقولة في أي طلب فردي. يكون ذلك مفيدًا عندما يكون هناك مهلة زمنية ثابتة للطلبات الفردية، كما هو الحال مع فئات معيّنة من طلبات Google App Engine. ويتيح لك أيضًا تنفيذ إجراءات مثل توفير مؤشرات ملف التحميل في المتصفّحات القديمة التي لا تتيح عرض مستوى التقدّم في التحميل تلقائيًا.
إذا كنت تحمّل البيانات على شكل أجزاء، يجب أيضًا تضمين عنوان Content-Range، بالإضافة إلى عنوان Content-Length المطلوب لتحميل الملفات بالكامل:
Content-Length
. يتم ضبطه على حجم الجزء أو أقلّ، كما قد يكون الحال مع الطلب الأخير.Content-Range
: يمكنك ضبط هذا الخيار لعرض البايتات في الملف الذي تحمّله. على سبيل المثال، يشير الرمزContent-Range: bytes 0-524287/2000000
إلى أنّك تقدّمContent-Range: bytes 0-524287/2000000
أول 524,288 بايت (256 x 1024 x 2) في ملف بحجم 2,000,000 بايت.
استئناف عملية تحميل تمت مقاطعتها
إذا تم إنهاء طلب التحميل قبل تلقّي ردّ أو إذا تلقّيت
ردّ HTTP 503 Service Unavailable
من الخادم، عليك
استئناف عملية التحميل المتوقّفة. لاستئناف عملية تحميل متوقّفة، اتّبِع الخطوات التالية:
حالة الطلب: يمكنك الاستعلام عن الحالة الحالية للتحميل من خلال إرسال طلب
PUT
فارغ إلى معرّف الموارد المنتظِم للتحميل. بالنسبة إلى هذا الطلب، يجب أن تشمل عناوين HTTP عنوانContent-Range
يشير إلى أنّ الموضع الحالي في الملف غير معروف. على سبيل المثال، اضبطContent-Range
على*/2000000
إذا كان إجمالي طول الملف هو 2,000,000. إذا لم تكن تعرف الحجم الكامل للملف، اضبط القيمة Content-Range على*/*
.الحصول على عدد وحدات البايت التي تم تحميلها عالج الاستجابة من طلب حالة الربط. يستخدم الخادم عنوان
Range
في استجابته لتحديد وحدات البايت التي تلقّاها حتى الآن. على سبيل المثال، يشير عنوانRange
0-299999
إلى أنّه تم تلقّي أول 300,000 بايت من الملف.تحميل البيانات المتبقية أخيرًا، بعد أن عرفت مكان استئناف الطلب، أرسِل البيانات المتبقية أو الجزء الحالي. يُرجى العِلم أنّه عليك التعامل مع البيانات المتبقية كقسم منفصل في كلتا الحالتَين، لذا عليك إرسال العنوان
Content-Range
عند استئناف التحميل.
مثال: استئناف عملية تحميل متوقّفة
اطلب معرفة حالة التحميل. يستخدم الطلب التالي الرأس Content-Range للإشارة إلى أنّ الموضع الحالي في ملف الـ 2,000,000 بايت هو غير معروف.
PUT {session_uri} HTTP/1.1 Content-Length: 0 Content-Range: bytes */2000000
استخرِج عدد وحدات البايت التي تم تحميلها حتى الآن من الردّ. يستخدم ردّ الخادم العنوان
Range
للإشارة إلى أنّه تلقّى أول 43 بايت من الملف حتى الآن. استخدِم القيمة العليا لعنوان النطاق لتحديد مكان بدء عملية التحميل التي تم استئنافها.HTTP/1.1 308 Resume Incomplete Content-Length: 0 Range: 0-42
استئنِف عملية التحميل من حيث توقّفت. يستئنِف الطلب التالي عملية التحميل من خلال إرسال البايتات المتبقية من الملف، بدءًا من البايت 43.
PUT {session_uri} HTTP/1.1 Content-Length: 1999957 Content-Range: bytes 43-1999999/2000000 bytes 43-1999999
معالجة الأخطاء
عند تحميل الوسائط، من المفيد معرفة بعض أفضل الممارسات المتعلّقة بمعالجة الأخطاء.
استئناف عمليات التحميل التي تعذّر إكمالها بسبب انقطاع الاتصال أو أي أخطاء من النوع 5xx، بما في ذلك:
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
استخدِم استراتيجية الانتظار المتزايد إذا تم عرض أي خطأ من النوع
5xx
في الخادم عند استئناف طلبات التحميل أو إعادة تجربتها. يمكن أن تحدث هذه الأخطاء إذا كان الخادم يواجه حمولة زائدة. يمكن أن يساعد التوقّف التلقائي المتصاعد في تخفيف هذه الأنواع من المشاكل خلال فترات ارتفاع عدد الطلبات أو زيادة عدد عمليات الوصول إلى الشبكة.لا يُفترض أن تعالج ميزة التراجع الأسي الأنواع الأخرى من الطلبات، ولكن يظل بإمكانك إعادة محاولة إرسال عدد منها. عند إعادة محاولة إرسال هذه الطلبات، حدِّد عدد المرات التي ستعيد فيها المحاولة. على سبيل المثال، يمكن أن تحدّ التعليمات البرمجية من عدد عمليات إعادة المحاولة إلى عشرة أو أقل قبل الإبلاغ عن خطأ.
يمكنك معالجة أخطاء
404 Not Found
و410 Gone
عند إجراء عمليات تحميل قابلة للاستئناف من خلال إعادة التحميل بالكامل من البداية.
الرقود الأسي
إنّ مهلة الانتظار الأسية هي استراتيجية معالجة أخطاء قياسية لتطبيقات الشبكة التي يعيد فيها العميل بشكل دوري محاولة إرسال طلب تعذّر تنفيذه على مدار مدّة متزايدة. إذا كان عدد الطلبات الكبير أو عدد الزيارات المرتفع إلى الشبكة يؤديان إلى عرض الخادم لأخطاء، قد تكون استراتيجية التراجع الأسي استراتيجية جيدة للتعامل مع هذه الأخطاء. في المقابل، لا تُعدّ هذه الاستراتيجية مناسبة للتعامل مع الأخطاء غير المرتبطة بحجم الشبكة أو أوقات الاستجابة، مثل بيانات اعتماد التفويض غير الصالحة أو أخطاء عدم العثور على الملف.
عند استخدامه بشكل صحيح، يزيد التراجع الدليلي من كفاءة استخدام معدل نقل البيانات، ويقلّل من عدد الطلبات المطلوبة للحصول على ردّ ناجح، ويحقّق الحد الأقصى من معدل نقل البيانات للطلبات في البيئات المتزامنة.
في ما يلي خطوات تنفيذ ميزة "الرقود الأسي الثنائي" البسيطة:
- أرسِل طلبًا إلى واجهة برمجة التطبيقات.
- تلقّي استجابة
HTTP 503
، ما يشير إلى أنّه عليك إعادة محاولة إرسال الطلب - انتظِر ثانية واحدة + عدد_عشوائي_بالملي ثانية ثم أعِد محاولة إجراء الطلب.
- تلقّي استجابة
HTTP 503
، ما يشير إلى أنّه عليك إعادة محاولة إرسال الطلب - انتظِر لمدة ثانيتَين + عدد_عشوائي_بالملي ثانية، ثم أعِد محاولة إجراء الطلب.
- تلقّي استجابة
HTTP 503
، ما يشير إلى أنّه عليك إعادة محاولة إرسال الطلب - انتظِر 4 ثوانٍ + عدد_عشوائي_بالملي ثانية، ثم أعِد محاولة إجراء الطلب.
- تلقّي رمز
HTTP 503 response
، ما يعني أنّه عليك إعادة محاولة إرسال الطلب - انتظِر لمدة 8 ثوانٍ + عدد_عشوائي_بالملي ثانية، ثم أعِد محاولة إجراء الطلب.
- تلقّي رمز
HTTP 503 response
، ما يعني أنّه عليك إعادة محاولة إرسال الطلب - انتظِر لمدة 16 ثانية + عدد_عشوائي_بالملي ثانية، ثم أعِد محاولة إجراء الطلب.
- إيقاف. الإبلاغ عن خطأ أو تسجيله
في القائمة أعلاه، random_number_milliseconds هو عدد عشوائي من المللي ثانية أقل من 1000 أو يساويه. وهذا ضروري، لأنّ إدخال تأخّر هائل عشوائي قليل يساعد في توزيع الحمل بشكلٍ أكثر توازناً وتجنُّب احتمال ازدحام الخادم. يجب إعادة تحديد قيمة random_number_milliseconds بعد كل انتظار.
يتم ضبط الخوارزمية لإنهاء العملية عندما يكون n يساوي 5. يمنع هذا الحدّ الأقصى عملاء Google Chrome من إعادة المحاولة إلى ما لا نهاية، ويؤدي إلى تأخير إجمالي يبلغ حوالي 32 ثانية قبل اعتبار الطلب "خطأً لا يمكن تصحيحه". لا بأس بزيادة الحد الأقصى لعدد عمليات إعادة المحاولة، خاصةً إذا كانت عملية التحميل طويلة، ولكن احرص على تحديد الحد الأقصى للتأخير بين عمليات إعادة المحاولة بقيمة معقولة، مثلاً أقل من دقيقة واحدة.