{"id":73699,"date":"2020-03-11T14:42:33","date_gmt":"2020-03-11T11:42:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1"},"modified":"2020-03-11T14:42:33","modified_gmt":"2020-03-11T11:42:33","slug":"aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","title":{"rendered":"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Alexej Najdenow, CEO <noindex><a rel=\"nofollow\" href=\"http:\/\/itoolabs.com\/\">ITooLabs<\/a><\/noindex>, spricht \u00fcber die Entwicklung einer Telekommunikationsplattform f\u00fcr Anbieter von Kommunikationsdiensten in der Programmiersprache Go (Golang). Alexej teilt auch seine Erfahrungen bei der Implementierung und dem Betrieb der Plattform bei einem der gr\u00f6\u00dften asiatischen Telekommunikationsanbieter, der die Plattform f\u00fcr Voicemail-Services und Cloud-CTI genutzt hat.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/02f20af3c002ff83297e057c5e72d8c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Alexej Najdenow (im Folgenden \u2013 AN):<\/b> \u2013 Hallo zusammen! Mein Name ist Alexej Najdenow. Ich bin der Direktor von ITooLabs. Zun\u00e4chst m\u00f6chte ich erl\u00e4utern, was ich hier mache und wie ich hierher gekommen bin.<\/p>\n<p>Wenn Sie sich den Bitrix24 Marketplace (Bereich \u201eTelefonie\u201c) ansehen, gibt es 14 Apps und 36, die dort zu finden sind (40%) \u2013 das sind wir:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/548721144e4367eca1eadad8ce9c31ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGenauer gesagt, sind das unsere Partneranbieter, aber hinter all dem steht unsere Plattform (Platform as a Service) \u2013 das, was wir ihnen f\u00fcr kleines Geld verkaufen. Tats\u00e4chlich m\u00f6chte ich \u00fcber die Entwicklung dieser Plattform und dar\u00fcber, wie wir zu Go kamen, sprechen.<\/p>\n<p>Die aktuellen Zahlen zu unserer Plattform sind:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/d59542f4af58a9735c8384b20d5750c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n44 Partnernetzbetreiber, darunter \"Megafon\". Ganz ehrlich, wir lieben es, uns auf verschiedene Abenteuer einzulassen, und wir haben tats\u00e4chlich Zugang zu 100 Millionen Abonnenten von 44 Anbietern hier in Russland. Wenn also jemand gesch\u00e4ftliche Ideen hat, sind wir immer bereit, zuzuh\u00f6ren.<\/p>\n<ul>\n<li>5000 Unternehmensnutzer.<\/li>\n<li>Insgesamt 20.000 Abonnenten. Das alles ist B2B \u2013 wir arbeiten ausschlie\u00dflich mit Unternehmen.<\/li>\n<li>300 Anrufe pro Minute tags\u00fcber.<\/li>\n<li>100 Millionen Minuten an Anrufen im vergangenen Jahr (das haben wir gefeiert). Das ohne interne Gespr\u00e4che, die auf unserer Plattform stattfinden.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Wie hat alles begonnen?<\/h3>\n<p>\nWie fangen die richtigen Leute an, ihre Plattform zu entwickeln? Man muss auch ber\u00fccksichtigen, dass wir in der Vergangenheit Hardcore-Enterprise-Entwicklung hatten, und das zur besten Zeit des Jahres f\u00fcr Enterprise! Es war die gl\u00fcckliche Zeit, als man zum Kunden kommt und sagt: \"Wir brauchen noch ein paar Server.\" Und der Kunde antwortet: \"Kein Problem! Wir haben zehn in der Rack stehen.\"<\/p>\n<p>Deshalb haben wir uns mit Oracle, Java, WebSphere, Db2 und \u00e4hnlichen Technologien besch\u00e4ftigt. Wir haben die bestenVendorl\u00f6sungen ausgew\u00e4hlt, sie integriert und versucht, damit durchzustarten. Es war ein internes Startup-Projekt.<\/p>\n<p>Alles begann im Jahr 2009. Seit 2006 besch\u00e4ftigen wir uns intensiv mit Betreiberl\u00f6sungen. Wir haben einige ma\u00dfgeschneiderte virtuelle Telefonanlagen entwickelt (\u00e4hnlich dem, was wir jetzt anbieten): Wir haben es uns angesehen, festgestellt, dass es gut funktioniert und beschlossen, ein internes Startup zu gr\u00fcnden.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/2d4e4da282ee106a0c8e53154a0b4b00.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir haben VMWare verwendet. Da wir auf eigene Kosten gearbeitet haben, mussten wir auf umfangreiche Vendor-Storage-L\u00f6sungen verzichten. Wir wissen alles \u00fcber sie: Versprechen muss man durch 3 teilen, und die Kosten multipliziert man mit 10. Darum haben wir DirDB und \u00e4hnliches entwickelt.<\/p>\n<p>Dann begann es zu wachsen. Dazu kam ein Abrechnungsservice, weil die Plattform nicht mehr zurechtkam. Der Abrechnungsserver von MySQL wurde auf Mongo umgestellt. Am Ende hatten wir eine funktionierende L\u00f6sung, die alle eingehenden Anrufe verarbeitet:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/5428e0c848952142e47adaaf09bc532e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDoch irgendwo da drinnen dreht sich das genau richtige Produkt \u2013 das Haupt-, das zentrale, welches wir einmal \u00fcbernommen haben. Gegen Ende 2011 wurde uns klar, dass dieses Produkt unser gr\u00f6\u00dftes Engpass sein w\u00fcrde \u2013 genau auf dieses werden wir sto\u00dfen. Wir sahen eine Wand vor uns, gegen die wir mit vollem Lauf rasten, da die Kunden kamen und hinzukamen.<br \/>\nAlso mussten wir irgendwie handeln. Nat\u00fcrlich haben wir umfangreiche Recherchen zu verschiedenen Produkten angestellt \u2013 sowohl Open Source als auch Vendor-L\u00f6sungen. Ich m\u00f6chte nicht weiter darauf eingehen \u2013 das ist nicht das Thema. Die letzte Option, \u00fcber die wir nachdachten, war, unsere eigene Plattform zu entwickeln.<\/p>\n<p>Schlie\u00dflich sind wir genau zu dieser Option gelangt. Warum? Weil alle Vendor- und Open Source-Produkte zur L\u00f6sung von Problemen gemacht wurden, die vor 10 Jahren aufgetreten sind. Gut, wenn sie 10 Jahre alt sind, einige sogar noch \u00e4lter! F\u00fcr uns war die Wahl offensichtlich: entweder wir verabschieden uns von unserer gro\u00dfartigen Idee des idealen Dienstes (f\u00fcr Partner, Betreiber und uns selbst), oder wir erschaffen etwas Eigenes.<\/p>\n<p>Wir haben beschlossen, etwas Eigenes zu entwickeln!<\/p>\n<h3>Anforderungen an die Plattform<\/h3>\n<p>\nWenn man sich l\u00e4ngere Zeit mit etwas besch\u00e4ftigt (ein fremdes Produkt nutzt), kommt einem irgendwann der Gedanke: Wie w\u00fcrde ich das selbst machen? Da wir in der Firma alles Programmierer sind (au\u00dfer den Verk\u00e4ufern, gibt es keine Nicht-Programmierer), haben sich unsere Anforderungen schon lange herauskristallisiert, und sie waren klar verst\u00e4ndlich:<\/p>\n<ol>\n<li>Hohe Entwicklungsgeschwindigkeit. Das Produkt des Anbieters, das uns gequ\u00e4lt hat, hat uns in erster Linie dadurch gest\u00f6rt, dass alles lange und langsam ging. Wir wollten es schnell \u2013 wir hatten viele Ideen! Und auch jetzt haben wir viele Ideen, aber damals war die Liste so lang, dass es schien, als w\u00fcrden wir zehn Jahre in die Zukunft planen. Jetzt sind es nur noch ein Jahr.<\/li>\n<li>Maximale Auslastung der Mehrkernhardware. Das war uns ebenfalls wichtig, da wir sahen, dass die Anzahl der Kerne nur weiter steigen w\u00fcrde.<\/li>\n<li>Hohe Zuverl\u00e4ssigkeit. Auch ein Punkt, bei dem wir viel geweint haben.<\/li>\n<li>Hohe Ausfallsicherheit.<\/li>\n<li>Wir wollten letztendlich zu einem Prozess mit t\u00e4glichen Releases kommen. Daf\u00fcr ben\u00f6tigten wir eine Sprachwahl.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/f20740863e9938ac22154d851081f71e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEntsprechend ergeben sich aus den Anforderungen an das Produkt, die wir an uns selbst gestellt haben, ganz logisch die Anforderungen an die Sprache.<\/p>\n<ol>\n<li>Wenn wir Unterst\u00fctzung f\u00fcr Mehrkernsysteme m\u00f6chten, ben\u00f6tigen wir Unterst\u00fctzung f\u00fcr parallele Ausf\u00fchrung.<\/li>\n<li>Wenn wir Geschwindigkeit in der Entwicklung wollen, brauchen wir eine Sprache, die konkurrierende Programmierung unterst\u00fctzt. Wer sich nicht mit dem Unterschied auskennt, der ist ganz einfach erkl\u00e4rt:\n<ul>\n<li>Paralleles Programmieren bedeutet, dass zwei verschiedene Threads auf unterschiedlichen Kernen ausgef\u00fchrt werden;<\/li>\n<li>konkurrierende Ausf\u00fchrung, genauer gesagt die Unterst\u00fctzung von Parallelit\u00e4t, beschreibt, wie die Sprache (oder die Laufzeitumgebung, ganz gleich) hilft, die gesamte Komplexit\u00e4t, die aus paralleler Ausf\u00fchrung resultiert, zu verbergen.<\/li>\n<\/ul>\n<\/li>\n<li>Hohe Zuverl\u00e4ssigkeit. Offensichtlich ben\u00f6tigten wir ein Cluster, und zwar besser als das, was wir mit dem vendor-spezifischen Produkt hatten.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/9aafc30a637341d71c8550818db2097d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTats\u00e4chlich hatten wir nicht viele Optionen, wenn wir daran zur\u00fcckdenken. Erstens, 'Erlang' \u2013 wir lieben es und kennen es, es war mein pers\u00f6nlicher Favorit. Zweitens, Java \u2013 genauer gesagt Scala. Drittens, eine Sprache, die wir zu diesem Zeitpunkt \u00fcberhaupt nicht kannten \u2013 Go. Es war gerade erst erschienen, genauer gesagt, es existierte seit etwa zwei Jahren, war aber noch nicht offiziell ver\u00f6ffentlicht.<\/p>\n<p>Go hat gewonnen!<\/p>\n<h3>Die Geschichte von Go<\/h3>\n<p>\nWir haben die Plattform darauf aufgebaut. Ich werde versuchen zu erkl\u00e4ren, warum.<\/p>\n<p>Eine kurze Geschichte von Go. Gestartet im Jahr 2007, offiziell er\u00f6ffnet 2009, die erste Version erschien 2012 (das hei\u00dft, wir haben noch vor dem ersten Release angefangen zu arbeiten). Der Initiator war Google, das, wie ich vermute, Java ersetzen wollte.<\/p>\n<p>Die Autoren sind ziemlich namhaft:<\/p>\n<ul>\n<li>Ken Thompson, der hinter Unix steht, UTF-8 erfunden hat und an Plan 9 gearbeitet hat;<\/li>\n<li>Rob Pike, der zusammen mit Ken UTF-8 entwickelt hat, arbeitete ebenfalls an Plan 9, Inferno und Limbo bei Bell Labs;<\/li>\n<li>Robert Griesemer, den wir kennen und lieben f\u00fcr die Erfindung des Java HotSpot Compilers und seine Arbeit am Generator in V8 (dem JavaScript-Interpreter von Google);<\/li>\n<li>Und \u00fcber 700 weitere Mitwirkende, einschlie\u00dflich einiger unserer Patches.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/d006ce7da7e94e71695186fbb5a4fa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Go: Ein erster Blick<\/h3>\n<p>\nWir sehen, dass die Sprache mehr oder weniger einfach und verst\u00e4ndlich ist. Es gibt offensichtliche Typen: in einigen F\u00e4llen m\u00fcssen sie deklariert werden, in anderen nicht (das bedeutet, dass die Typen folglich abgeleitet werden).<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/5d477702756c29b0ec2b74aa6df8098f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs ist offensichtlich, dass es \u00fcblich ist, Strukturen zu beschreiben. Wir sehen, dass es ein Konzept f\u00fcr Zeiger gibt (dort, wo der Stern steht). Es ist erkennbar, dass es spezielle Unterst\u00fctzung f\u00fcr die Deklaration und Initialisierung von Arrays und assoziativen Arrays gibt.<\/p>\n<p>Es ist ziemlich klar \u2013 man kann leben. Lassen Sie uns versuchen, Hello, World zu schreiben:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/c9301b0f6c70b6e00a8c0e71cae605b4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas sehen wir? Es handelt sich um eine C-\u00e4hnliche Syntax, das Semikolon ist optional. Es kann als Trennzeichen zwischen zwei Zeilen verwendet werden, aber nur, wenn es sich um zwei Anweisungen handelt, die auf einer einzigen Zeile stehen.<\/p>\n<p>Wir sehen, dass die Klammern in Kontrollstrukturen (in Zeile 14) optional sind, aber die geschweiften Klammern immer erforderlich sind. Wir sehen auch, dass die Typisierung statisch ist. Der Typ wird in den meisten F\u00e4llen abgeleitet. Dieses Beispiel ist etwas komplizierter als das \u00fcbliche Hello, World \u2013 nur um zu zeigen, dass es eine Bibliothek gibt.<\/p>\n<p>Was sehen wir noch? Der Code ist in Pakete organisiert. Um ein Paket in Ihrem eigenen Code zu verwenden, muss es mittels der Import-Direktive importiert werden \u2013 das ist ebenfalls wichtig. Lassen Sie es laufen \u2013 es funktioniert. Gro\u00dfartig!<\/p>\n<p>Versuchen wir etwas Komplexeres: Hello, World, aber diesmal ist es ein HTTP-Server. Was Interessantes sehen wir hier?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/9543af2b6a59fb26bb7baca49d78052c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZun\u00e4chst einmal ist die Funktion ein Parameter. Das bedeutet, dass die Funktion ein \u201eFirst-Class Citizen\u201c ist, und wir k\u00f6nnen damit viele interessante Dinge im funktionalen Stil machen. \u00dcberraschenderweise verweist die Import-Direktive direkt auf das GitHub-Repository. Das ist korrekt, und genau so sollte es auch sein.<\/p>\n<p>In Go ist die universelle Kennung eines Pakets die URL seines Repositories. Es gibt ein spezielles Tool namens Goget, das alle Abh\u00e4ngigkeiten herunterl\u00e4dt, installiert, kompiliert und ggf. f\u00fcr die Nutzung vorbereitet. Dabei kennt Goget auch html-meta. Entsprechend kann man ein http-Verzeichnis f\u00fchren, in dem Links zu dem eigenen Repository hinterlegt sind (wie wir es beispielsweise tun).<\/p>\n<p>Was sehen wir noch? Http und Json sind in der Standardbibliothek vorhanden. Es gibt offensichtlich eine Introspektion \u2013 Reflection, die in encoding\/json verwendet werden sollte, weil wir damit einfach ein beliebiges Objekt \u00fcbergeben. <\/p>\n<p>Wir starten und sehen, dass wir in 20 Zeilen n\u00fctzlichen Code untergebracht haben, der kompiliert, ausgef\u00fchrt wird und die aktuelle durchschnittliche Auslastung der Maschine zur\u00fcckgibt (auf der Maschine, auf der er ausgef\u00fchrt wird).<br \/>\nWas ist noch wichtig, das wir hier sofort sehen k\u00f6nnen? Es wird in ein einziges statisches Binary (buinary) kompiliert. Dieses Binary hat \u00fcberhaupt keine Abh\u00e4ngigkeiten, keine Bibliotheken! Es kann auf jedes System kopiert und sofort ausgef\u00fchrt werden, und es wird funktionieren.<\/p>\n<p>Lassen Sie uns weitermachen.<\/p>\n<h3>Go: Methoden und Schnittstellen<\/h3>\n<p>\nIn Go gibt es Methoden. Sie k\u00f6nnen eine Methode f\u00fcr jeden benutzerdefinierten Typ deklarieren. Dabei muss es sich nicht unbedingt um eine Struktur handeln; es kann auch ein Alias f\u00fcr einen bestimmten Typ sein. Sie k\u00f6nnen einen Alias f\u00fcr N32 erstellen und f\u00fcr ihn Methoden definieren, um n\u00fctzliche Dinge zu tun.<\/p>\n<p>Und hier sto\u00dfen wir zum ersten Mal auf ein Problem... Es stellt sich heraus, dass Go keine Klassen im eigentlichen Sinne hat. Diejenigen, die Go kennen, werden sagen, dass es Typen-Inklusion gibt, aber das ist etwas ganz anderes. Je fr\u00fcher ein Entwickler damit aufh\u00f6rt, dies als Vererbung zu betrachten, desto besser. In Go gibt es keine Klassen, und somit auch keine Vererbung.<\/p>\n<p>Frage! Was hat das Autorenteam unter der Leitung von Google uns gegeben, um die gesamte Komplexit\u00e4t der Welt darzustellen? Uns wurden Schnittstellen gegeben!<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/0af8a70e45ec3addca9599b6aea34fc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEin Interface ist eine spezielle Art, die es erm\u00f6glicht, einfache Methoden und deren Signaturen zu definieren. Jeder Typ, f\u00fcr den diese Methoden existieren (ausgef\u00fchrt werden), entspricht diesem Interface. Das bedeutet, dass Sie einfach die entsprechende Funktion f\u00fcr einen Typ und einen anderen (der dem Interface-Typ entspricht) beschreiben k\u00f6nnen. Danach deklarieren Sie eine Variable dieses Interface-Typs und weisen ihr eines dieser Objekte zu.<\/p>\n<p>F\u00fcr Hardcore-Fans kann ich sagen, dass in dieser Variablen tats\u00e4chlich zwei Zeiger vorhanden sein werden: einer auf die Daten und der andere auf eine spezielle Deskriptortabelle, die spezifisch f\u00fcr diesen bestimmten Typ und das Interface dieses Typs ist. Der Compiler erstellt solche Deskriptortabellen zum Zeitpunkt des Linkens.<\/p>\n<p>In Go gibt es nat\u00fcrlich auch Zeiger auf void. Das Wort interface {} (mit zwei geschweiften Klammern) ist eine Variable, die auf jedes beliebige Objekt verweisen kann.<br \/>\nBis jetzt ist alles in Ordnung, alles vertraut. Nichts \u00dcberraschendes.<\/p>\n<h3>Go: Goroutines<\/h3>\n<p>\nJetzt kommen wir zu dem, was interessiert: die leichtgewichtigen Prozesse \u2013 Goroutines (Goroutinen) in der Terminologie von Go.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Naydenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1\" src=\"\/wp-content\/uploads\/2020\/03\/18b756a5a2e5b2bbc25c38236db88bb8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Zun\u00e4chst einmal sind sie wirklich leichtgewichtig (unter 2 KB).<\/li>\n<li>Zweitens sind die Kosten f\u00fcr die Erstellung eines solchen Goroutinen vernachl\u00e4ssigbar: Sie k\u00f6nnen tausend pro Sekunde erstellen \u2013 es kostet nichts.<\/li>\n<li>Sie werden von ihrem eigenen Scheduler verwaltet, der einfach die Kontrolle von einer Goroutine zur n\u00e4chsten \u00fcbergibt.<\/li>\n<li>Dabei erfolgt die Kontrolle in den folgenden F\u00e4llen:\n<ul>\n<li>Wenn das go-Ausdruck auftritt (wenn eine Goroutine die n\u00e4chste Goroutine startet);<\/li>\n<li>Wenn ein blockierender Eingabe-\/Ausgabebefehl aktiviert wird;<\/li>\n<li>Wenn die M\u00fcllsammlung gestartet wird;<\/li>\n<li>Wenn eine Operation mit Kan\u00e4len gestartet wird.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nDas bedeutet, dass jedes Mal, wenn ein Go-Programm auf einem Computer ausgef\u00fchrt wird, es die Anzahl der Kerne im System ermittelt und so viele Threads startet, wie ben\u00f6tigt werden (entweder so viele wie es Kerne im System gibt oder so viele, wie Sie ihm gesagt haben). Entsprechend startet der Scheduler diese leichtgewichtigen Ausf\u00fchrungsstr\u00e4nge in all diesen Betriebssystem-Threads in jedem Kern.<\/p>\n<p>Es ist wichtig zu erw\u00e4hnen, dass dies der effizienteste Weg ist, Hardware zu verwerten. Neben dem Gezeigten bieten wir noch viele weitere L\u00f6sungen an. Zum Beispiel entwickeln wir DPI-Systeme, die es erm\u00f6glichen, 40 Gigabit pro Einheit zu bedienen (je nachdem, was in diesen Zeilen geschieht).<\/p>\n<p>Dort haben wir bereits vor Go genau dasselbe Schema aus diesem Grund verwendet: Es erm\u00f6glicht, die Lokalit\u00e4t des CPU-Caches zu erhalten und die Anzahl der Kontextwechsel des Betriebssystems erheblich zu reduzieren (was ebenfalls viel Zeit in Anspruch nimmt). Ich wiederhole: Dies ist der effizienteste Weg, um Hardware zu verwerten.<\/p>\n<p>Dieses einfache Beispiel mit 21 Zeilen zeigt, wie man einen einfachen Echo-Server erstellt. Beachten Sie, dass die Funktion 'serve' extrem einfach und linear ist. Es gibt keine Callback-Funktionen, und Sie m\u00fcssen sich nicht kompliziert anstellen und nachdenken... Sie lesen und schreiben einfach!<\/p>\n<p>Wenn Sie lesen und schreiben, sollte es sich tats\u00e4chlich blockieren \u2013 diese Goroutine wird einfach in die Warteschlange eingeordnet und vom Scheduler entnommen, wenn die Ausf\u00fchrung wieder m\u00f6glich ist. Das bedeutet, dass dieser einfache Code als Echo-Server f\u00fcr so viele Verbindungen arbeiten kann, wie das Betriebssystem auf dieser Maschine zul\u00e4sst.<\/p>\n<p>Die Fortsetzung kommt in K\u00fcrze...<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"HoEn7lXNQOU\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/HoEn7lXNQOU\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Ein wenig Werbung \ud83d\ude42<\/h3>\n<p>\nDanke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? M\u00f6chten Sie mehr interessante Inhalte sehen? Unterst\u00fctzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Ihren Freunden empfehlen. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">Cloud-VPS f\u00fcr Entwickler ab 4,99 $<\/a><\/noindex>, <b>eine einzigartige Alternative zu Einsteiger-Servern, die wir f\u00fcr Sie entwickelt haben:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Alles \u00fcber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt?<\/a><\/noindex> (Verf\u00fcgbar sind Optionen mit RAID1 und RAID10, bis zu 24 Kerne und bis zu 40GB DDR4).<\/p>\n<p><b>Dell R730xd im Equinix Tier IV Rechenzentrum in Amsterdam zum halben Preis?<\/b> Nur bei uns <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB ab 199 $<\/a><\/noindex> in den Niederlanden! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 ab 99 $!<\/b><\/b> Lesen Sie dar\u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Wie man eine Unternehmenskosten-Infrastruktur mit Dell R730xd E5-2650 v4-Servern f\u00fcr ein paar Euro aufbaut?<\/a><\/noindex><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/491652\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73700,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73699","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432. ITooLabs. \u041a\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Go (Golang) \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-11T11:42:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-11T11:42:33+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Alexey Naidenov. ITooLabs. Fallstudie zur Entwicklung einer Telefonplattform in Go (Golang). Teil 1 | ProHoster","description":"Alexey Naidenov, CEO von ITooLabs, spricht \u00fcber die Entwicklung einer Telekommunikationsplattform f\u00fcr Anbieter, programmiert in Go (Golang). Alexey teilt ebenfalls seine Erfahrungen bei der Implementierung und dem Betrieb der Plattform bei einem der gr\u00f6\u00dften asiatischen Telekommunikationsanbieter, der diese Plattform zur Bereitstellung von Voicemail-Diensten und einer virtuellen Telefonzentrale (Cloud PBX) verwendet hat. Alexey Naidenov (im Folgenden \u2013 AN): \u2013 Hallo zusammen! Ich bin","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432. ITooLabs. \u041a\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Go (Golang) \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-11T11:42:33+00:00","article:modified_time":"2020-03-11T11:42:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73699","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:28:29","updated":"2022-09-29 09:08:44"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/73699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=73699"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/73699\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/73700"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=73699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=73699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=73699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}