تحديد موقع IP في Cloudflare Workers: التخزين المؤقت وبدء التشغيل البارد
يعني تحديد موقع IP في Cloudflare Workers قراءة بيانات الموقع الخاصة بالزائر داخل الـ Worker، إما من الكائن المدمج request.cf أو عبر استدعاء API خارجي لاستخبارات IP من الحافة. يجيب كل أسلوب عن سؤال مختلف، ومن المفيد فهم سلوك التخزين المؤقت وبدء التشغيل البارد في كل منهما قبل أن تبني عليه.
ما يقدمه لك Workers مجانًا
يحمل كل طلب يصل إلى Worker كائن request.cf تملؤه Cloudflare. يتضمن هذا الكائن بلد الزائر ومدينته ومنطقته وإحداثياته ومنطقته الزمنية وASN ومؤسسة AS، إضافةً إلى الحقل colo الذي يحدد مركز البيانات الذي عالج الطلب. كما يحمل الترويس CF-IPCountry رمز البلد. ولأن هذه البيانات تُرفق قبل تشغيل شيفرتك، فإنها لا تكلّف طلبًا فرعيًا إضافيًا ولا زمن استجابة إضافيًا.
الحدّ هنا هو النطاق. يصف request.cf العميل المتصل بالطلب الحالي فقط ولا شيء غيره. فهو لا يخبرك عن عنوان IP يظهر في سطر سجل أو حقل نموذج أو حمولة webhook أو سلسلة X-Forwarded-For، ولا يحمل أي إشارات سمعة مثل VPN أو Tor أو علامات إساءة الاستخدام. وحين تحتاج إلى إثراء عنوان عشوائي فإنك تستدعي API، وهنا تبدأ قرارات التخزين المؤقت.
تخزين بيانات الإثراء مؤقتًا على الحافة
إن بحث IP من داخل Worker هو طلب فرعي، لذا فكل بحث غير مخزّن يضيف رحلة شبكية إلى مسار الطلب. توفر Cloudflare عدة أماكن لتخزين النتيجة مؤقتًا: Cache API (لكل مركز بيانات، وغير مكرر عالميًا)، وKV (قابل للقراءة عالميًا لكنه متسق في نهاية المطاف، وتستغرق الكتابات وقتًا حتى تنتشر)، وDurable Objects عندما تحتاج إلى نسخة واحدة منسّقة. لا يصلح أي منها كذاكرة تخزين مؤقت عالمية جاهزة، لذا اختر بحسب ما تتحمله: Cache API هو الأبسط والأسرع لعمليات البحث كثيرة القراءة، بينما يناسب KV القيم التي تريدها مرئية من كل موقع.
القرار التصميمي الأنفع هو مدة الصلاحية (TTL) لكل حقل، لأن بيانات استخبارات IP لا تتقادم بوتيرة واحدة. تتغير تعيينات البلد وASN ببطء لأن كتل العناوين تُعاد تخصيصها على مدى أشهر أو سنوات، لذا فمدة صلاحية تبلغ ساعات عديدة معقولة. أما علامات السمعة فمختلفة. تتجدد مصادر VPN وTor وإساءة الاستخدام في ipto كل 6 ساعات، وتتجدد مجموعات بيانات IP وASN يوميًا، لذا فإن تخزين علامة مثل is_tor أكثر من بضع ساعات يعني أنك ستقدّم إجابات أقدم من المصدر نفسه. التقسيم العملي هو تخزين حقائق الشبكة (asn وasn_org والبلد والمدينة) لنحو يوم، وتخزين العلامات (is_vpn وis_tor وis_abuser وis_datacenter) لمدة لا تتجاوز فترة تحديث المصدر.
- اجعل مفتاح التخزين المؤقت هو عنوان IP بعد توحيد صيغته (وفي IPv6 فكّر في استخدام /64 مفتاحًا إن كانت حالتك تخص الشبكة لا المضيف).
- خزّن النتائج السلبية أيضًا، حتى لا تصل عمليات البحث المتكررة عن عنوان غير مدرج إلى API في كل مرة.
- لا تخزّن نتائج bogon تحت مفتاح عام عن طريق الخطأ: فالعنوان الخاص مثل
10.0.0.1يمكن الإجابة عنه محليًا دون أي استدعاء API.
بدء التشغيل البارد على Workers
تعمل Workers في عزلات V8 لا في حاويات، لذا فإن بدء التشغيل البارد يستغرق عادةً بضعة مللي ثوانٍ، لا مئات المللي ثانية المألوفة في الدوال القائمة على الحاويات. ومع ذلك تدفع شيفرتك ثمن تهيئتها هي: حزمة كبيرة، أو تحليل ثقيل على مستوى الوحدة لجدول بحث ضخم، أو عمليات await في المستوى الأعلى، كلها تحدث عند أول طلب إلى عزلة جديدة. والحل معتاد: أبقِ الحزمة صغيرة، وتجنب بناء بنى كبيرة في الذاكرة عند بدء التشغيل، وفضّل استدعاء API واحدًا صغيرًا على تضمين قاعدة بيانات تحديد مواقع كاملة داخل الـ Worker.
أما نبضات التسخين التي يستخدمها البعض مع الحوسبة اللاخادمية التقليدية فهي مهدرة في الغالب هنا. تُنشأ العزلات وتُخلى وفق جدول Cloudflare، والنبضة تصل إلى موقع واحد فقط، وتكلفة البدء البارد صغيرة بحيث يكون تخزين نتيجة البحث مؤقتًا أهم بكثير من إبقاء العزلة حيّة. قِس أولًا بتحليلات Workers وبتوقيتك الخاص حول الطلب الفرعي قبل تحسين أي شيء.
الجمع بين ذلك كله مع ipto
النمط المعقول هو استخدام request.cf للحقائق الفورية المجانية عن العميل المتصل، واستدعاء API إثراء فقط عندما تحتاج إلى المزيد. تعرض وثائق API الخاصة بـ ipto استجابة بحث IP التي تعيد البلد والمدينة وASN والمؤسسة وcurrency_code والعلامات is_vpn وis_tor وis_abuser وis_datacenter وbogon/bogon_type. وهي مجانية بلا تسجيل مع 1,000 طلب مجاني يوميًا، وهو يكفي لتجربة Worker دون خطوة لإدارة المفاتيح.
وحين يخبرك البحث بأن العنوان يعود إلى شبكة استضافة، يمكنك المتابعة في بحث ASN لمعرفة من يشغّلها وما النطاقات التي تعلنها. أما للحركة المعلَّمة، فتعرض أداة فحص VPN وTor والوكيل الأدلة وراء is_vpn وis_tor، وتعرض أداة فحص إساءة استخدام IP الدرجة المدعومة بأدلة متعددة. وتذكّر أن الموقع على مستوى المدينة تقدير لمكان تسجيل الشبكة أو توجيهها لا لمكان جلوس شخص ما، وهو قيد موضّح في لماذا تظل دقة المدينة محدودة.
تجعل الحافة عمليات البحث سريعة، لكنها لا تجعل البيانات الأساسية أدق. تعامل مع request.cf ومع أي نتيجة API بوصفهما دليلًا من الفئة نفسها، وخزّن كلًّا منهما بحسب سرعة تغيّره، ودع حداثة المصدر لا سرعة الحافة تحدد مدد الصلاحية لديك.