阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

Alexey Naydenov,首席執行官 ITooLabs,講述了使用Go程式語言(Golang)為電信營運商開發電信平台。 Alexey 也分享了他為亞洲最大的電信營運商之一部署和經營該平台的經驗,該營運商使用該平台提供語音郵件服務(VoiceMail)和虛擬 PBX(Cloud PBX)。

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

Alexey Naydenov(以下簡稱「AN」): - 大家好!我的名字是 Alexey Naydenov。我是 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年以來,我們一直以各種方式密切參與營運商解決方案。我們製作了幾個客製化的虛擬 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部分

如果你仔細想想,我們其實沒有那麼多選擇。首先,「Erlang」——我們喜歡它並且了解它,它是我個人最喜歡的。其次,Java 甚至不是 Java,而是 Scala。第三,一種我們當時完全不認識的語言──圍棋。當時它剛出現,或者說已經存在了大約兩年,但尚未發布。

勝利了!

Go 的歷史

我們在上面搭建了一個平台。讓我試著解釋一下原因。

Go 簡史。它於 2007 年開始,2009 年開放,2012 年發布了第一個版本(也就是說,我們在第一個版本發布之前就開始工作了)。發起者是谷歌,我懷疑它想要取代 Java。

這些作者相當有名:

  • Unix 背後的 Ken Thomson 發明了 UTF-8,並參與了 Plan 9 系統的研究;
  • 與 Ken 共同創建 UTF-8 的 Rob Pike 也在貝爾實驗室參與了 Plan 9、Inferno、Limbo 的開發;
  • Robert Giesmer,我們熟知並喜愛他,因為他發明了 Java HotSpot 編譯器,並致力於 V8(Google的 Javascript 解釋器)中的生成器的開發;
  • 參與者超過 700 人,其中包括我們的一些補丁。

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

前往:第一眼

我們發現語言或多或少都是簡單易懂的。我們有明顯的類型:在某些情況下需要聲明它們,在某些情況下不需要(這意味著類型以某種方式推斷)。

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

顯然,描述結構是一種時尚。很明顯,我們有一個指針的概念(星號所在的位置)。可以看出,對於宣告數組和關聯數組的初始化有特殊的支援。

這或多或少是清楚的──你可以活下去。讓我們來試試 Hello, world:

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

我們看到了什麼?這是一種類似 C 的語法,分號是可選的。它可以作為兩行的分隔符,但前提是這兩個結構位於同一行。

我們看到控制結構中的括號(第 14 行)是可選的,但花括號始終是必要的。我們看到類型是靜態的。大多數情況下,蒂姆都是孤僻的。這個例子比通常的 Hello,world 稍微複雜一點——只是為了表明有一個庫。

我們還看到了什麼重要的事情?代碼被組織成包。為了在您自己的程式碼中使用該套件,您需要使用 import 指令導入它——這也很重要。我們啟動了它——它成功了。偉大的!

讓我們嘗試一些更複雜的東西:你好,世界,但現在它是一個 http 伺服器。我們在這裡看到了什麼有趣的事?

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

首先,函數充當參數。這意味著我們的函數是“一等公民”,我們可以用函數式風格做很多有趣的事情。接下來我們看到一些意想不到的事情:import 指令直接引用 GitHub 儲存庫。對,就是這樣,而且也應該這樣。

在 Go 中,套件的通用標識符是其儲存庫的 url。有一個特殊的實用程式 Goget,它將查找所有依賴項,下載它們,安裝,編譯並準備使用(如果需要)。同時,Goget 了解 html-meta。因此,您可以保留一個包含指向特定儲存庫的連結的 http 目錄(例如,我們這樣做)。

我們還看到了什麼?標準庫中的Http和Json。顯然,存在內省 - 反射,它應該在編碼/json 中使用,因為我們只是用它替換一些任意物件。

我們啟動它並看到我們有 20 行有用的程式碼,可以編譯、運行並返回機器的當前平均負載(在運行它的機器上)。
我們在這裡還能立即看到哪些重要的事情?它編譯成單一靜態二進位(buinary)。這個二進位檔案根本沒有任何依賴項,沒有函式庫!您可以將其複製到任何系統,立即運行它,它就會起作用。

繼續。

Go:方法和介面

Go 有方法。您可以為任何自訂類型聲明一個方法。而且,這不一定是一個結構,而可以是某種類型的別名。您可以為 N32 聲明一個別名並為其編寫方法來做一些有用的事情。

現在我們第一次感到震驚...原來 Go 並沒有這樣的類。了解 Go 的人可能會說存在類型包含,但那是完全不同的東西。開發人員越早不再將其視為繼承,就越好。 Go中沒有類,也沒有繼承。

問題!谷歌領導的作者團隊給了我們什麼來展現世界的複雜性?他們給了我們介面!

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

介面是一種特殊類型,可讓您編寫簡單的方法、方法簽名。此外,任何存在(執行)這些方法的類型都將符合該介面。這意味著您可以簡單地描述一種類型和另一種類型(對應於該介面類型)的相應功能。接下來,聲明此介面類型的變數並將這些物件中的任何一個分配給它。

對於鐵桿粉絲來說,我可以說這個變數實際上包含兩個指標:一個指向數據,另一個指向特定於此特定類型的特殊描述符表,指向此類型的介面。也就是說,編譯器在連結時會建立這樣的描述符表。

當然,Go 有空指針。 interface{}(有兩個花括號)這個字是一個變量,原則上可以讓你指向任何物件。
到目前為止一切都很好,一切都很熟悉。沒什麼奇怪的。

Go:goroutines

現在我們來談談我們感興趣的內容:輕量級進程——Go 術語中的 goroutines。

阿列克謝·奈德諾夫。 ITooLabs。 Go(Golang)手機平台的開發案例。 第1部分

  1. 首先,它們真的很輕(小於 2 KB)。
  2. 其次,創建這樣的 goroutine 的成本可以忽略不計:您每秒可以創建一千個 goroutine - 什麼也不會發生。
  3. 它們由自己的調度程序提供服務,調度程序只是將控制權從一個 goroutine 轉移到另一個 goroutine。
  4. 在這種情況下,控制權將在以下情況下轉移:
    • 如果遇到 go 語句(如果該 goroutine 啟動了下一個 goroutine);
    • 如果啟用了輸入/輸出阻塞呼叫;
    • 如果垃圾收集正在運行;
    • 如果啟動了一些與通道相關的操作。

也就是說,每當 Go 程式在電腦上運行時,它都會偵測系統中的核心數量,並根據需要啟動盡可能多的執行緒(無論系統中有多少核心,或無論您告訴它多少核心)。因此,調度程序將在每個核心的所有作業系統執行緒上執行這些輕量級執行緒。

值得注意的是,這是回收鐵最有效的方法。除了所展示的內容之外,我們還做了很多事情。例如,我們製造的 DPI 系統允許一個單元服務 40 千兆位元(取決於這些線路中發生的情況)。

甚至在 Go 出現之前,我們就使用了完全相同的方案,原因就在於此:因為它允許我們維護處理器快取的局部性,從而顯著減少作業系統上下文切換的次數(這也需要花費大量時間)。讓我再說一次:這是利用鐵最有效的方法。

這個簡單的 21 行範例只是 echo-server 所做的範例。請注意,服務功能極為簡單且線性。沒有回調,不需要費心和思考......您只需閱讀和寫作!

但是,如果您進行讀寫,它實際上應該阻塞 - 當再次可以執行時,goroutine 只是排隊並由調度程序拾取。也就是說,這個簡單的程式碼可以充當回顯伺服器,處理該機器上的作業系統允許的盡可能多的連線。

很快就會繼續......

播放視頻

一些廣告🙂

感謝您與我們在一起。 你喜歡我們的文章嗎? 想看更多有趣的內容? 通過下訂單或推薦給朋友來支持我們, 面向開發人員的雲 VPS,4.99 美元起, 我們為您發明的入門級服務器的獨特模擬: VPS (KVM) E5-2697 v3(6 核)10​​4GB DDR480 1GB SSD 19Gbps XNUMX 美元或如何共享服務器的全部真相? (適用於 RAID1 和 RAID10,最多 24 個內核和最多 40GB DDR4)。

Dell R730xd 在阿姆斯特丹的 Equinix Tier IV 數據中心便宜 2 倍? 只有這裡 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 電視低至 199 美元 在荷蘭! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 美元起! 閱讀 如何建設基礎設施公司同級使用價值730歐元的Dell R5xd E2650-4 v9000服務器一分錢?

來源: www.habr.com

添加評論