אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

אלכסיי ניידנוב, מנכ"ל ITooLabs, מדבר על פיתוח פלטפורמת טלקומוניקציה למפעילי טלקום בשפת התכנות Go (Golang). אלכסיי חולק גם את הניסיון שלו בפריסה ותפעול של הפלטפורמה באחת ממפעילי הטלקום האסייתיים הגדולים, שהשתמשו בפלטפורמה כדי לספק שירותי דואר קולי (VoiceMail) ו-Virtual PBX (Cloud PBX).

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

אלכסיי ניידנוב (להלן - AN): - שלום לכולם! שמי אלכסיי ניידנוב. אני המנהל של ITooLabs. קודם כל, אני רוצה לענות מה אני עושה כאן ואיך הגעתי לכאן.

אם אתה מסתכל על Bitrix24 Marketplace (סעיף "טלפוניה"), אז 14 יישומים ו-36 שנמצאים שם (40%) הם אנחנו:

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

ליתר דיוק, אלו המפעילים השותפים שלנו, אבל מאחורי כל זה עומדת הפלטפורמה שלנו (Platform as a Service) - מה שאנחנו מוכרים להם בגרושה קטנה. למעשה, אני רוצה לדבר על הפיתוח של הפלטפורמה הזו ואיך הגענו ל-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 עבר למונגו. כתוצאה מכך, קיבלנו פתרון עובד שמעבד את כל השיחות שמגיעות לשם:

אלכסיי ניידנוב. 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 (כלומר, התחלנו לעבוד עוד לפני השחרור הראשון). היוזם היה גוגל, שרצתה להחליף, כפי שאני חושד, את ג'אווה.

המחברים מפורסמים מאוד:

  • קן תומסון, שעמד מאחורי Unix, המציא את UTF-8, עבד על מערכת Plan 9;
  • רוב פייק, שעיצב את UTF-8 עם קן, עבד גם על תוכנית 9, Inferno, Limbo ב-Bell Labs;
  • רוברט גיזמר, שאנו מכירים ואוהבים על המצאת ה-Java HotSpot Compiler ועל העבודה על המחולל ב-V8 (מתורגמן Javascript של גוגל);
  • ויותר מ-700 תורמים, כולל כמה מהטלאים שלנו.

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

לך במבט חטוף

אנו רואים שהשפה פחות או יותר פשוטה ומובנת. יש לנו טיפוסים ברורים: בחלק מהמקרים צריך להצהיר עליהם, באחרים לא (כלומר, בכל מקרה מסיקים את הסוגים).

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

ניתן לראות שאופנתי לתאר מבנים. ניתן לראות שיש לנו מושג של מצביע (היכן שהכוכבית נמצאת). ניתן לראות שקיימת תמיכה מיוחדת להכרזה על אתחול של מערכים ומערכים אסוציאטיביים.

מובן בערך - אפשר לחיות. מנסה לכתוב שלום עולם:

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

מה אנחנו רואים? זהו תחביר דמוי C, נקודה-פסיק הוא אופציונלי. זה יכול להיות מפריד לשני קווים, אבל רק אם אלה שני מבנים שנמצאים בדיוק על אותו קו.

אנו רואים שהסוגריים במבני הבקרה (בקו ה-14) הם אופציונליים, אך תמיד נדרשים מתולתלים. אנו רואים שההקלדה היא סטטית. טים ברוב המקרים מוצג. הדוגמה הזו קצת יותר מסובכת מהעולם הרגיל שלום, רק כדי להראות שיש ספרייה.

מה עוד אנחנו רואים חשוב? הקוד מאורגן בחבילות. וכדי להשתמש בחבילה בקוד משלך, עליך לייבא אותה באמצעות הוראת הייבוא ​​- גם זה חשוב. אנחנו מתחילים - זה עובד. גדול!

בואו ננסה משהו יותר מסובך: שלום עולם, אבל עכשיו זה שרת http. מה אנחנו רואים כאן מעניין?

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

ראשית, הפונקציה פועלת כפרמטר. זה אומר שהפונקציה שיש לנו היא "אזרח מהשורה הראשונה" ואפשר לעשות איתו הרבה דברים מעניינים בסגנון פונקציונלי. אנו רואים את הבלתי צפוי הבא: הוראת הייבוא ​​מתייחסת ישירות למאגר GitHub. נכון, ככה זה - יתרה מכך, כך צריך לעשות.

ב-Go, המזהה האוניברסלי של החבילה הוא כתובת האתר של המאגר שלה. יש כלי מיוחד של Goget שמתאים לכל התלות, מוריד אותם, מתקין אותם, מקמפל אותם ומכין אותם לשימוש במידת הצורך. יחד עם זאת, Goget יודע על html-meta. בהתאם לכך, אתה יכול לשמור ספריית http, שתכיל קישורים למאגר הספציפי שלך (כמו שאנחנו, למשל, עושים).

מה עוד אנחנו רואים? Http ו-Json בספרייה הרגילה. יש, כמובן, התבוננות פנימית - השתקפות, שבה יש להשתמש בקידוד / json, כי אנחנו פשוט מחליפים אובייקט שרירותי כלשהו עבורו.

אנחנו מריצים את זה ורואים שיש לנו 20 שורות של קוד שימושי שמרכיב, רץ ונותן את העומס הממוצע הנוכחי של המכונה (במכונה עליה היא פועלת).
מה עוד חשוב ממה שאנחנו יכולים לראות כאן מיד? הוא מתחבר לבינארי סטטי אחד (בונארי). לבינארי זה אין תלות כלל, אין ספריות! ניתן להעתיק אותו לכל מערכת, להפעיל מיד, וזה יעבוד.

אנחנו ממשיכים הלאה.

Go: שיטות וממשקים

לגו יש שיטות. אתה יכול להצהיר על שיטה לכל סוג מותאם אישית. יתרה מכך, זה לא בהכרח מבנה, אלא עשוי להיות כינוי מסוג כלשהו. אתה יכול להכריז על כינוי ל-N32 ולכתוב שיטות כדי שזה יעשה משהו מועיל.

וכאן אנחנו נופלים בטירוף בפעם הראשונה... מסתבר שלגו אין שיעורים ככאלה. מי שמכיר את גו אולי יגיד שיש סוג הכללת, אבל זה שונה לגמרי. ככל שהמפתח יפסיק לחשוב על זה כעל ירושה מוקדם יותר, כך ייטב. אין שיעורים בגו, וגם אין ירושה.

שְׁאֵלָה! מה נתנה לנו חברת המחברים בראשות גוגל כדי להציג את המורכבות של העולם? קיבלנו ממשקים!

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

ממשק הוא סוג מיוחד המאפשר לכתוב שיטות פשוטות, חתימות שיטה. יתר על כן, כל סוג שעבורו קיימות (מתבצעות) שיטות אלו יתאים לממשק זה. זה אומר שאתה יכול פשוט לכתוב את הפונקציה המתאימה עבור סוג אחד, עבור אחר (שמתאימה לסוג הממשק הזה). לאחר מכן, הכריז על משתנה מסוג ממשק זה והקצה לו כל אחד מהאובייקטים הללו.

לחובבי הארדקור, אני יכול לומר שהמשתנה הזה יכיל למעשה שני מצביעים: האחד לנתונים, השני לטבלת תיאורים מיוחדת שספציפית לסוג המסוים הזה, לממשק מהסוג הזה. כלומר, המהדר יוצר טבלאות כאלה של מתארים בזמן הקישור.

ויש, כמובן, מצביעים לבטל ב-Go. המילה ממשק {} (עם שני סוגרים מסולסלים) היא משתנה שמאפשר להצביע על כל אובייקט בכלל באופן עקרוני.
עד כאן הכל מסודר, הכל מוכר. שום דבר לא מפתיע.

Go: goroutines

כעת הגענו למה שמעניין אותנו: תהליכים קלים - גורוטינים (גורוטינים) במינוח Go.

אלכסיי ניידנוב. ITooLabs. מארז פיתוח בפלטפורמת הטלפון Go (Golang). חלק 1

  1. ראשית, הם ממש קלים (פחות מ-2 Kb).
  2. שנית, העלות של יצירת גורוטינה כזו היא זניחה: אתה יכול ליצור אלף מהם בשנייה - שום דבר לא יקרה.
  3. משרתים אותם על ידי מתזמן משלהם, שפשוט מעביר שליטה מגורוטינה אחת לאחרת.
  4. במקרה זה, השליטה מועברת במקרים הבאים:
    • אם נתקלים בהצהרת go (אם הגורוטין מתחיל את הגורוטין הבא);
    • אם מופעלת שיחת קלט/יציאה חוסמת;
    • אם איסוף אשפה מופעל;
    • אם מתחילה פעולה כלשהי עם ערוצים.

כלומר, בכל פעם שתוכנית Go מופעלת במחשב, היא מזהה את מספר הליבות במערכת, מתחילה כמה שרשורים שצריך (כמה ליבות יש במערכת, או כמה אמרת לה). בהתאם לכך, המתזמן יריץ את פתילי הביצוע הקלים הללו על כל פתילי מערכת ההפעלה הללו בכל ליבה.

יש לציין שזו הדרך היעילה ביותר לניצול ברזל. בנוסף למה שהראינו, אנחנו עושים הרבה יותר. אנו מייצרים, למשל, מערכות DPI המאפשרות הגשה של 40 גיגה ביחידה אחת (תלוי במה שקורה בקווים אלו).

שם, עוד לפני Go, השתמשנו בדיוק באותה סכמה מהסיבה הזו בדיוק: מכיוון שהיא מאפשרת לשמור את המיקום של מטמון המעבד, צמצם משמעותית את מספר מתגי ההקשר של מערכת ההפעלה (שגם זה לוקח הרבה מאוד זמן). אני חוזר: זו הדרך היעילה ביותר לנצל ברזל.

הדוגמה הפשוטה הזו של 21 שורות היא דוגמה שפשוט עושה echo-server. יחד עם זאת, שימו לב שפונקציית ההגשה פשוטה ביותר, היא ליניארית. אין התקשרויות, אין צורך לטרוח ולחשוב... פשוט קוראים וכותבים!

יחד עם זאת, אם אתה קורא וכותב, זה אמור למעשה לחסום - הגורוטין הזה פשוט מונח בתור ונלקח על ידי המתזמן כאשר הביצוע מתאפשר שוב. כלומר, הקוד הפשוט הזה יכול לשמש כשרת הד עבור חיבורים רבים ככל שתאפשר מערכת ההפעלה במכונה זו.

המשך בקרוב מאוד...

הפעל וידאו

כמה מודעות 🙂

תודה שנשארת איתנו. האם אתה אוהב את המאמרים שלנו? רוצים לראות עוד תוכן מעניין? תמכו בנו על ידי ביצוע הזמנה או המלצה לחברים, Cloud VPS למפתחים החל מ-$4.99, אנלוגי ייחודי של שרתים ברמת הכניסה, שהומצא על ידינו עבורכם: כל האמת על VPS (KVM) E5-2697 v3 (6 ליבות) 10GB DDR4 480GB SSD 1Gbps החל מ-$19 או איך לשתף שרת? (זמין עם RAID1 ו-RAID10, עד 24 ליבות ועד 40GB 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

הוספת תגובה