أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

أليكسي نايدنوف ، الرئيس التنفيذي ITooLabs، يتحدث عن تطوير منصة اتصالات لمشغلي الاتصالات بلغة البرمجة Go (Golang). يشارك Alexey أيضًا تجربته في نشر وتشغيل النظام الأساسي في واحدة من أكبر مشغلي الاتصالات في آسيا ، والتي استخدمت النظام الأساسي لتوفير خدمات البريد الصوتي (VoiceMail) و Virtual PBX (Cloud PBX).

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

أليكسي نايدنوف (من الآن فصاعدًا - AN): - أهلاً بكم! اسمي أليكسي نايدنوف. أنا مدير ITooLabs. بادئ ذي بدء ، أود أن أجيب على ما أفعله هنا وكيف انتهى بي المطاف هنا.

إذا نظرت إلى سوق Bitrix24 (قسم "الاتصالات الهاتفية") ، فإن 14 تطبيقًا و 36 تطبيقًا (40٪) لدينا:

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

بتعبير أدق ، هؤلاء هم شركاؤنا ، ولكن وراء كل هذا منصتنا (النظام الأساسي كخدمة) - ما نبيعه لهم مقابل فلس صغير. في الواقع ، أود أن أتحدث عن تطوير هذه المنصة وكيف أتينا إلى Go.

الأرقام الخاصة بمنصتنا الآن هي:

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

44 مشغل شريك ، بما في ذلك MegaFon. بشكل عام ، نحن نحب الذهاب في مغامرات ، ولدينا بالفعل وصول إلى 100 مليون مشترك من 44 مشغلًا هنا في روسيا. لذلك ، إذا كان لدى شخص ما بعض الأفكار التجارية ، يسعدنا دائمًا الاستماع إليها.

  • 5000 شركة مستخدم.
  • 20،000 مشترك إجمالاً. الأمر كله عبارة عن B2B - نحن نعمل فقط مع الشركات.
  • 300 مكالمة في الدقيقة خلال اليوم.
  • 100 مليون دقيقة مكالمات العام الماضي (احتفلنا). هذا دون الأخذ بعين الاعتبار المفاوضات الداخلية الموجودة على برنامجنا.

كيف بدأت؟

كيف يبدأ الرجال المناسبون في صنع منصتهم الخاصة؟ يجب أيضًا أن يؤخذ في الاعتبار أن لدينا تاريخًا من تطوير "المشاريع القوية" ، وحتى في أكثر الأوقات دقة في السنة بالنسبة للمؤسسة! لقد كان ذلك الوقت السعيد عندما تأتي إلى العميل وتقول: "نحتاج إلى خادمين آخرين". والعميل: "نعم بلا شك! لدينا عشرة في الرف.

لذلك قمنا بعمل Oracle و Java و WebSphere و Db2 وكل ذلك. لذلك ، أخذنا بالطبع أفضل حلول البائعين ودمجناها وحاولنا الانطلاق معها. لقد لعبوا بمفردهم. سيكون مثل هذا بدء التشغيل الداخلي.

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

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

خذ برنامج VMWare. نظرًا لأننا كنا نسير بمفردنا ، فقد اضطررنا على الفور إلى التخلي عن البائع الرائع Storage. نحن نعلم كل شيء عنهم: يجب تقسيم الوعود على 3 ، ويجب مضاعفة التكلفة في 10. لذلك ، قمنا بعمل DirDB وما إلى ذلك.

ثم بدأت في النمو. تمت إضافة خدمة الفوترة إلى هذا ، لأن النظام الأساسي لم يعد قادرًا على التأقلم. ثم انتقل خادم الفوترة من MySQL إلى Mongo. نتيجة لذلك ، حصلنا على حل عملي يعالج جميع المكالمات التي تذهب إلى هناك:

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

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

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

قررنا أن نفعل شيئًا مختلفًا!

متطلبات المنصة

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

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

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

وفقًا لذلك ، من متطلبات المنتج الذي قدمناه لأنفسنا ، تنمو متطلبات اللغة بطريقة منطقية واضحة.

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

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

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

اذهب المهزوم!

تاريخ Go

لقد صنعنا منصة عليها. سأحاول شرح السبب.

تاريخ موجز للذهاب. بدأ في عام 2007 ، وافتتح في عام 2009 ، وتم إصدار الإصدار الأول في عام 2012 (أي أننا بدأنا العمل حتى قبل الإصدار الأول). كان البادئ هو Google ، الذي أراد أن يحل محل جافا ، كما أظن.

المؤلفون مشهورون جدًا:

  • اخترع كين طومسون ، الذي كان وراء يونكس ، UTF-8 ، وعمل على نظام الخطة 9 ؛
  • روب بايك ، الذي صمم UTF-8 مع كين ، عمل أيضًا في الخطة 9 ، Inferno ، Limbo في Bell Labs ؛
  • روبرت جيزمر ، الذي نعرفه ونحبّه لاختراعه Java HotSpot Compiler ولعمله على المولد في V8 (مترجم Google Javascript) ؛
  • وأكثر من 700 مساهم ، بما في ذلك بعض التصحيحات الخاصة بنا.

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

اذهب في لمحة

نرى أن اللغة بسيطة ومفهومة إلى حد ما. لدينا أنواع واضحة: في بعض الحالات يجب التصريح عنها ، وفي حالات أخرى لا يحتاجون إليها (بمعنى أنه تم الاستدلال على الأنواع على أي حال).

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

يمكن ملاحظة أنه من المألوف وصف الهياكل. يمكن ملاحظة أن لدينا مفهوم المؤشر (حيث توجد علامة النجمة). يمكن ملاحظة أن هناك دعمًا خاصًا للإعلان عن تهيئة المصفوفات والمصفوفات الترابطية.

مفهوم تقريبًا - يمكنك العيش. أحاول كتابة مرحبًا ، أيها العالم:

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

ماذا نرى؟ هذا بناء جملة يشبه C ، والفاصلة المنقوطة اختيارية. يمكن أن يكون فاصلًا لخطين ، ولكن فقط إذا كان هذان البناءان موجودان تمامًا على نفس السطر.

نرى أن الأقواس الموجودة في هياكل التحكم (في السطر الرابع عشر) اختيارية ، ولكن دائمًا ما تكون الأقواس المتعرجة مطلوبة. نرى أن الكتابة ثابتة. يتم عرض تيم في معظم الحالات. هذا المثال أكثر تعقيدًا من نموذج Hello ، world المعتاد - فقط لإظهار وجود مكتبة.

ما الذي نراه مهمًا أيضًا؟ تم تنظيم الكود في حزم. ومن أجل استخدام الحزمة في التعليمات البرمجية الخاصة بك ، تحتاج إلى استيرادها باستخدام توجيه الاستيراد - وهذا مهم أيضًا. نبدأ - إنه يعمل. عظيم!

لنجرب شيئًا أكثر تعقيدًا: مرحبًا ، أيها العالم ، ولكنه الآن خادم http. ما الذي نراه مثيرًا للاهتمام هنا؟

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

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

في Go ، المعرّف العام للحزمة هو عنوان URL لمستودعها. هناك أداة مساعدة خاصة من Goget تناسب جميع التبعيات وتنزيلها وتثبيتها وتجميعها وتجهيزها للاستخدام إذا لزم الأمر. في الوقت نفسه ، يعرف Goget عن html-meta. وفقًا لذلك ، يمكنك الاحتفاظ بدليل http ، والذي سيحتوي على روابط إلى مستودعك المحدد (كما نفعل نحن ، على سبيل المثال).

ماذا نرى ايضا؟ Http و Json في المكتبة العادية. من الواضح أن هناك استبطانًا - انعكاسًا ، يجب استخدامه في ترميز / json ، لأننا ببساطة نستبدل به كائنًا تعسفيًا.

نقوم بتشغيله ونرى أن لدينا 20 سطرًا من التعليمات البرمجية المفيدة التي تجمع وتشغل وتعطي متوسط ​​الحمل الحالي للجهاز (على الجهاز الذي تعمل عليه).
ما المهم أيضًا مما يمكننا رؤيته هنا على الفور؟ يتم تجميعها في ثنائي ثابت واحد (ثنائي). هذا الثنائي ليس له تبعيات على الإطلاق ، ولا مكتبات! يمكن نسخه إلى أي نظام وتشغيله على الفور وسيعمل.

المضي قدما.

Go: الأساليب والواجهات

الذهاب لديه طرق. يمكنك التصريح عن طريقة لأي نوع مخصص. علاوة على ذلك ، هذا ليس بالضرورة بنية ، ولكن قد يكون اسمًا مستعارًا من نوع ما. يمكنك إعلان اسم مستعار لـ N32 وكتابة عمليات للقيام بشيء مفيد.

وهذا هو المكان الذي نقع فيه في ذهول لأول مرة ... واتضح أن Go ليس لديه فصول على هذا النحو. قد يقول أولئك الذين يعرفون Go أن هناك نوعًا من التضمين ، لكن هذا مختلف تمامًا. كلما توقف المطور عن التفكير في الأمر على أنه ميراث ، كان ذلك أفضل. لا توجد فصول في Go ، ولا يوجد ميراث أيضًا.

سؤال! ما الذي قدمته لنا شركة المؤلفين بقيادة Google من أجل إظهار مدى تعقيد العالم؟ لقد حصلنا على واجهات!

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

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

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

وهناك ، بالطبع ، مؤشرات لإبطالها في Go. واجهة الكلمات {} (ذات قوسين معقوفين) هي متغير يسمح لك بالإشارة إلى أي كائن على الإطلاق من حيث المبدأ.
حتى الآن ، كل شيء على ما يرام ، كل شيء مألوف. لا شيء يثير الدهشة.

اذهب: goroutines

نصل الآن إلى ما نهتم به: العمليات الخفيفة - goroutines (goroutines) في مصطلحات Go.

أليكسي نادينوف. ITooLabs. حالة التطوير على منصة الهاتف Go (Golang). الجزء 1

  1. أولاً ، إنها خفيفة الوزن حقًا (أقل من 2 كيلو بايت).
  2. ثانيًا ، تكلفة إنشاء مثل هذا الجروتين لا تكاد تذكر: يمكنك إنشاء ألف منها في الثانية - لن يحدث شيء.
  3. يتم تقديمها من خلال برنامج الجدولة الخاص بهم ، والذي ينقل التحكم ببساطة من goroutine إلى آخر.
  4. في هذه الحالة يتم نقل السيطرة في الحالات التالية:
    • إذا تمت مصادفة عبارة go (إذا كان goroutine يبدأ goroutine التالي) ؛
    • إذا تم تمكين مكالمة حظر الإدخال / الإخراج ؛
    • إذا تم تشغيل جمع القمامة ؛
    • إذا بدأت بعض العمليات مع القنوات.

أي أنه عندما يتم تشغيل برنامج Go على جهاز كمبيوتر ، فإنه يكتشف عدد النوى في النظام ، ويبدأ العديد من الخيوط حسب الحاجة (كم عدد النوى في النظام ، أو عدد النوى التي أخبرته بها). وفقًا لذلك ، سيقوم المجدول بتشغيل خيوط التنفيذ خفيفة الوزن هذه على جميع مؤشرات ترابط نظام التشغيل هذه في كل نواة.

وتجدر الإشارة إلى أن هذه هي الطريقة الأكثر فاعلية لاستخدام الحديد. بالإضافة إلى ما أظهرناه ، نقوم بالكثير. نحن نصنع ، على سبيل المثال ، أنظمة DPI التي تتيح خدمة 40 جيجابت في وحدة واحدة (اعتمادًا على ما يحدث في هذه السطور).

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

هذا المثال البسيط المكون من 21 سطرًا هو مثال يعمل ببساطة على خادم الصدى. في نفس الوقت ، لاحظ أن وظيفة التقديم بسيطة للغاية ، فهي خطية. لا توجد عمليات استرجاع ، لا داعي للقلق والتفكير ... أنت تقرأ وتكتب فقط!

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

على أن تستمر قريبا جدا ...

بعض الاعلانات 🙂

أشكركم على البقاء معنا. هل تحب مقالاتنا؟ تريد أن ترى المزيد من المحتوى المثير للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية للأصدقاء ، Cloud VPS للمطورين يبدأ من 4.99 دولارًا, تناظرية فريدة من خوادم المستوى المبتدئ ، اخترعناها من أجلك: الحقيقة الكاملة حول VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps من 19 دولارًا أو كيفية مشاركة الخادم؟ (متوفر مع RAID1 و RAID10 ، حتى 24 مركزًا وحتى 40 جيجا بايت DDR4).

Dell R730xd أرخص مرتين في مركز بيانات Equinix Tier IV في أمستردام؟ هنا فقط 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6 جيجا هرتز 14C 64 جيجا بايت DDR4 4x960 جيجا بايت SSD 1 جيجابت في الثانية 100 تلفزيون من 199 دولارًا في هولندا! Dell R420 - 2x E5-2430 2.2 جيجا هرتز 6C 128 جيجا بايت DDR3 2x960 جيجا بايت SSD 1 جيجا بايت في الثانية 100 تيرا بايت - من 99 دولارًا! أقرأ عن كيفية بناء شركة البنية التحتية. فئة مع استخدام خوادم Dell R730xd E5-2650 v4 بقيمة 9000 يورو مقابل فلس واحد؟

المصدر: www.habr.com

إضافة تعليق