الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

الکسی نایدنوف، مدیرعامل ITooLabs، در مورد توسعه یک پلتفرم مخابراتی برای اپراتورهای مخابراتی به زبان برنامه نویسی Go (Golang) صحبت می کند. الکسی همچنین تجربه خود را از استقرار و راه اندازی این پلت فرم در یکی از بزرگترین اپراتورهای مخابراتی آسیایی که از این پلت فرم برای ارائه خدمات پست صوتی (VoiceMail) و 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 مشترک در کل. همه چیز b000b است - ما فقط با شرکت ها کار می کنیم.
  • 300 تماس در دقیقه در طول روز.
  • 100 میلیون دقیقه تماس در سال گذشته (ما جشن گرفتیم). این بدون در نظر گرفتن مذاکرات داخلی است که روی پلت فرم ما است.

چگونه شروع شد؟

چگونه افراد مناسب شروع به ساختن پلت فرم خود می کنند؟ این را هم باید در نظر بگیریم که ما سابقه توسعه «تولیدات سخت‌کوه» و حتی در دقیق‌ترین زمان سال برای یک شرکت داشته‌ایم! آن زمان خوشحالی بود که به مشتری آمدید و گفتید: "به چند سرور دیگر نیاز داریم." و مشتری: «بله، سوالی نیست! ما یک ده در قفسه داریم.

بنابراین ما Oracle، Java، WebSphere، Db2 و همه اینها را انجام دادیم. بنابراین، ما، البته، بهترین راه حل های فروشنده را انتخاب کردیم، آنها را ادغام کردیم و سعی کردیم با آن کار کنیم. آنها به تنهایی بازی می کردند. این یک راه اندازی داخلی خواهد بود.

همه چیز از سال 2009 شروع شد. از سال 2006، ما از نزدیک در تصمیم گیری های اپراتور، به هر طریقی، درگیر بوده ایم. ما چندین سانترال مجازی سفارشی ساختیم (مانند آنچه که اکنون سفارشی داریم): نگاه کردیم، به این نتیجه رسیدیم که خوب است، و تصمیم گرفتیم یک استارت آپ داخلی راه اندازی کنیم.

الکسی نایدنوف. 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

اگر به خاطر داشته باشید واقعاً گزینه های زیادی نداشتیم. اولا، ارلنگ - ما آن را دوست داریم و می دانیم، مورد علاقه شخصی و شخصی من بود. ثانیا، جاوا حتی جاوا نیست، بلکه به طور خاص اسکالا است. ثالثاً زبانی که در آن زمان ما اصلاً نمی دانستیم - برو. در آن زمان تازه ظاهر شده بود، به طور دقیق تر، حدود دو سال بود که وجود داشت، اما هنوز منتشر نشده بود.

شکست خورده برو!

تاریخچه Go

روی آن یک سکو درست کردیم. سعی می کنم دلیلش را توضیح دهم.

تاریخچه مختصری از Go. در سال 2007 شروع شد، در سال 2009 افتتاح شد، اولین نسخه در سال 2012 منتشر شد (یعنی حتی قبل از اولین نسخه شروع به کار کردیم). آغازگر گوگل بود که می خواست جاوا را جایگزین کند.

نویسندگان بسیار معروف هستند:

  • کن تامسون، که پشت یونیکس بود، UTF-8 را اختراع کرد، روی سیستم Plan 9 کار کرد.
  • راب پایک که UTF-8 را با کن طراحی کرد، همچنین روی Plan 9, Inferno, Limbo در آزمایشگاه Bell کار کرد.
  • رابرت گیزمر، که ما او را به خاطر اختراع کامپایلر جاوا HotSpot و کار بر روی ژنراتور در V8 (مفسر جاوا اسکریپت گوگل) می شناسیم و دوستش داریم.
  • و بیش از 700 مشارکت کننده، از جمله برخی از وصله های ما.

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

با یک نگاه برو

می بینیم که زبان کم و بیش ساده و قابل فهم است. ما انواع واضح داریم: در برخی موارد نیاز به اعلام دارند، در برخی دیگر نیازی به اعلان ندارند (به این معنی که انواع به هر حال استنباط می شوند).

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

می توان دید که توصیف سازه ها مد است. مشاهده می شود که ما مفهوم اشاره گر (جایی که ستاره است) داریم. مشاهده می شود که پشتیبانی ویژه ای برای اعلام مقداردهی اولیه آرایه ها و آرایه های انجمنی وجود دارد.

تقریباً قابل درک است - شما می توانید زندگی کنید. تلاش برای نوشتن سلام، دنیا:

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

ما چه می بینیم؟ این نحو C مانند است، نقطه ویرگول اختیاری است. می تواند جداکننده دو خط باشد، اما فقط در صورتی که این دو ساختار دقیقاً روی یک خط باشند.

می بینیم که براکت ها در ساختارهای کنترلی (در خط چهاردهم) اختیاری هستند، اما همیشه به شکل فرفری نیاز دارند. می بینیم که تایپ ثابت است. زمان در اکثر موارد نمایش داده می شود. این مثال کمی پیچیده‌تر از Hello, world معمولی است - فقط برای نشان دادن وجود یک کتابخانه.

چه چیز دیگری مهم می بینیم؟ کد در بسته ها سازماندهی شده است. و برای استفاده از بسته در کد خود، باید آن را با استفاده از دستورالعمل واردات وارد کنید - این نیز مهم است. ما شروع می کنیم - کار می کند. عالی!

بیایید چیز پیچیده تری را امتحان کنیم: سلام، دنیا، اما اکنون یک سرور http است. چه چیز جالبی در اینجا می بینیم؟

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

ابتدا تابع به عنوان یک پارامتر عمل می کند. این به این معنی است که عملکردی که ما داریم «شهروند درجه یک» است و می توانید کارهای جالب زیادی با آن به سبک کاربردی انجام دهید. غیر منتظره بعدی را می بینیم: دستورالعمل واردات مستقیماً به مخزن GitHub اشاره دارد. درست است، همینطور است - علاوه بر این، باید اینطور انجام شود.

در Go، شناسه جهانی بسته، نشانی اینترنتی مخزن آن است. یک ابزار ویژه Goget وجود دارد که برای همه وابستگی ها می رود، آنها را دانلود می کند، نصب می کند، آنها را کامپایل می کند و در صورت لزوم برای استفاده آماده می کند. در همان زمان، Goget در مورد html-meta می داند. بر این اساس، می توانید یک دایرکتوری http نگه دارید که حاوی پیوندهایی به مخزن خاص شما خواهد بود (به عنوان مثال، ما).

چه چیز دیگری می بینیم؟ Http و Json در کتابخانه معمولی. بدیهی است که درون نگری - انعکاس وجود دارد که باید در رمزگذاری / json استفاده شود، زیرا ما به سادگی یک شی دلخواه را جایگزین آن می کنیم.

ما آن را اجرا می کنیم و می بینیم که 20 خط کد مفید داریم که کامپایل، اجرا می شود و میانگین بار فعلی ماشین (روی ماشینی که روی آن در حال اجرا است) را می دهد.
چه چیز دیگری از آنچه می توانیم بلافاصله در اینجا ببینیم مهم است؟ به یک باینری استاتیک (buinary) کامپایل می شود. این باینری اصلاً وابستگی ندارد، هیچ کتابخانه ای ندارد! می توان آن را در هر سیستمی کپی کرد، بلافاصله اجرا کرد و کار خواهد کرد.

ادامه دادن

برو: روش ها و رابط ها

برو روش هایی دارد. شما می توانید یک متد را برای هر نوع سفارشی اعلام کنید. علاوه بر این، این لزوماً یک ساختار نیست، بلکه ممکن است نوعی نام مستعار باشد. می توانید یک نام مستعار برای N32 اعلام کنید و روش هایی برای آن بنویسید تا کار مفیدی انجام دهد.

و اینجاست که ما برای اولین بار دچار گیجی می شویم ... معلوم می شود که Go کلاس هایی ندارد. کسانی که Go را می شناسند ممکن است بگویند که شامل نوع وجود دارد، اما این کاملاً متفاوت است. هرچه زودتر توسعه‌دهنده به عنوان ارثی فکر نکند، بهتر است. هیچ کلاسی در Go وجود ندارد و ارثی نیز وجود ندارد.

سوال! شرکت نویسندگان به رهبری گوگل برای نمایش پیچیدگی جهان چه چیزی به ما داده است؟ به ما رابط هایی داده شده است!

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

یک رابط نوع خاصی است که به شما امکان می دهد روش های ساده، امضاهای متد را بنویسید. علاوه بر این، هر نوع که این روش ها برای آن وجود دارد (اجرا می شوند) با این رابط مطابقت دارد. این بدان معناست که شما به سادگی می توانید تابع مربوطه را برای یک نوع، برای نوع دیگر (که مربوط به آن نوع رابط است) بنویسید. در مرحله بعد، یک متغیر از نوع این رابط را اعلام کنید و هر یک از این اشیاء را به آن اختصاص دهید.

برای طرفداران هاردکور، می توانم بگویم که این متغیر در واقع شامل دو نشانگر خواهد بود: یکی به داده ها، دیگری به یک جدول توصیفگر ویژه که مخصوص این نوع خاص است، به رابط این نوع. یعنی کامپایلر چنین جداول توصیفگرها را در زمان پیوند می سازد.

و البته، اشاره گرهایی برای خالی کردن در Go وجود دارد. کلمه رابط {} (با دو پرانتز فرفری) متغیری است که به شما امکان می‌دهد در اصل به هر شیئی اشاره کنید.
تا اینجا همه چیز مرتب است، همه چیز آشناست. هیچ چیز تعجب آور نیست.

برو: گوروتین ها

اکنون به چیزی که به آن علاقه داریم می رسیم: فرآیندهای سبک وزن - گوروتین ها (گوروتین ها) در اصطلاحات Go.

الکسی نایدنوف. ITooLabs. کیس توسعه روی پلت فرم تلفن Go (Golang). قسمت 1

  1. اول، آنها واقعا سبک وزن هستند (کمتر از 2 کیلوبایت).
  2. ثانیا، هزینه ایجاد چنین گوروتین ناچیز است: می توانید هزار نفر از آنها را در ثانیه ایجاد کنید - هیچ اتفاقی نمی افتد.
  3. آنها توسط برنامه‌ریزی خودشان ارائه می‌شوند، که به سادگی کنترل را از یک گوروتین به دیگری منتقل می‌کند.
  4. در این حالت، کنترل در موارد زیر منتقل می شود:
    • اگر دستور go مواجه شد (اگر گوروتین گوروتین بعدی را شروع کند).
    • اگر یک تماس ورودی/خروجی مسدودکننده فعال باشد.
    • اگر جمع آوری زباله آغاز شود؛
    • اگر برخی عملیات با کانال ها شروع شود.

یعنی هر زمان که یک برنامه Go بر روی کامپیوتر اجرا می شود، تعداد هسته های سیستم را تشخیص می دهد، به تعداد مورد نیاز رشته ها را راه اندازی می کند (چند هسته در سیستم وجود دارد، یا چند هسته به آن گفته اید). بر این اساس، زمان‌بندی‌کننده این رشته‌های اجرایی سبک وزن را بر روی همه این رشته‌های سیستم عامل در هر هسته اجرا می‌کند.

لازم به ذکر است که این کارآمدترین راه برای استفاده از آهن است. علاوه بر آنچه نشان داده ایم، کارهای بیشتری انجام می دهیم. به عنوان مثال، ما سیستم‌های DPI را می‌سازیم که امکان ارائه 40 گیگابیت در یک واحد را فراهم می‌کند (بسته به آنچه در این خطوط اتفاق می‌افتد).

در آنجا، حتی قبل از Go، دقیقاً به همین دلیل از همان طرح استفاده کردیم: از آنجا که به شما امکان می دهد مکان حافظه پنهان پردازنده را ذخیره کنید، تعداد سوئیچ های زمینه سیستم عامل را به میزان قابل توجهی کاهش دهید (که همچنین زمان بسیار زیادی طول می کشد). تکرار می کنم: این موثرترین راه برای استفاده از آهن است.

این مثال ساده 21 خطی نمونه ای است که به سادگی اکو سرور را انجام می دهد. در عین حال، توجه داشته باشید که تابع سرویس بسیار ساده است، خطی است. هیچ تماسی وجود ندارد، نیازی به زحمت و فکر نیست... شما فقط بخوان و بنویس!

در همان زمان، اگر می‌خوانید و می‌نویسید، در واقع باید مسدود شود - این گوروتین به سادگی در صف قرار می‌گیرد و زمانی که اجرا دوباره ممکن می‌شود توسط زمان‌بند گرفته می‌شود. یعنی این کد ساده می تواند به عنوان یک سرور اکو برای هر تعداد اتصال که سیستم عامل این دستگاه اجازه می دهد عمل کند.

به زودی ادامه دارد...

چند تبلیغ 🙂

از اینکه با ما ماندید متشکرم آیا مقالات ما را دوست دارید؟ آیا می خواهید مطالب جالب تری ببینید؟ با ثبت سفارش یا معرفی به دوستان از ما حمایت کنید ابر VPS برای توسعه دهندگان از 4.99 دلار, یک آنالوگ منحصر به فرد از سرورهای سطح ورودی که توسط ما برای شما اختراع شده است: تمام حقیقت در مورد VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps از 19 دلار یا چگونه سرور را به اشتراک بگذاریم؟ (در دسترس با RAID1 و RAID10، حداکثر 24 هسته و حداکثر 40 گیگابایت DDR4).

Dell R730xd 2 برابر ارزان تر در مرکز داده Equinix Tier IV در آمستردام؟ فقط اینجا 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV از 199 دلار در هلند! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - از 99 دلار! در مورد بخوانید نحوه ساخت شرکت زیرساخت کلاس با استفاده از سرورهای Dell R730xd E5-2650 v4 به ارزش 9000 یورو برای یک پنی؟

منبع: www.habr.com

اضافه کردن نظر