اذهب مقابل Excel على مئات الآلاف من الصفوف

لقد كتبنا هذا العام بالفعل على هبر عن مشروع SmartCalls.io - المصمم المرئي للمكالمات التي تم إنشاؤها للمستخدمين من رجال الأعمال. يحل المشروع مشكلة العمل في مكالمات العملاء الجماعية: يتم إنشاء نص برمجي للمكالمات المرئية ، ويتم تحميل ملف Excel بأرقام الهاتف ، ثم يتم إنشاء حملة مكالمات. إطلاق الحملة - بدء مكالمات العملاء ؛ في أي وقت يمكنك مشاهدة الإحصائيات ، وإيقاف الحملة مؤقتًا ، وتعديل الإعدادات. كان العملاء راضين حتى أصبح من الواضح أنه في بعض الأحيان يكون من الضروري الاتصال ليس فقط بالكثير من الناس ، ولكن أيضًا كثيرًا جدًا. تحت الخفض هو جوهر المشكلة وكيف هزمناها بمساعدة لغة برمجة HYIP (لا أساس لها).


المشكلة


في البداية ، تم تنفيذ معالجة الملفات في PHP 7.1 - كان خيارًا واضحًا ، حيث تمت كتابة SmartCalls API بالكامل عليه. العمل مع قوائم المكالمات له قيود واحدة - يجب ألا يحتوي الملف على أكثر من 10 آلاف سطر معبأ. كان هذا القيد من البداية في SmartCalls ، ومع ذلك ، لم يكن حرجًا. حتى نقطة معينة.

كان أحد البنوك الكبيرة بحاجة إلى حملات هاتفية كبيرة جدًا: كان مطلوبًا الاتصال بأكثر من 10 آلاف مستخدم. بالطبع ، لم يمنع أي شيء من كسر الملفات الكبيرة إلى عدة ملفات صغيرة وتنزيلها واحدًا تلو الآخر ، ولكن جعل العملاء يعانون مثل هذا ليس أسلوبنا. بالحديث عن التنزيلات البديلة - إذا أطلق عميلنا بالفعل حملة مكالمات وأراد فجأة إضافة مستخدمين إليها ، فيمكنه القيام بذلك بسهولة. هذا أمر مريح للغاية لأنك لا تحتاج إلى التوقف عن الاتصال أو تشغيل حملة منفصلة للمستخدمين الجدد. ولكن يجب أن تفهم أن إمكانية إعادة التحميل لم يتم تصورها كوسيلة لتحميل الملفات الكبيرة يدويًا ، على شكل قطع.

لذا ، كان على الفريق مهمة - تنفيذ تحميل الملفات الكبيرة في حملة المكالمات الهاتفية.

الحل


نحن أكفاء للغاية في تطوير Java - على سبيل المثال ، يتم تنفيذ Voximplant API جزئيًا بهذه اللغة ؛ نحن جيدون أيضًا في PHP (انظر المثال أعلاه - يقترح الكابتن أدلة). أي أنه يمكننا إغلاق هذه المهمة بسرعة باستخدام إحدى هذه اللغات ، لكننا فكرنا لفترة طويلة في توسيع مجموعة التكنولوجيا الخاصة بنا ، وهنا تذكرنا أن تذهب جيدًا: فهي سريعة بما يكفي (تعمل بشكل جيد مع الذاكرة) ، ومتعددة الخيوط ولا تحتاج إلى وقت تشغيل لأن انتقل ترجمة إلى ثنائي قابل للتنفيذ. بالإضافة إلى ذلك ، يمكننا أن نقول عن حجم الحاويات ، ولكن المزيد عن ذلك لاحقًا ...

ونتيجة لذلك ، كتبنا خدمة صغيرة في Go ، والتي تقبل الأوراق الكبيرة (تم اختبارها حتى 300 ألف سطر) والتنسيق (xls و xlsx وجميع أشكالها المختلفة). حان الوقت للتفاصيل.

التنفيذ


عندما يقوم أحد العملاء بتحميل ملف> 10 آلاف سطر إلى حملة SmartCalls ، يتم أخذ خدمة صغيرة لذلك. يستغرق مؤشرات الإدخال:

  • إلى ملف تم تنزيله على تخزين S3 ؛
  • إلى الحملة التي يجب تحميل هذا الملف إليها.

ثم تعمل الخدمة الصغيرة عبر الملف ، وتضربها في أجزاء من 10 آلاف سطر (بحد أقصى للنظام الأساسي) وتحمل كل قطعة كملف csv في تخزين S3 ، وتدوين الملاحظات في قاعدة البيانات حول كل قطعة (مسار الملف ، عدد الأسطر). تتم معالجة وتحميل كل قطعة في تيار منفصل ، مما يعطي زيادة إضافية في سرعة التنفيذ.

لقراءة ملفات Excel تستخدم مكتبات مفتوحة المصدر من tealeg و extrame . من الجيد أنه ليس لديهم الكثير من النجوم فحسب ، بل لديهم أيضًا تعهدات جديدة :)

import ( "github.com/tealeg/xlsx" "github.com/extrame/xls" //   ) 

وكل شيء سيكون على ما يرام ، ولكن ليس بدون فروق دقيقة. أثناء التطوير ، اتضح أن xlsx و xls ، اللذين تم إنشاؤهما في محررين مختلفين ، يختلفان تمامًا في التنسيقات والقواعد للعمل معهم. اضطررت إلى إجراء العديد من الاختبارات - OpenOffice ، Excel من إصدارات مختلفة ، LibreOffice ، جداول بيانات Google ، لتعليم الخدمة المصغرة لإحضار الملفات إلى نموذج واحد - CSV. بعد أن تمضغ الخدمة الصغيرة ملفًا كبيرًا وتحوله إلى ملف CSV ، يتم تشغيل واجهة برمجة تطبيقات SmartCalls وتعمل بالفعل مع ملف csv هذا. بالنسبة للخدمة المتناهية الصغر ، تركنا حد 300 ألف خط ، لأنه يغطي احتياجات العملاء بشكل كبير ، ولم نواجه أي احتياجات أكبر على الإطلاق.

ونتيجة لذلك ، أظهر التنفيذ نتائج ممتازة في الاختبارات والتجهيز المسبق ، وبعد ذلك طرحناها في المنتج.

الخلاصة


يحاول فريقنا دائمًا طرح الميزات / التحسينات الجديدة بسرعة ، لأننا نريد أن يظل العملاء الراضون على هذا النحو. لم تكن المهمة ذات الملفات الكبيرة تحديًا آخر بالنسبة لنا فحسب ، بل كانت أيضًا سببًا وجيهًا لتقديم Go في المشروع ، والذي نظرنا إليه لفترة طويلة. بالإضافة إلى التطور السريع وسرعة العمل ، يمنحنا Go أساسًا للمستقبل عندما نبدأ في تقديم حاويات (لإجراء تحديثات سلسة وهذا كل شيء) ، وهي لغة خفيفة للغاية. سنكتب عن الحاويات بشكل منفصل ، ترقبوا :)

Source: https://habr.com/ru/post/ar424697/


All Articles