{"id":31124,"date":"2019-10-31T21:39:36","date_gmt":"2019-10-31T18:39:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\/"},"modified":"2019-10-31T21:39:36","modified_gmt":"2019-10-31T18:39:36","slug":"stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Bausteine \u200b\u200bverteilter Anwendungen. Zweite Ann\u00e4herung","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ank\u00fcndigung<\/strong><\/p>\n<p><\/p>\n<p><em>Liebe Kollegen, in der Mitte des Sommers plane ich die Ver\u00f6ffentlichung eines weiteren Zyklus von Artikeln zur Gestaltung von Massensystemen: \"Experiment VTrade\" \u2013 ein Versuch, ein Framework f\u00fcr Handelssysteme zu entwickeln. Der Zyklus wird die Theorie und Praxis des Aufbaus von B\u00f6rsen, Auktionen und Gesch\u00e4ften behandeln. Am Ende des Artikels lade ich Sie ein, f\u00fcr die Themen zu stimmen, die Sie am meisten interessieren.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bausteine \u200b\u200bverteilter Anwendungen. Zweite Ann\u00e4herung\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dies ist der Abschlussartikel des Zyklus \u00fcber verteilte reaktive Anwendungen in Erlang\/Elixir. In <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">im ersten Artikel<\/a><\/noindex> finden Sie die theoretischen Grundlagen der reaktiven Architektur. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Der zweite Artikel<\/a><\/noindex> veranschaulicht die grundlegenden Muster und Mechanismen zur Erstellung solcher Systeme.<\/p>\n<p><\/p>\n<p>Heute werden wir die Entwicklung der Codebasis und der Projekte insgesamt ansprechen. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organisation von Services<\/h2>\n<p><\/p>\n<p>In der realen Welt m\u00fcssen beim Entwickeln eines Services oft mehrere Interaktionsmuster in einem Controller vereint werden. Zum Beispiel muss der Benutzerservice, der f\u00fcr die Verwaltung der Benutzerprofile im Projekt zust\u00e4ndig ist, sowohl auf requ-resp-Anfragen reagieren als auch \u00fcber Aktualisierungen der Profile \u00fcber pub-sub informieren. Dieser Fall ist relativ einfach: der Messaging-Bereich wird von einem Controller abgedeckt, der die Logik des Services implementiert und Updates ver\u00f6ffentlicht.<\/p>\n<p><\/p>\n<p>Die Situation wird komplexer, wenn wir einen hochverf\u00fcgbaren verteilten Dienst implementieren m\u00fcssen. Nehmen wir an, die Anforderungen an die Benutzer haben sich ge\u00e4ndert: <\/p>\n<p><\/p>\n<ol>\n<li>Jetzt muss der Dienst Anfragen auf 5 Knoten des Clusters verarbeiten, <\/li>\n<li>die F\u00e4higkeit zur Ausf\u00fchrung von Hintergrundverarbeitungsaufgaben haben, <\/li>\n<li>und au\u00dferdem in der Lage sein, dynamisch Abonnent-Listen f\u00fcr Profilaktualisierungen zu verwalten.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Hinweis:<\/em> Die Frage der konsistenten Speicherung und Replikation von Daten betrachten wir nicht. Angenommen, diese Probleme wurden zuvor gel\u00f6st und es gibt bereits eine zuverl\u00e4ssige und skalierbare Speicherschicht im System, w\u00e4hrend die Verarbeiter Mechanismen zur Interaktion mit ihr haben.<\/p>\n<p><\/p>\n<p>Die formale Beschreibung des Benutzer-Dienstes hat sich verkompliziert. Aus Sicht der Programmierung bleiben die \u00c4nderungen dank der Verwendung von Messaging minimal. Um die erste Anforderung zu erf\u00fcllen, m\u00fcssen wir das Load-Balancing am Austauschpunkt f\u00fcr Anfragen und Antworten einrichten. <\/p>\n<p><\/p>\n<p>Die Anforderung zur Bearbeitung von Hintergrundaufgaben tritt h\u00e4ufig auf. Bei den Nutzern k\u00f6nnen dies die \u00dcberpr\u00fcfung von Dokumenten, die Verarbeitung hochgeladener Medien oder die Synchronisierung von Daten mit sozialen Netzwerken sein. Diese Aufgaben m\u00fcssen innerhalb des Clusters verteilt und \u00fcberwacht werden. Daher haben wir zwei L\u00f6sungsans\u00e4tze: entweder das Aufgabenverteilungsschema aus dem vorherigen Artikel verwenden oder, falls das nicht passt, einen benutzerdefinierten Task-Planer schreiben, der die Handler entsprechend unseren Bed\u00fcrfnissen steuert. <\/p>\n<p><\/p>\n<p>Der Punkt 3 erfordert eine Erweiterung des Pub-Sub-Schemas. Zur Umsetzung m\u00fcssen wir, nachdem wir den Pub-Sub-Austauschpunkt erstellt haben, zus\u00e4tzlich den Controller dieses Punktes im Rahmen unseres Services starten. So extrahieren wir die Logik f\u00fcr die Verwaltung von Abonnements und Abmeldungen aus der Messaging-Ebene in die Implementierung der Nutzer.<\/p>\n<p><\/p>\n<p>Die Dekomposition der Aufgabe hat gezeigt, dass wir zur Erf\u00fcllung der Anforderungen 5 Instanzen des Services auf verschiedenen Knoten starten und eine zus\u00e4tzliche Entit\u00e4t \u2013 einen Pub-Sub-Controller \u2013 schaffen m\u00fcssen, der f\u00fcr die Abonnements verantwortlich ist.<br \/>\nF\u00fcr den Start von 5 Handlern ist keine \u00c4nderung am Dienstcode erforderlich. Die einzige zus\u00e4tzliche Ma\u00dfnahme besteht in der Konfiguration der Lastenausgleichsregeln an der Austauschstelle, wor\u00fcber wir sp\u00e4ter sprechen werden.<br \/>\nEs gibt auch eine zus\u00e4tzliche Komplexit\u00e4t: Der Pub-Sub-Controller und der benutzerdefinierte Aufgabenplaner m\u00fcssen in einer einzigen Instanz arbeiten. Der Messaging-Dienst, als grundlegendes Element, sollte einen Mechanismus zur Wahl des F\u00fchrers bereitstellen.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Wahl des F\u00fchrers<\/h3>\n<p><\/p>\n<p>In verteilten Systemen ist die Wahl des F\u00fchrers das Verfahren zur Ernennung eines einzelnen Prozesses, der f\u00fcr die Planung der verteilten Verarbeitung einer bestimmten Last verantwortlich ist. <\/p>\n<p><\/p>\n<p>In Systemen, die nicht zur Zentralisierung neigen, kommen universelle Algorithmen und konsensorientierte Algorithmen wie Paxos oder Raft zum Einsatz.<br \/>\nDa Messaging ein Broker und zentrales Element ist, kennt es alle Dienstcontroller, die als Kandidaten f\u00fcr die F\u00fchrerschaft fungieren. Messaging kann einen F\u00fchrer ernennen, ohne eine Abstimmung durchzuf\u00fchren.<\/p>\n<p><\/p>\n<p>Alle Dienste erhalten nach dem Start und der Verbindung zur Austauschstelle eine Systemnachricht <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Falls <code>LeaderPid<\/code> mit <code>pid<\/code> dem aktuellen Prozess \u00fcbereinstimmt, wird er als F\u00fchrer ernannt, und die Liste <code>Servers<\/code> beinhaltet alle Knoten und deren Parameter.<br \/>\nBei der Einf\u00fchrung eines neuen und dem Ausschalten eines aktiven Knotens im Cluster erhalten alle Service-Controller <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> und <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> entsprechend.<\/p>\n<p><\/p>\n<p>Somit wissen alle Komponenten \u00fcber alle \u00c4nderungen Bescheid, und im Cluster gibt es jederzeit garantiert einen Leader.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Vermittler<\/h2>\n<p><\/p>\n<p>F\u00fcr die Umsetzung komplexer verteilter Verarbeitungsprozesse sowie bei der Optimierung vorhandener Architekturen ist es praktisch, Vermittler einzusetzen.<br \/>\nUm den Code der Dienste nicht zu \u00e4ndern und beispielsweise zus\u00e4tzliche Verarbeitung, Routing oder Logging von Nachrichten zu l\u00f6sen, kann vor dem Service ein Proxy-Handler aktiviert werden, der alle zus\u00e4tzlichen Arbeiten \u00fcbernimmt.<\/p>\n<p><\/p>\n<p>Ein klassisches Beispiel f\u00fcr die Optimierung von Pub-Sub ist eine verteilte Anwendung mit einem Business-Core, der Ereignisse wie Preis\u00e4nderungen auf dem Markt generiert, und einer Zugriffsschicht \u2014 N Servern, die ein WebSocket-API f\u00fcr Web-Clients bereitstellen.<br \/>\nWenn man es \u201ekonkret\u201c angeht, sieht die Kundenbetreuung folgenderma\u00dfen aus:<\/p>\n<p><\/p>\n<ul>\n<li>Der Kunde stellt eine Verbindung zur Plattform her. Auf der Serverseite, die den Datenverkehr terminiert, wird ein Prozess gestartet, der diese Verbindung bedient.<\/li>\n<li>Im Kontext des Dienstleistungsprozesses erfolgt die Authentifizierung und Anmeldung zu Aktualisierungen. Der Prozess ruft die Methode subscribe f\u00fcr die Themen auf.<\/li>\n<li>Nach der Ereignisgenerierung im Kern wird es an die Prozesse geliefert, die die Verbindungen bedienen.<\/li>\n<\/ul>\n<p><\/p>\n<p>Stellen wir uns vor, wir haben 50.000 Abonnenten f\u00fcr das Thema 'News'. Die Abonnenten sind gleichm\u00e4\u00dfig auf 5 Server verteilt. Schlie\u00dflich wird jedes Update, das am Austauschpunkt ankommt, 50.000 Mal repliziert: 10.000 Mal auf jedem Server, je nach Anzahl der Abonnenten darauf. Nicht gerade effizient, oder?<br \/>\nUm die Situation zu verbessern, f\u00fchren wir einen Proxy ein, der denselben Namen wie der Austauschpunkt hat. Der globale Namensregistrator sollte in der Lage sein, den n\u00e4chstgelegenen Prozess nach Namen zur\u00fcckzugeben, was wichtig ist.<\/p>\n<p><\/p>\n<p>Wir werden diesen Proxy auf den Access-Servern starten, und alle unsere Prozesse, die das Websocket-API bedienen, werden sich darauf anmelden, anstatt auf den urspr\u00fcnglichen Pub-Sub-Austauschpunkt im Kern. Der Proxy abonniert den Kern nur im Falle einer einzigartigen Anmeldung und repliziert die eingehende Nachricht an alle seine Abonnenten.<br \/>\nInsgesamt werden zwischen dem Kern und den Access-Servern 5 Nachrichten \u00fcbermittelt, anstatt 50.000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Routing und Lastverteilung<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>In der aktuellen Implementierung des Messaging gibt es 7 Strategien zur Verteilung von Anfragen:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. Die Anfrage wird an alle Controller \u00fcbermittelt.<\/li>\n<li><code>Round-Robin<\/code>. Es erfolgt eine Durchlauf- und zyklische Verteilung der Anfragen zwischen den Controllern.<\/li>\n<li><code>Konsens<\/code>. Die Controller, die den Dienst betreuen, teilen sich in einen F\u00fchrer und Nachfolger. Anfragen werden nur an den F\u00fchrer weitergegeben.<\/li>\n<li><code>Konsens &amp; round-robin<\/code>. In der Gruppe gibt es einen F\u00fchrer, aber die Anfragen werden unter allen Mitgliedern verteilt.<\/li>\n<li><code>sticky<\/code>. Eine Hash-Funktion wird berechnet und einem bestimmten Handler zugewiesen. Folgende Anfragen mit diesem Signature landen bei demselben Handler.<\/li>\n<li><code>sticky-fun<\/code>. Bei der Initialisierung des Nachrichtenaustauschpunkts wird zus\u00e4tzlich eine Hash-Berechnung Funktion \u00fcbergeben f\u00fcr <code>sticky<\/code> das Load-Balancing.<\/li>\n<li><code>. Bei<\/code>. \u00c4hnlich wie sticky-fun, jedoch kann er zus\u00e4tzlich weitergeleitet, abgelehnt oder vorbearbeitet werden. <\/li>\n<\/ul>\n<p><\/p>\n<p>Die Verteilungsstrategie wird bei der Initialisierung des Nachrichtenaustauschpunkts festgelegt.<\/p>\n<p><\/p>\n<p>Neben dem Load-Balancing erm\u00f6glicht das Messaging das Tagging von Entit\u00e4ten. Schauen wir uns die Arten von Tags im System an:<\/p>\n<p><\/p>\n<ul>\n<li>Verbindungstag. Erm\u00f6glicht zu verstehen, \u00fcber welche Verbindung die Ereignisse eingegangen sind. Wird verwendet, wenn der Controller-Prozess mit einem einzigen Austauschpunkt, aber unterschiedlichen Routing-Schl\u00fcsseln verbunden ist. <\/li>\n<li>Service-Tag. Er erm\u00f6glicht es, Handler f\u00fcr einen Dienst in Gruppen zusammenzufassen und die Routing- und Lastverteilungsfunktionen zu erweitern. F\u00fcr das Req-Resp-Muster erfolgt das Routing linear. Wir senden die Anfrage an den Austauschpunkt, wo sie an den Dienst weitergegeben wird. Wenn wir jedoch die Handler in logische Gruppen aufteilen m\u00fcssen, erfolgt die Aufteilung durch die Tags. Mit Angabe eines Tags wird die Anfrage an eine bestimmte Gruppe von Controllern geleitet.<\/li>\n<li>Request-Tag. Es erm\u00f6glicht, Antworten zu unterscheiden. Da unser System asynchron ist, ben\u00f6tigen wir die M\u00f6glichkeit, einen RequestTag beim Senden einer Anfrage anzugeben, um die Antworten des Dienstes zu verarbeiten. Anhand dieses Tags k\u00f6nnen wir verstehen, auf welche Anfrage die Antwort bei uns eingetroffen ist.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>F\u00fcr Pub-Sub ist alles etwas einfacher. Wir haben einen Austauschpunkt, an dem Nachrichten ver\u00f6ffentlicht werden. Der Austauschpunkt verteilt die Nachrichten an die Abonnenten, die sich f\u00fcr die entsprechenden Routing-Schl\u00fcssel angemeldet haben (man k\u00f6nnte sagen, dass dies einer Art Thema entspricht).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">Skalierbarkeit und Fehlertoleranz<\/h2>\n<p><\/p>\n<p>Die Skalierbarkeit des Systems insgesamt h\u00e4ngt von der Skalierbarkeit der Schichten und Komponenten des Systems ab:<\/p>\n<p><\/p>\n<ul>\n<li>Die Dienste skalieren durch das Hinzuf\u00fcgen zus\u00e4tzlicher Knoten mit den Handlern dieses Dienstes in den Cluster. Im Rahmen der praktischen Nutzung kann die optimale Lastverteilungspolitik ausgew\u00e4hlt werden.<\/li>\n<li>Der Messaging-Dienst innerhalb eines separaten Clusters skaliert im Allgemeinen entweder durch Auslagerung stark belasteter Austauschpunkte auf separate Clusterknoten oder durch Hinzuf\u00fcgen von Proxy-Prozessen in besonders belastete Bereiche des Clusters.<\/li>\n<li>Die Skalierbarkeit des gesamten Systems h\u00e4ngt als Merkmal von der Flexibilit\u00e4t der Architektur und der M\u00f6glichkeit ab, einzelne Cluster zu einer gemeinsamen logischen Einheit zusammenzuf\u00fchren.<\/li>\n<\/ul>\n<p><\/p>\n<p>Der Erfolg eines Projekts h\u00e4ngt oft von der Einfachheit und Geschwindigkeit der Skalierung ab. Das Messaging in der aktuellen Ausf\u00fchrung w\u00e4chst zusammen mit der Anwendung. Selbst wenn wir einen Cluster mit 50 bis 60 Maschinen ben\u00f6tigen, k\u00f6nnen wir auf F\u00f6deration zur\u00fcckgreifen. Leider geht das Thema F\u00f6deration \u00fcber den Rahmen dieses Artikels hinaus.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Redundanz<\/h2>\n<p><\/p>\n<p>Bei der Analyse der Lastverteilung haben wir bereits die Redundanz der Service-Controller besprochen. Allerdings muss auch das Messaging redundant sein. Im Falle eines Ausfalls eines Knotens oder einer Maschine muss das Messaging automatisch wiederhergestellt werden, und zwar in k\u00fcrzester Zeit.<\/p>\n<p><\/p>\n<p>In meinen Projekten nutze ich zus\u00e4tzliche Knoten, die die Last im Falle eines Ausfalls \u00fcbernehmen. In Erlang gibt es eine Standardimplementierung des verteilten Modus f\u00fcr OTP-Anwendungen. Der verteilte Modus erm\u00f6glicht es, nach einem Ausfall die abgest\u00fcrzte Anwendung auf einem anderen bereits gestarteten Knoten wiederherzustellen. Der Prozess ist transparent; nach einem Ausfall wird die Anwendung automatisch auf den Failover-Knoten \u00fcbertragen. Weitere Informationen zu dieser Funktionalit\u00e4t finden Sie hier. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">hier<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">Leistung<\/h2>\n<p><\/p>\n<p>Lassen Sie uns zumindest ann\u00e4hernd die Leistung von RabbitMQ und unserer ma\u00dfgeschneiderten Messaging-L\u00f6sung vergleichen.<br \/>\nIch habe gefunden <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">offizielle Ergebnisse<\/a><\/noindex> der RabbitMQ-Tests vom OpenStack-Team.<\/p>\n<p><\/p>\n<p>Im Abschnitt 6.14.1.2.1.2.2 des Originaldokuments wird das Ergebnis des RPC CAST dargestellt:<br \/>\n<img decoding=\"async\" alt=\"Bausteine \u200b\u200bverteilter Anwendungen. Zweite Ann\u00e4herung\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vorab werden wir keine weiteren Einstellungen im Betriebssystem-Kernel oder in der Erlang VM vornehmen. Testbedingungen:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Der Test innerhalb eines Erlang-Knotens wird auf einem Laptop mit einem \u00e4lteren i7 im mobilen Format durchgef\u00fchrt.<\/li>\n<li>Die Cluster-Tests finden auf Servern mit 10G-Netzwerken statt.<\/li>\n<li>Der Code l\u00e4uft in Docker-Containern. Das Netzwerk ist im NAT-Modus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Testcode:<\/p>\n<p><\/p>\n<pre><code class=\"erlang\">req_resp_bench(_) -&gt;\n  W = perftest:comprehensive(10000,\n    fun() -&gt;\n      messaging:request(?EXCHANGE, default, ping, self()),\n      receive\n        #'$msg'{message = pong} -&gt; ok\n      after 5000 -&gt;\n        throw(timeout)\n      end\n    end\n  ),\n  true = lists:any(fun(E) -&gt; E &gt;= 30000 end, W),\n  ok.<\/code><\/pre>\n<p><\/p>\n<p><em>Szenario 1:<\/em> Der Test wird auf einem \u00e4lteren i7 Laptop durchgef\u00fchrt. Test, Messaging und Service laufen auf einem Knoten in einem Docker-Container:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sequentielle 10000 Zyklen in ~0 Sekunden (26987 Zyklen\/s)\nSequentielle 20000 Zyklen in ~1 Sekunden (26915 Zyklen\/s)\nSequentielle 100000 Zyklen in ~4 Sekunden (26957 Zyklen\/s)\nParallel 2 100000 Zyklen in ~2 Sekunden (44240 Zyklen\/s)\nParallel 4 100000 Zyklen in ~2 Sekunden (53459 Zyklen\/s)\nParallel 10 100000 Zyklen in ~2 Sekunden (52283 Zyklen\/s)\nParallel 100 100000 Zyklen in ~3 Sekunden (49317 Zyklen\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Szenario 2<\/em>: 3 Knoten auf verschiedenen Maschinen unter Docker (NAT) gestartet.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sequentielle 10000 Zyklen in ~1 Sekunden (8684 Zyklen\/s)\nSequentielle 20000 Zyklen in ~2 Sekunden (8424 Zyklen\/s)\nSequentielle 100000 Zyklen in ~12 Sekunden (8655 Zyklen\/s)\nParallel 2 100000 Zyklen in ~7 Sekunden (15160 Zyklen\/s)\nParallel 4 100000 Zyklen in ~5 Sekunden (19133 Zyklen\/s)\nParallel 10 100000 Zyklen in ~4 Sekunden (24399 Zyklen\/s)\nParallel 100 100000 Zyklen in ~3 Sekunden (34517 Zyklen\/s)<\/code><\/pre>\n<p><\/p>\n<p>In allen F\u00e4llen \u00fcberschritt die CPU-Auslastung nicht 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Ergebnisse<\/h2>\n<p><\/p>\n<p>Ich hoffe, dieser Zyklus wirkt nicht wie ein Bewusstseinsdump und dass meine Erfahrungen sowohl den Forschern verteilter Systeme als auch den Praktikern, die am Anfang ihrer Reise zum Aufbau verteilter Architekturen f\u00fcr ihre Gesch\u00e4ftssysteme stehen und mit Interesse auf Erlang\/Elixir schauen, jedoch unsicher sind, ob es sich lohnt\u2026<\/p>\n<p><\/p>\n<p>Foto <noindex><a rel=\"nofollow\" href=\"https:\/\/unsplash.com\/photos\/Q4bmoSPJM18\">@chuttersnap<\/a><\/noindex><\/p>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte melden Sie sich an.<\/a><\/noindex>Sind Sie an Contour interessiert?<\/p>\n<h2 class=\"default-block__polling-title\">Welche Themen sollte ich im Rahmen des Zyklus \u201eExperiment VTrade\u201c am ausf\u00fchrlichsten behandeln?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Theorie: M\u00e4rkte, Auftr\u00e4ge und deren G\u00fcltigkeitsdauer: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Orderbuch. Theorie und Praxis der Umsetzung eines Buchs mit Gruppierungen.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Visualisierung des Handels: Ticks, Balken, Aufl\u00f6sungen. Wie speichern und zusammenf\u00fcgen?<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Backoffice. Planung und Entwicklung. Mitarbeiterkontrolle und Vorfalluntersuchung.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Wir kl\u00e4ren, welche Schnittstellen ben\u00f6tigt werden und wie man sie umsetzt.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Informationsspeicherung: PostgreSQL, Timescale, Tarantool in Handelssystemen.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktivit\u00e4t in Handelssystemen.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Sonstiges. Ich werde in den Kommentaren schreiben.<\/p>\n<\/li>\n<\/ul>\n<p>    6 Benutzer haben abgestimmt. 4 Benutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446344\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u0438\u0440\u0436\u0438, \u0430\u0443\u043a\u0446\u0438\u043e\u043d\u0430 \u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u043c \u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23092,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31124","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\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u0438\u0440\u0436\u0438, \u0430\u0443\u043a\u0446\u0438\u043e\u043d\u0430 \u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u043c \u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\" \/>\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\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\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\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u0438\u0440\u0436\u0438, \u0430\u0443\u043a\u0446\u0438\u043e\u043d\u0430 \u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u043c \u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\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=\"2019-10-31T18:39:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:39:36+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\udd47Bausteine verteilter Anwendungen. Zweite Ann\u00e4herung | ProHoster","description":"Ank\u00fcndigung Kollegen, Mitte des Sommers plane ich, eine weitere Artikelreihe \u00fcber das Design von Massensystemen zu ver\u00f6ffentlichen: \u201eExperiment VTrade\u201c \u2014 der Versuch, ein Framework f\u00fcr Handelssysteme zu schreiben. In dieser Reihe werden Theorie und Praxis des Aufbaus einer B\u00f6rse, einer Auktion und eines Shops behandelt. Am Ende des Artikels werde ich eine Umfrage zu den f\u00fcr Sie interessantesten Themen anbieten. Dies ist der abschlie\u00dfende Artikel der Reihe \u00fcber verteilte reaktive Systeme.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","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\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u0438\u0440\u0436\u0438, \u0430\u0443\u043a\u0446\u0438\u043e\u043d\u0430 \u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u043c \u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","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":"2019-10-31T18:39:36+00:00","article:modified_time":"2019-10-31T18:39:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31124","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":"2026-01-21 04:39:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:22:34","updated":"2026-01-21 04:39:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31124","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=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}