阿列克谢·纳德诺夫(Alexey Naydenov)。伊图实验室 Go(Golang)电话平台上的案例研究。第2部分

ITooLabs首席执行官Alexey Naydenov 谈到了采用Go编程语言(Golang)为电信运营商开发电信平台的问题。Alexey还分享了他在亚洲最大的电信运营商之一中部署和运营该平台的经验,后者使用该平台来提供语音邮件服务(VoiceMail)和虚拟PBX(Cloud PBX)。



阿列克谢·纳德诺夫(Alexey Naydenov)。伊图实验室 Go(Golang)电话平台上的案例研究。第1部分

前往:频道


显然,当您执行并行执行时,需要同步工具。 Go提供了所需的所有同步工具:互斥体,共享内存...但是通道是它的常规机制。

通道可以视为n个元素的单向类型队列(默认值为1)。通道本身可以是参数,也可以是结构的成员。此外,可以在一个信道上传输一个信道-同时此信道将具有“此类型或该类型的信道”的类型。



此示例在20行中做什么?这是一个http呼叫计数器。他只计算自己启动http服务器的位置,并显示该服务器已被访问了多少次。通常如何做?通常,您要创建一个变量,并用互斥体包装它,然后对其进行递增。或者您创建一个原子变量,以原子方式递增。

去是不同的。尝试过Go的开发人员很快就开始以这种方式编写。在Go中,您运行goroutine函数,该函数称为count(第8行)和go count(第17行)。做一个变量; 然后仅增加局部变量-下一个数字将发送到通道。那些记得Atmos脚本生成器的人当然是对的,但是在Go频道中可以使用更广泛。

转到:选择


最后,还有Select语句,它使您可以一次从多个通道中进行选择。这是Go中典型的模板,如何完成goroutine:



您传输两个​​通道。请求到达一个通道,而信号到达另一个通道,这是应该舍入的时间了。

转到:C API(CGO)


对于我们来说,对于电话平台的开发人员来说,Go具有C API很重要,它使我们可以直接在Go代码中用C语言编写一些代码,然后将这些代码正常编译,正常链接然后正常工作。



也就是说,您可以访问操作系统上的所有C库。但是,它们也将静态链接。

前往:工具


Go的工具箱是他们喜欢它的另一个原因。一切都通过一个命令完成-(执行)。有一个可以构建的go build命令,一个go测试可以运行特定软件包中描述的特殊测试功能。有一个go run命令可以立即启动并生成。有一个命令可以更新依赖关系(获取)。

有一些格式化源的格式:go fmt-例如,在push'ah上就有。关于我们在何处,以何种方式以及使用哪种格式设置样式-制表符或空格,不再有争论:使用go fmt命令,可以使用某种格式设置其格式,并且没有争议。不喜欢什么?运行go fmt-它将是应该的。



go doc命令可让您阅读文档并以html显示。有一个用于剖析的go工具pprof,一个解析生成器(go yacc工具)等等。简而言之,Go工具包是针对这种年轻语言而高度开发的。其中的许多想法并不是那么创新,而是非常有趣,后来又移植到其他系统中,例如,相同的Goget以及将立即存储库指定为软件包名称的功能。

前往:IDE


通常,我更喜欢Emacs。如果有恋人,那么我们可以抗争。但是对于开发而言,我更喜欢“成人” IDE:



我尝试了所有这些,包括VIM。我可以说,目前最酷的IDE是最常用的IDE,某种类型的IDEA版本带有Go插件。最好的!推荐。如果有人使用它,则必须立即开始使用,并且不要遭受痛苦。

前往:图书馆


图书馆-这是另一个非常非常令人惊喜的惊喜,因为从字面上看,我们马上就发现了东西。即使当我们需要Javascript解释器时,我们也认为我们必须自己编写-我们只是找到了,事实已经如此。



迄今为止,已经在Git中注册了35,000多个不同的存储库,其中至少有一颗星。我可以再说一遍:有我们的图书馆,也有国外的图书馆,而且有很多公司都在开放某种内部图书馆。总的来说,我想不起来需要什么东西,也不会立即在GitHub上找到它(对于Go)。

转到:操作


剥削是一个梦想,特别是对于那些使用Java的人来说。

  • 静态装配。没有运行时依赖项!
  • . , : , C++ , , . Garbage Collector’! , , .
  • – . .
  • , . .

Go:


社区-它也行贿。Go社区很棒,而且它正在冉冉升起的新星。不幸的是,幻灯片显示得很少且不可见:左侧是GitHub上的存储库,右侧是Stack Overflow标签:



如果您查看Go,那么它是语言公司的五倍!

Go vs Node.js


战斗!例如,与Node.js进行比较。您实际上可以与任何东西进行比较。但是为什么要使用Node?

假设Google计划Go取代Java,与Java竞争。并不是的。事实证明,Go是解释语言的Node.js和Python的主要竞争对手。为什么?因为在Go上,由于类型推断,由于许多小细节(例如go run命令),您会感觉到一种解释语言,即一种可以用来进行布局,快速构建和原型化的简单语言。但与此同时,它确实有效:它确实可以编译,启动并快速运行。

这里我们有两个简单的服务器-那里和那里http:



区别。

  • 在Go中编译,在Node.js中解释。已启动-它立即可用(很好,在那里)。
  • Go有很多线程(与计算机中的处理器一样多)。如您所知,在Node.js中只有一个线程(如果您需要很多线程,请启动集群)。
  • 现在,我们开始使逻辑复杂化-在Handler中将其复杂化。在Go中,您不会使任何事情复杂化,而只是在编写被阻止的线性程序时进行操作(将请求发送到数据库-计算-将响应发送到客户端)。
  • 问题立即出现在Node.js中……您现在将使用什么-回调,promise,Q,async.js或新产生的收益?

当您拥有Erlang或Go之类的模型时,生活变得容易得多。

去:缺陷?


是的,dofiga!


  • 没有参数化的多态性,模式,泛型。只有特殊的操作可以处理数组,数组和关联数组。其余的都不是。
  • . , .
  • cut’n’paste. Go , , – . , .
  • , . , , Haskell, , , . Go – ! , , - .
  • – , . – .
  • . panic/recover, .
  • , ( ).
  • 没有想象的地方-太容易了!

为什么还走?


可能是因为快速组装,还是因为部署了一个二进制文件?是由于竞争力还是有效的铁利用?也许是由于他的成长迅速,还是由于社区很酷?

很长一段时间我都试图自己回答这个问题。最后,我意识到:不,这些原因都不是!一切都变得更加简单:Go可以工作。



对于工程师来说,Go是一种极为实用的语言。对于从事Web服务和分布式系统开发的工程师-在其上编写接口,还有很多事情...

是否可以在其上编写“ Bitrix”?我不知道。很有可能没有,因为接口太多。但是,我敢肯定我需要在Bitrix上运行一个更快的平台(例如,用于发送消息的总线)上。

谁在使用Go?


谁已经设法跳入这辆车?



  • Google是可以理解的:他有许多使用Go的项目,并且很久以前就已切换到它。
  • 码头工人
  • 流入数据 如果没有尝试过,我推荐。也是后起之秀。
  • 推特
  • 投寄箱
  • 科丁。
  • 甚至百度。顺便说一句,围棋在中国非常受欢迎。
  • 其他很多。

在Go上做一些项目的公司列表中有一种或另一种方式:https : //github.com/golang/go/wiki/GoUsers

我们在Go上做了什么?ITooLabs Centrex


我们今年写了什么?

  1. 一个动态集群,允许您在所有节点之间平均分配负载(通过散列环)。
  2. 使用Protobuffer进行内部通信。
  3. 使用SIP / HTTP / WebSocket,用于外部通信。
  4. 它具有媒体处理器(放在一边,它是C ++)。
  5. JavaScript, node ( ). , Go: , . Lua, , , – JavaScript Go ( ).
  6. ? , , , - , , , – . - / , 2 .
  7. , – DevOps-friendly. , , , - , , , . , – .
  8. 1 .


正如我所说,大约在2012年,我们意识到隔离墙已经过去。太吓人了。我们在预测中并没有犯大错(这又是两年,并且会有曲柄变化),因为在2014年初,我们确实非常糟糕……

我们很快将生成功能的重要部分迁移到了新平台上,特别是记录,各种外部中继-这会在CPU上产生大量负载,而旧的供应商平台已经无法应对。



案件。7000万订户的语音邮件


现在所有这些都已经成功运行,并且平台上的几乎所有记录都通过了我们在Go上的系统。

如果您为获得声誉而长期工作,那么在某个时候声誉会开始为我服务。长期以来,运营商邀请人们来做某事。

  • 去年年底,事实证明,“某物”是为印度尼西亚运营商Indosat提供的7,000万订户的语音邮件系统。我们在平台的基础上进行思考和制定。从做出决定的那一刻起(更确切地说,从熨斗放置时间很长开始到放置)大约三个星期。
  • 16 , , , 7 – Application Service SIB- Go. – ++. 16 1800 50 000 . 6,5 ( – BHCA).
  • 280 – , . 1 BHCA 36 , , 2 . , – 100 .
  • , , 600 . Ceph .
  • 我们检查并测试:系统完全可以承受最多两台服务器的系统故障。也就是说,可以简单地将其关闭。这实际上与我们有关,因为安装电缆的印度尼西亚人民犯了一个小错误。
  • 最后,我们通常进行滚动更新。

我们能在这么短的时间内用其他语言做到吗?让我提醒您,从2012年到2015年-拥有如此负载并能为数百万印尼用户使用的产品的保修期为3年。

我不知道,但是我认为我们可以在Erlang上做到。也许我们可以用Java做到这一点。由于除了主要工作之外,我还在图拉大学讲授实时系统和并行编程,对我来说,最终结果之一就是我们决定使用Go的原因,这是一个非常简单的实验。

我给学生们做了一个实验,并确保Go学习曲线比我曾经遇到过的任何语言(在这个特定区域)都陡峭。学生们开始或多或少编写体面的代码,因为不雅的Go根本不允许编写。Go给出了无聊的代码,只有无聊的代码!但是in亵行不通-很难。



我可以夸耀的是,在部署后仅一个月的2015年12月31日,一天之内在系统上记录了16万条消息,这些消息相互之间发送。

问题


观众提问(以下简称-B): -非常感谢您的举报!非常有趣的案例。请告诉我,Go现在如何处理错误?例如,当我用Node编写代码并且需要连续执行5次异步操作时,我的代码显示为5行:wait,wait,wait,wait,wait,wait。

AN: -正如我所说,没有例外。无论如何,从某种意义上讲,您可以使用它们进行控制,管理。

问: -您如何管理错误?



AN: -如果!我再说一遍,Golang允许您编写非常无聊的代码,并引起剪切粘贴。

问: -这些if中有多少个将用于5个异步操作,每个操作都会爆炸?

一个:-从我的角度来看,它们将是同步的(从此goroutine的角度来看)。 5个

问: -代码几乎增加了一倍。

AN: -如果我付钱给代码开发人员,我可能会很沮丧。但是由于我为它们编写良好的工作代码这一事实付出了代价,因此我对此感到很高兴。

问: -是否可以动态地链接某种C库?

AN: -是的。

问: -也就是说,该功能仍然存在吗?

一个:-我展示和谈论的CGO的内容-它与静态库链接,如果存在,则与动态库连接。此外,在Go 1.5中,原则上出现了动态链接,即使现在它仍允许您创建动态库。但是我们已经习惯了,我们已经感觉到了这样一种机制,以至于我们不再感到需要。当然,您可以连接动态C库,C ++-不。

问: -结果二进制文件不是太大吗?

AN: -不。处理所有这些调用的整个系统的二进制文件(以及内部的JavaScript解释器)只有6 MB。这是一个基本适合第二个缓存的二进制文件。

在:-我本人经常听到比较:Go通常与解释性语言进行精确比较,很少有人承担编写完善的交流平台的任务。有哪些更简单的实际案例?



AN: -一个简单的案例非常好。对于Megafon,我们编写了预计费-类似于总线,它从内部的各个组件收集平台(计费,“ Multifon”-一个大型运营商总是有很多),这整个过程本身就集成了,添加到数据库中,计算所需的内容并将事件发送到不同的地方。

在同一个印度尼西亚,有一个简单的网关(尽管很简单,但是是分布式的),它从我们的系统接收事件并传递给发送其SSD的系统……这些都是任务-当然,所有这些操作都非常非常快地完成了,吸引。


一点广告:)


感谢您与我们在一起。你喜欢我们的文章吗?想看更多有趣的资料吗?通过下订单或向您的朋友推荐以支持我们,4.99美元起的面向开发人员的云VPS,这是我们为您发明的入门级服务器 独特模拟产品:关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器?(RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗?在荷兰2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起!阅读有关如何构建基础设施大厦的信息。使用Dell R730xd E5-2650 v4服务器花费一欧元9000欧元的c类?

All Articles