بناء أداة للتحقق من مستلمي الطيور بشكل غير متزامن بالجملة
البريد الإلكتروني
·
26/05/2022

النقاط الرئيسية
قام المؤلف بإنشاء أداة تحقق من المستلمين بكميات كبيرة للتحقق من ملايين عناوين البريد الإلكتروني بكفاءة باستخدام واجهة برمجة التطبيقات للتحقق من المستلمين من Bird.
ثبت أن Node.js أسرع وأكثر قابلية للتوسع من Python نظرًا لوظائف الإدخال/الإخراج غير المت阻نة ونقص قيود GIL.
تقرأ الأداة ملفات CSV بشكل غير متزامن، وتستدعي واجهة برمجة التطبيقات للتحقق لكل بريد إلكتروني، وتكتب النتائج إلى ملف CSV جديد في الوقت الحقيقي.
تجنب هذه الطريقة اختناقات الذاكرة وتحسن من الإنتاجية لتصل إلى حوالي 100,000 تحقق في أقل من دقيقة.
يمكن أن تشمل التحسينات المستقبلية معالجة أفضل لإعادة المحاولة، وواجهة مستخدم سهلة الاستخدام، أو الانتقال إلى بيئات بدون خادم من أجل القابلية للتوسع.
أهم النقاط في الأسئلة والأجوبة
ما الغرض من أداة التحقق من صحة المستلمين بشكل غير متزامن بالجملة؟
يقوم بالتحقق من كميات كبيرة من عناوين البريد الإلكتروني من خلال التكامل مباشرة مع واجهة برمجة تطبيقات التحقق من المستلمين الخاصة بـ Bird، مما يخرج نتائج موثوقة بسرعة دون أي تحميلات يدوية.
لماذا تم استخدام بايثون في البداية ثم تم استبداله بـ Node.js؟
كان قفل المترجم العالمي لبايثون (GIL) يحد من التزامن، بينما سمح Node.js بالتنفيذ غير المتزامن الحقيقي، مما أدى إلى إجراء مكالمات API متوازية بشكل أسرع بكثير.
كيف تتعامل الأداة مع الملفات الكبيرة دون النفاد من الذاكرة؟
بدلاً من تحميل كل البيانات دفعة واحدة، يقوم البرنامج النصي بمعالجة كل سطر من CSV بشكل فردي - حيث يرسل طلب التحقق ويكتب النتائج على الفور إلى ملف CSV جديد.
ما المشكلة التي يحلها هذا الأداة للمطورين؟
يتيح التحقق من صحة قوائم البريد الإلكتروني على نطاق واسع، متجاوزًا حد 20 ميغابايت لمُحقق SparkPost القائم على واجهة المستخدم وإلغاء الحاجة إلى تحميل ملفات متعددة يدويًا.
ما مدى سرعة الإصدار النهائي من البرنامج؟
حوالي 100,000 تحقق مكتمل في 55 ثانية، مقارنة بأكثر من دقيقة عند استخدام النسخة الخاصة بالواجهة.
ما القضايا التي واجهت في أنظمة ويندوز؟
تسبب تجمع اتصالات عميل HTTP في Node.js في حدوث أخطاء “ENOBUFS” بعد العديد من الطلبات المتزامنة، والتي تم إصلاحها عن طريق تكوين إعادة استخدام اتصال axios.
ما التحسينات المستقبلية المقترحة؟
إضافة معالجة الأخطاء وإعادة المحاولة، وإنشاء واجهة أمامية، أو تنفيذ الأداة كوظيفة Azure بدون خادم من أجل تحسين القابلية للتوسع والمرونة.
لمن يبحث عن برنامج سريع وبسيط يستقبل ملف CSV، يتصل بواجهة برمجة التطبيقات للتحقق من المستلم، ويخرج ملف CSV، فهذا البرنامج مناسب لك.
عند بناء تطبيقات البريد الإلكتروني، يحتاج المطورون غالبًا إلى دمج خدمات متعددة وواجهات برمجة التطبيقات. فهم أساسيات واجهة برمجة تطبيقات البريد الإلكتروني في بنية السحابة يوفر الأساس لبناء أدوات قوية مثل نظام التحقق الجماعي الذي سنقوم بإنشائه في هذا الدليل.
واحدة من الأسئلة التي نتلقاها أحيانًا هي، كيف يمكنني التحقق من قوائم البريد الإلكتروني بشكل جماعي مع تحقق المستلم? هناك خياران هنا، أحدهما هو رفع ملف عبر واجهة SparkPost للتحقق، والآخر هو إجراء مكالمات فردية لكل بريد إلكتروني إلى واجهة برمجة التطبيقات (حيث إن واجهة برمجة التطبيقات هي التحقق من بريد إلكتروني واحد).
يعمل الخيار الأول بشكل رائع ولكنه لديه حدود 20 ميجابايت (حوالي 500,000 عنوان). ماذا لو كان لدى شخص ما قائمة بريد إلكتروني تحتوي على ملايين العناوين؟ قد يعني ذلك تقسيم ذلك إلى آلاف من عمليات رفع ملفات CSV.
نظرًا لأن رفع آلاف ملفات CSV يبدو بعيد المنال بعض الشيء، أخذت تلك الحالة وبدأت أتساءل كم من السرعة يمكنني الحصول على واجهة برمجة التطبيقات لتعمل. في هذه المقالة، سأشرح ما حاولت وكيف انتهيت أخيرًا إلى برنامج يمكنه الحصول على حوالي 100,000 تحقق في 55 ثانية (بينما حصلت في واجهة المستخدم على حوالي 100,000 تحقق في دقيقة و 10 ثوان).
النهج | التحققات التي تم اختبارها | الوقت لإكمال | العدد التقريبي للمعالجة |
|---|---|---|---|
أداة Node.js للتحقق الجماعي غير المتزامن | 100,000 | 55 ثانية | ~1,818 تحقق/ثانية |
تحميل واجهة SparkPost | 100,000 | 1 دقيقة و 10 ثوان | ~1,428 تحقق/ثانية |
وعلى الرغم من أن هذا لا يزال سيستغرق حوالي 100 ساعة لإنجازه مع حوالي 654 مليون تحقق، يمكن لهذا السكربت العمل في الخلفية موفرًا وقتًا كبيرًا.
يمكن العثور على النسخة النهائية من هذا البرنامج هنا.
خطأي الأول: استخدام بايثون
خطأ الثاني: محاولة قراءة الملف في الذاكرة
كانت فكرتي الأولية كما يلي:

أولاً، قم بإدخال قائمة بريد إلكتروني بصيغة CSV. ثانيًا، قم بتحميل عناوين البريد الإلكتروني في مصفوفة وتحقق من أنها بالتنسيق الصحيح. ثالثًا، قم بعمل استدعاء غير متزامن لواجهة برمجة تطبيقات التحقق من المستلم. رابعًا، انتظر النتائج وقم بتحميلها في متغير. وأخيرًا، قم بإخراج هذا المتغير إلى ملف CSV.
لقد عمل ذلك بشكل جيد جدًا للملفات الصغيرة. لكن المشكلة ظهرت عندما حاولت تشغيل 100,000 بريد إلكتروني. توقفت البرنامج حوالي 12,000 عملية تحقق. مع مساعدة أحد مطوري الواجهة الأمامية لدينا، رأيت أن المشكلة كانت في تحميل جميع النتائج في متغير (وهكذا نفدت الذاكرة بسرعة). إذا كنت ترغب في رؤية النسخة الأولى من هذا البرنامج، فقد قمت بربطها هنا: الإصدار 1 (غير موصى به).

أولاً، قم بإدخال قائمة بريد إلكتروني بصيغة CSV. ثانيًا، قم بحساب عدد عناوين البريد الإلكتروني في الملف لأغراض التقرير. ثالثًا، بينما يتم قراءة كل سطر بشكل غير متزامن، قم باستدعاء واجهة برمجة تطبيقات التحقق من المستلم وأخرج النتائج إلى ملف CSV.
وبذلك، مع قراءة كل سطر، أقوم باستدعاء واجهة برمجة التطبيقات وأكتب النتائج بشكل غير متزامن حتى لا أحتفظ بأي من هذه البيانات في الذاكرة على المدى الطويل. كما قمت بإزالة التحقق من صياغة البريد الإلكتروني بعد التحدث مع فريق التحقق من المستلمين، حيث أبلغوني أن التحقق من المستلم قد تم بناءه بالفعل للتحقق مما إذا كان البريد الإلكتروني صالحًا أم لا.
تحليل الشيفرة النهائية
الخطوات التالية
لشخص يبحث عن برنامج سريع وبسيط يأخذ ملف csv، ويستدعي واجهة برمجة تطبيقات التحقق من المستلم، ويخرج ملف CSV، فهذا البرنامج مناسب لك.
تشمل بعض الإضافات إلى هذا البرنامج ما يلي:
بناء واجهة أمامية أو واجهة مستخدم أسهل للاستخدام
تحسين التعامل مع الأخطاء وإعادة المحاولة لأنه إذا حدثت مشكلة وظهرت رسالة خطأ من واجهة برمجة التطبيقات، فإن البرنامج حالياً لا يقوم بإعادة المحاولة
النظر في تنفيذ كخدمة وظيفة Azure بدون خادم من أجل التوسع التلقائي وتقليل إدارة البنية التحتية
وأود أيضاً أن أكون فضولياً لمعرفة ما إذا كان من الممكن تحقيق نتائج أسرع مع لغة أخرى مثل Golang أو Erlang/Elixir. بخلاف اختيار اللغة، يمكن أن تؤثر قيود البنية التحتية أيضًا على الأداء - لقد تعلمنا هذا عن كثب عندما واجهنا حدود DNS غير موثقة في AWS أثرت على أنظمة معالجة البريد الإلكتروني ذات الحجم الكبير لدينا.
بالنسبة للمطورين المهتمين بدمج معالجة واجهة برمجة التطبيقات مع أدوات تدفق العمل المرئي، تحقق من كيفية دمج Flow Builder مع وظائف Google Cloud من أجل تدفقات العمل بدون كود.
لا تتردد في تزويدي بأي تعليقات أو اقتراحات لتوسيع هذا المشروع.



