Was wir ĂŒber Mikroservices wissen

Hallo! Ich bin Vadim Madison, und ich leite die Entwicklung der System Platform bei Avito. Wir haben bereits mehrfach darĂŒber gesprochen, wie wir von einer monolithischen Architektur zu Mikrodiensten wechseln. Es ist an der Zeit, zu teilen, wie wir unsere Infrastruktur transformiert haben, um das Beste aus Mikrodiensten herauszuholen, ohne uns darin zu verlieren. Wie uns PaaS dabei unterstĂŒtzt, wie wir den Deployment-Prozess vereinfacht haben und die Erstellung eines Mikrodienstes auf einen Klick reduziert haben – lesen Sie weiter. Nicht alles, was ich hier schreibe, wurde bei Avito vollstĂ€ndig umgesetzt; ein Teil davon ist, wie wir unsere Plattform weiterentwickeln.

(Am Ende dieses Artikels werde ich auch ĂŒber die Möglichkeit sprechen, an einem dreitĂ€gigen Seminar von Mikrodienst-Architektur-Experte Chris Richardson teilzunehmen).

Was wir ĂŒber Mikroservices wissen

Wie wir zu Mikrodiensten gekommen sind

Avito ist eines der grĂ¶ĂŸten Kleinanzeigenportale der Welt, auf dem tĂ€glich ĂŒber 15 Millionen neue Anzeigen veröffentlicht werden. Unser Backend verarbeitet mehr als 20.000 Anfragen pro Sekunde. Derzeit haben wir mehrere Hundert Mikrodienste.

Wir bauen die Mikrodienstarchitektur seit mehreren Jahren auf. Wie genau – unsere Kollegen geben Einblicke uns mit in unserem Vortrag auf der RIT++ 2017. Auf dem CodeFest 2017 (siehe. Video), Sergey Orlov und Mikhail Prokopchuk haben ausfĂŒhrlich erklĂ€rt, warum der Übergang zu Mikrodiensten fĂŒr uns so wichtig war und welche Rolle Kubernetes dabei spielte. Jetzt tun wir alles, um die mit dieser Architektur verbundenen SkalierungsaufwĂ€nde zu minimieren.

UrsprĂŒnglich haben wir kein Ökosystem geschaffen, das uns umfassend bei der Entwicklung und EinfĂŒhrung von Mikrodiensten unterstĂŒtzt. Wir haben einfach praktische Open-Source-Lösungen gesammelt, sie bei uns implementiert und den Entwicklern empfohlen, sich damit auseinanderzusetzen. Am Ende mussten sie zu vielen verschiedenen Orten (Dashboards, interne Dienste) gehen, was sie in ihrem Bestreben bestĂ€rkte, den alten Weg im Monolithen weiterzugehen. In den nachstehenden Diagrammen ist in GrĂŒn dargestellt, was der Entwickler in irgendeiner Weise selbst macht, und in Gelb die Automatisierung.

Was wir ĂŒber Mikroservices wissen

Jetzt kann in der CLI-Utility PaaS mit einem Befehl ein neuer Dienst erstellt und mit zwei weiteren Befehlen eine neue Datenbank hinzugefĂŒgt sowie in die Staging-Umgebung deployt werden.

Was wir ĂŒber Mikroservices wissen

Wie man die Ära der 'MikrodienstzerstĂŒckelung' ĂŒberwinden kann

Bei einer monolithischen Architektur waren die Entwickler aufgrund der Notwendigkeit, die Konsistenz der ProduktÀnderungen zu gewÀhrleisten, gezwungen, sich damit auseinanderzusetzen, was bei den Nachbarn geschieht. Mit der neuen Architektur sind die Kontexte der Dienste nicht mehr voneinander abhÀngig.

DarĂŒber hinaus erfordert eine effektive Microservice-Architektur die Etablierung zahlreicher Prozesse, darunter:

‱ Protokollierung;
‱ Anfrageverfolgung (Jaeger);
‱ Fehleraggregation (Sentry);
‱ Status-, Nachrichten- und Ereignismanagement aus Kubernetes (Event Stream Processing);
‱ Race Limit / Circuit Breaker (Hystrix kann verwendet werden);
‱ Überwachung der Service-VerknĂŒpfungen (wir verwenden Netramesh);
‱ Monitoring (Grafana);
‱ Build-Prozesse (TeamCity);
‱ Kommunikation und Benachrichtigung (Slack, E-Mail);
‱ Aufgabenverfolgung (Jira);
‱ Dokumentation erstellen.

Um sicherzustellen, dass das System beim Scaling seine IntegritÀt und EffektivitÀt nicht verliert, haben wir die Organisation der Microservices bei Avito neu gedacht.

Wie wir mit Microservices umgehen

Die einheitliche "Partei-Politik" unter den zahlreichen Microservices von Avito wird unterstĂŒtzt durch:

  • Schichtung der Infrastruktur;
  • das Konzept Platform as a Service (PaaS);
  • Monitoring aller AktivitĂ€ten der Microservices.

Die Ebenen der Infrastrukturabstraktion bestehen aus drei Schichten. Lassen Sie uns von oben nach unten gehen.

A. Obere Ebene – Service Mesh. ZunĂ€chst haben wir Istio ausprobiert, aber es stellte sich heraus, dass es zu viele Ressourcen verbraucht, was in unserem Umfang zu kostspielig ist. Daher entwickelte unser leitender Architekt Alexander Lukjantschenko eine eigene Lösung – Netramesh (verfĂŒgbar als Open Source), die wir jetzt in der Produktion verwenden und die im Vergleich zu Istio deutlich weniger Ressourcen benötigt (aber auch nicht alle Funktionen von Istio bietet).
B. Mittlere Ebene – Kubernetes. Darauf stellen wir Mikrodienste bereit und betreiben sie.
C. Untere Ebene – Bare Metal. Wir verwenden keine Clouds und keine Lösungen wie OpenStack, sondern setzen vollstĂ€ndig auf Bare Metal.

Alle Schichten werden durch PaaS integriert. Diese Plattform besteht wiederum aus drei Teilen.

I. Generatoren, die ĂŒber ein CLI-Werkzeug gesteuert werden. Dieses Werkzeug hilft den Entwicklern, Mikrodienste richtig und mit minimalem Aufwand zu erstellen.

II. Zusammenfassender Sammler mit Kontrolle aller Werkzeuge ĂŒber ein gemeinsames Dashboard.

III. Speicher. Es interagiert mit Planern, die automatisch Trigger fĂŒr bedeutende Aktionen setzen. Dank dieses Systems wird keine Aufgabe ĂŒbersehen, nur weil jemand vergessen hat, sich eine Aufgabe in Jira zu setzen. DafĂŒr verwenden wir ein internes Tool namens Atlas.

Was wir ĂŒber Mikroservices wissen

Die Implementierung von Mikrodiensten bei Avito erfolgt ebenfalls nach einem einheitlichen Schema, was die Kontrolle ĂŒber sie in jeder Phase der Entwicklung und Veröffentlichung vereinfacht.

So funktioniert die Standard-Pipeline zur Entwicklung eines Mikrodienstes

Im Großen und Ganzen sieht die Kette zur Erstellung eines Mikrodienstes folgendermaßen aus:

CLI-Push → Continuous Integration → Bake → Deployment → KĂŒnstliche Tests → Canary-Tests → Squeeze Testing → Produktion → Wartung.

Lassen Sie uns diese Schritte genau in dieser Reihenfolge durchgehen.

CLI-Push

‱ Erstellung des Mikrodienstes.
Wir haben lange daran gearbeitet, jeden Entwickler in der Erstellung von Mikrodiensten zu schulen. Dazu haben wir detaillierte Anleitungen in Confluence geschrieben. Doch die Schemas wurden geĂ€ndert und ergĂ€nzt. Das Ergebnis — ein Flaschenhals entstand am Anfang des Prozesses: Der Start von Mikrodiensten dauerte viel lĂ€nger als zulĂ€ssig, und dennoch traten beim Erstellen hĂ€ufig Probleme auf.

Schließlich haben wir ein einfaches CLI-Tool entwickelt, das die grundlegenden Schritte zur Erstellung eines Mikrodienstes automatisiert. TatsĂ€chlich ersetzt es den ersten git push. Hier ist, was es konkret macht.

— Es erstellt den Dienst basierend auf einer Vorlage — Schritt fĂŒr Schritt, im Wizard-Modus. Wir haben Vorlagen fĂŒr die wichtigsten Programmiersprachen im Backend von Avito: PHP, Golang und Python.

— Mit einem Befehl wird die Umgebung fĂŒr die lokale Entwicklung auf einem bestimmten Rechner eingerichtet — Minikube wird gestartet, Helm-Charts werden automatisch generiert und im lokalen Kubernetes ausgefĂŒhrt.

— Es verbindet die benötigte Datenbank. Der Entwickler muss keine IP-Adresse, Benutzernamen oder Passwort kennen, um auf die benötigte Datenbank zuzugreifen — sei es lokal, in der Stage oder in der Produktion. Außerdem wird die Datenbank sofort in einer ausfallsicheren Konfiguration mit Load Balancing bereitgestellt.

— Es fĂŒhrt selbst ein Live-Build aus. Angenommen, der Entwickler hat etwas im Mikrodienst ĂŒber seine IDE geĂ€ndert. Das Tool erkennt die Änderungen im Dateisystem und erstellt die Anwendung (fĂŒr Golang) neu und startet sie neu. FĂŒr PHP leiten wir einfach das Verzeichnis in den Container und der Live-Reload erfolgt "automatisch".

— Generiert Autotests. In Form von Vorlagen, die jedoch einsatzbereit sind.

‱ Microservice-Deployment.

Das Bereitstellen eines Microservices war bei uns frĂŒher etwas mĂŒhsam. Erforderlich waren zwingend:

I. Dockerfile.

II. Konfiguration.
III. Helm-Chart, das an sich schon umfangreich ist und Folgendes umfasst:

— die Charts selbst;
— die Templates;
— spezifische Werte unter BerĂŒcksichtigung verschiedener Umgebungen.

Wir haben uns von den Schmerzen beim Überarbeiten der Kubernetes-Manifesten befreit, und jetzt werden sie automatisch generiert. Aber das Wichtigste ist, dass wir das Deployment auf ein Minimum vereinfacht haben. Ab sofort haben wir ein Dockerfile und der gesamte Konfigurationsaufwand wird von den Entwicklern in einer einzigen kurzen Datei, app.toml, festgelegt.

Was wir ĂŒber Mikroservices wissen

Auch die Bearbeitung der app.toml erfordert jetzt nur eine Minute. Wir legen fest, wie viele Kopien des Dienstes erstellt werden sollen (auf dem Entwicklungsserver, auf Staging, in der Produktion) und geben die AbhĂ€ngigkeiten an. Beachten Sie die Zeile size = „small“ im Block [engine]. Dies ist das Limit, das dem Dienst ĂŒber Kubernetes zugewiesen wird.

Auf Basis der Konfiguration werden dann automatisch alle erforderlichen Helm-Charts generiert und die Verbindungen zu den Datenbanken hergestellt.

‱ Grundlegende Validierung. Diese ÜberprĂŒfungen sind ebenfalls automatisiert.
Zu beachten ist:
— ob ein Dockerfile vorhanden ist;
— ob eine app.toml vorhanden ist;
— Gibt es eine Dokumentation;
— Sind die AbhĂ€ngigkeiten in Ordnung;
— Sind die Alert-Regeln festgelegt.
Zum letzten Punkt: Der Serviceinhaber legt selbst fest, welche Produktmetriken ĂŒberwacht werden sollen.

‱ Erstellung der Dokumentation.
Bisher ein problematischer Bereich. Es scheint das Offensichtlichste zu sein, ist aber gleichzeitig das am hĂ€ufigsten „vergessene“ und damit die verwundbarste Stelle in der Kette.
Es ist notwendig, dass eine Dokumentation fĂŒr jeden Microservice vorhanden ist. Diese enthĂ€lt folgende Abschnitte.

I. Kurze Beschreibung des Services. Ein paar SĂ€tze darĂŒber, was er tut und wozu er benötigt wird.

II. Link zum Architekturdiagramm. Es ist wichtig, dass man bei einem flĂŒchtigen Blick leicht erkennen kann, ob Sie Redis zum Caching oder als primĂ€ren Datenspeicher im persistierenden Modus verwenden. Bei Avito ist dies momentan ein Link zu Confluence.

III. Runbook. Ein kurzer Leitfaden zum Starten des Services und zu den Besonderheiten im Umgang damit.

IV. FAQ, in dem es gut wÀre, mögliche Probleme vorwegzunehmen, mit denen Ihre Kollegen bei der Arbeit mit dem Service konfrontiert werden könnten.

V. Beschreibung der Endpunkte fĂŒr die API. Sollten Sie keine Zielpunkte angeben, werden mit hoher Wahrscheinlichkeit Ihre Kollegen fĂŒr die Kosten aufkommen, deren Mikrodienste mit Ihrem verbunden sind. Aktuell verwenden wir dafĂŒr Swagger und unsere Lösung namens brief.

VI. Labels. Oder Marker, die anzeigen, zu welchem Produkt, zu welcher FunktionalitĂ€t oder zu welcher Abteilung des Unternehmens der Dienst gehört. Sie helfen, schnell zu erkennen, ob Sie FunktionalitĂ€t entwickeln, die vor einer Woche fĂŒr denselben GeschĂ€ftsbereich von Ihren Kollegen bereitgestellt wurde.

VII. Besitzer oder Besitzer des Dienstes. In den meisten FĂ€llen kann er – oder sie – mittels PaaS automatisch bestimmt werden, aber zur Sicherheit verlangen wir vom Entwickler, diese manuell anzugeben.

Schließlich ist es eine gute Praxis, Dokumentationen Ă€hnlich wie bei Code-Reviews zu ĂŒberprĂŒfen.

Continuous Integration

  • Vorbereitung der Repositories.
  • Pipeline in TeamCity erstellen.
  • Rechte festlegen.
  • Dienstbesitzer suchen. Hier liegt ein hybrides Modell vor – manuelle Markierung und minimale Automatisierung von PaaS. Vollautomatische Modelle fĂŒhren zu Problemen, wenn Dienste zur UnterstĂŒtzung an ein anderes Entwicklungsteam ĂŒbergeben werden oder wenn beispielsweise der Entwickler des Dienstes das Unternehmen verlĂ€sst.
  • Registrierung des Dienstes in Atlas (siehe oben). Mit all seinen Besitzern und AbhĂ€ngigkeiten.
  • ÜberprĂŒfung der Migrationen. Wir ĂŒberprĂŒfen, ob sich darunter potenziell gefĂ€hrliche Migrationen befinden. Zum Beispiel könnte eine von ihnen ein alter table enthalten oder etwas anderes, das die KompatibilitĂ€t des Datenmodells zwischen verschiedenen Versionen des Dienstes beeintrĂ€chtigt. In diesem Fall wird die Migration nicht ausgefĂŒhrt, sondern in eine Warteliste gesetzt – PaaS muss den Dienstbesitzer benachrichtigen, wenn es sicher ist, sie anzuwenden.

Bake

Der nÀchste Schritt ist das Verpacken der Dienste vor dem Deployment.

  • Bau der Anwendung. Klassisch – in ein Docker-Image.
  • Generierung von Helm-Charts fĂŒr den Dienst selbst und die damit verbundenen Ressourcen. Darunter auch fĂŒr Datenbanken und Cache. Sie werden automatisch gemĂ€ĂŸ der app.toml-Konfiguration erstellt, die in der CLI-Push-Phase generiert wurde.
  • Erstellung von Tickets fĂŒr Administratoren zur Öffnung von Ports (wenn erforderlich).
  • DurchfĂŒhrung von Unit-Tests und Berechnung der Codeabdeckung.. Wenn der Code Coverage unter dem festgelegten Schwellenwert liegt, wird der Service wahrscheinlich nicht in die Bereitstellung (Deployment) ĂŒbergehen. Liegt der Wert an der Grenze des ZulĂ€ssigen, erhĂ€lt der Service einen „pessimistischen“ Koeffizienten: Das bedeutet, dass der Entwickler bei fehlender Verbesserung im Zeitverlauf eine Benachrichtigung erhĂ€lt, dass es keinen Fortschritt bei den Tests gibt (und etwas unternommen werden sollte).
  • BerĂŒcksichtigung von EinschrĂ€nkungen bei Speicher und CPU. HauptsĂ€chlich schreiben wir Mikrodienste in Golang und fĂŒhren sie in Kubernetes aus. Daraus ergibt sich eine Besonderheit des Golang: Bei der AusfĂŒhrung werden standardmĂ€ĂŸig alle Kerne auf dem Rechner genutzt, es sei denn, die Variable GOMAXPROCS wird ausdrĂŒcklich gesetzt. Wenn mehrere solcher Dienste auf einem Rechner gestartet werden, beginnen sie, um Ressourcen zu konkurrieren, was die gegenseitige BeeintrĂ€chtigung zur Folge hat. In den Grafiken unten ist zu sehen, wie die AusfĂŒhrungszeit variieren kann, wenn die Anwendung ohne Wettbewerb und im Ressourcenrennen gestartet wird. (Die Quellcodes der Grafiken befinden sich hier).

Was wir ĂŒber Mikroservices wissen

AusfĂŒhrungszeit, je weniger, desto besser. Maximum: 643 ms, Minimum: 42 ms. Das Bild ist anklickbar.

Was wir ĂŒber Mikroservices wissen

Zeit fĂŒr die Operation, je weniger, desto besser. Maximum: 14091 ns, Minimum: 151 ns. Das Bild ist anklickbar.

Im Vorbereitungsschritt der Assemblierung kann diese Variable entweder direkt festgelegt oder die Bibliothek verwendet werden. automaxprocs von den Jungs bei Uber.

Deployment

‱ ÜberprĂŒfung der Konventionen. Bevor Sie beginnen, Assemblierungen des Services in die vorgesehenen Umgebungen zu liefern, mĂŒssen Sie Folgendes ĂŒberprĂŒfen:
— API-Endpunkte.
— Übereinstimmung der Antworten der API-Endpunkte mit dem Schema.
— Format der Protokolle.
— Festlegung der Header bei Anfragen an den Service (momentan erfolgt dies durch netramesh)
— Festlegung eines EigentĂŒmer-Markers beim Versenden von Nachrichten an den Bus (event bus). Dies ist wichtig, um die KohĂ€renz der Services ĂŒber den Bus hinweg zu verfolgen. In den Bus können sowohl idempotente Daten gesendet werden, die die KohĂ€renz der Services nicht erhöhen (was gut ist), als auch GeschĂ€ftsdaten, die die KohĂ€renz der Services stĂ€rken (was sehr schlecht ist!). Und in dem Moment, in dem diese KohĂ€renz ein Problem darstellt, hilft es, zu verstehen, wer den Bus beschreibt und liest, um die Services richtig zu trennen.

Obwohl es bei Avito derzeit nicht viele Konventionen gibt, erweitert sich der Pool. Je mehr solcher Vereinbarungen in einer verstĂ€ndlichen und praktischen Form fĂŒr das Team vorhanden sind, desto einfacher ist es, die Konsistenz zwischen den Mikrodiensten aufrechtzuerhalten.

Synthesetests

‱ Testen in einem geschlossenen Kreis. DafĂŒr verwenden wir derzeit die Open-Source-Lösung Hoverfly.io. Zuerst wird die tatsĂ€chliche Auslastung des Dienstes aufgezeichnet, danach wird sie im geschlossenen Kontur emuliert.

‱ Lasttests. Wir streben danach, alle Dienste auf optimale Leistung zu bringen. Jede Version eines Dienstes sollte einem Lasttest unterzogen werden, um die aktuelle Leistung des Dienstes sowie die Unterschiede zu vorherigen Versionen zu verstehen. Wenn die Performance nach einem Update um die HĂ€lfte sinkt, ist das ein deutliches Signal fĂŒr die Betreiber: Hier muss sich intensiv mit dem Code beschĂ€ftigt werden, um die Situation zu beheben.
Basierend auf den gesammelten Daten arbeiten wir beispielsweise daran, das Auto-Scaling richtig zu implementieren und letztendlich zu verstehen, inwieweit der Dienst skalierbar ist.

Bei Lasttests ĂŒberprĂŒfen wir, ob der Ressourcenverbrauch den festgelegten Grenzen entspricht. Dabei konzentrieren wir uns insbesondere auf die Extremwerte.

a) Wir betrachten die Gesamtauslastung.
— Zu niedrig — es funktioniert wahrscheinlich etwas gar nicht, wenn die Auslastung plötzlich um mehrere Male sinkt.
— Zu hoch — Optimierung ist erforderlich.

b) Wir betrachten die RPS-Schwelle.
Hier vergleichen wir die Unterschiede zwischen der aktuellen und der vorherigen Version sowie die Gesamtzahl. Wenn ein Service beispielsweise 100 RPS anzeigt, könnte das entweder auf eine schlecht geschriebene Software hinweisen oder Teil seiner Spezifikation sein. In jedem Fall ist das ein Anlass, den Service genau unter die Lupe zu nehmen.
Wenn die RPS jedoch zu hoch sind, könnte dies ein Zeichen fĂŒr einen Bug sein, und einer der Endpoints erfĂŒllt möglicherweise keine nĂŒtzliche Funktion mehr, sondern reagiert einfach nur auf einen bestimmten Trigger. return true;

Canary-Tests

Nachdem die synthetischen Tests abgeschlossen sind, testen wir die FunktionalitĂ€t des Mikroservices mit einer kleinen Anzahl von Nutzern. Wir beginnen vorsichtig, mit einem minimalen Prozentsatz der erwarteten Zielgruppe – weniger als 0,1%. In dieser Phase ist es sehr wichtig, dass im Monitoring die richtigen technischen und produktbezogenen Metriken festgelegt sind, damit sie schnellstmöglich auf Probleme im Service hinweisen. Die minimalen Canary-Testzeiten betragen 5 Minuten, die Hauptzeit 2 Stunden. FĂŒr komplexe Services stellen wir die Zeit manuell ein.
Wir analysieren:
— Metriken, die spezifisch fĂŒr die Sprache sind, insbesondere php-fpm-Worker;
— Fehler in Sentry;
— Antwortstatus;
— Antwortzeiten (Response Time), sowohl exakt als auch durchschnittlich;
— Latenz;
— Behandelte und unbehandelte Ausnahmen;
— Produktmetriken.

Squeeze Testing

Squeeze Testing wird auch als "Pressing"-Test bezeichnet. Diese Methode wurde von Netflix eingefĂŒhrt. Dabei fĂŒllen wir zunĂ€chst eine Instanz mit echtem Traffic bis zum Versagen und bestimmen damit ihr Limit. Anschließend fĂŒgen wir eine weitere Instanz hinzu und belasten diese Kombination erneut bis zum Maximum; so erkennen wir deren Höchstleistung und die Differenz zum ersten "Squeeze". Dieses Verfahren setzen wir fort, indem wir schrittweise weitere Instanzen hinzuzufĂŒgen und die VerĂ€nderungen analysieren.
Die Testergebnisse des "Pressing"-Tests fließen ebenfalls in eine zentrale Metrikdatenbank ein, wo wir entweder die Ergebnisse mit kĂŒnstlicher Last anreichern oder diese vollstĂ€ndig durch "synthetische" Daten ersetzen.

Produktion

‱ Skalierung. Bei der EinfĂŒhrung eines Dienstes in die Produktion ĂŒberwachen wir, wie er skaliert. Nur die CPU-Werte zu ĂŒberwachen, hat sich als ineffektiv erwiesen, basierend auf unseren Erfahrungen. Auto-Scaling funktioniert im Reinen mit einem RPS-Benchmark, allerdings nur fĂŒr spezifische Dienste, wie zum Beispiel Online-Streaming. Daher konzentrieren wir uns in erster Linie auf die fĂŒr die Anwendung relevanten Produktmetriken.

Insgesamt analysieren wir bei der Skalierung:
— die CPU- und RAM-Werte,
— die Anzahl der Anfragen in der Warteschlange,
— Antwortzeit,
— Prognose basierend auf gesammelten historischen Daten.

Bei der Skalierung eines Dienstes ist es ebenfalls entscheidend, seine AbhĂ€ngigkeiten zu ĂŒberwachen, um zu vermeiden, dass wir den ersten Dienst in der Kette skalieren, wĂ€hrend die anderen, auf die er zugreift, unter der Last zusammenbrechen. Um eine fĂŒr den gesamten Dienstpool akzeptable Last festzulegen, betrachten wir die historischen Daten des „nĂ€chsten“ abhĂ€ngigen Dienstes (unter BerĂŒcksichtigung der Kombination aus CPU- und RAM-Werten sowie spezifischen App-Metriken) und vergleichen diese mit den historischen Daten des initiierenden Dienstes und so weiter durch die gesamte „AbhĂ€ngigkeitskette“ von oben nach unten.

Wartung

Nachdem der Mikrodienst in Betrieb genommen wurde, können wir Trigger darauf setzen.

Hier sind typische Situationen, in denen Trigger ausgelöst werden.
— Potenziell gefĂ€hrliche Migrationen wurden entdeckt.
— Sicherheitsupdates wurden veröffentlicht.
— Der Dienst wurde seit langem nicht mehr aktualisiert.
— Die Last auf den Dienst hat deutlich nachgelassen oder einige seiner Produktmetriken liegen außerhalb der Norm.
— Der Dienst erfĂŒllt nicht mehr die neuen Anforderungen der Plattform.

Ein Teil der Trigger sorgt fĂŒr die StabilitĂ€t des Betriebs, ein anderer fungiert als Systemwartungsfunktion – zum Beispiel, wenn ein Service lange nicht aktualisiert wurde und sein Basis-Image nicht mehr den Sicherheitsanforderungen entspricht.

Dashboard

Kurz gesagt, das Dashboard ist das Steuerungselement unseres gesamten PaaS.

  • Eine zentrale Informationsquelle ĂŒber den Service, mit Daten zu Testabdeckungen, der Anzahl von Images, Produktionskopien, Versionen usw.
  • Ein Werkzeug zur Filterung von Daten nach Services und Labels (Markierungen fĂŒr Zugehörigkeit zu Business Units, Produktfunktionen usw.).
  • Ein Integrationswerkzeug fĂŒr Infrastruktur-Tools zur Nachverfolgung, Protokollierung und Überwachung.
  • Ein zentraler Dokumentationspunkt fĂŒr die Services.
  • Ein zentraler Überblick ĂŒber alle Ereignisse im Zusammenhang mit den Services.

Was wir ĂŒber Mikroservices wissen
Was wir ĂŒber Mikroservices wissen
Was wir ĂŒber Mikroservices wissen
Was wir ĂŒber Mikroservices wissen

Gesamt

Vor der EinfĂŒhrung von PaaS konnte ein neuer Entwickler mehrere Wochen benötigen, um sich in alle notwendigen Tools fĂŒr den Einsatz eines Mikrodienstes in der Produktion einzuarbeiten: Kubernetes, Helm, die speziellen internen Aspekte von TeamCity, die Konfiguration der Verbindung zu Datenbanken und Caches in einer ausfallsicheren Weise usw. Jetzt dauert das nur noch ein paar Stunden – das Quickstart lesen und den Service einrichten.

Ich habe zu diesem Thema einen Vortrag auf der HighLoad++ 2018 gehalten, den Sie sich ansehen können. Video und der PrÀsentation.

Bonus-Track fĂŒr diejenigen, die bis zum Ende gelesen haben.

Wir bei Avito organisieren ein internes dreitĂ€giges Training fĂŒr Entwickler von Chris Richardson, einem Experten fĂŒr Mikrodienste. Wir möchten die Möglichkeit zur Teilnahme an diesem Training an einen der Leser dieses Beitrags verschenken. Hier Das Programm des Trainings wurde veröffentlicht.

Das Training findet vom 5. bis 7. August in Moskau statt. Dies sind Arbeitstage, die vollstĂ€ndig ausgelastet sein werden. Mittagessen und Schulung finden in unserem BĂŒro statt, die Reise und Unterkunft muss der ausgewĂ€hlte Teilnehmer selbst bezahlen.

Sie können sich fĂŒr die Teilnahme in diesem Google-Formularanmelden. Von Ihnen benötigt werden — eine Antwort auf die Frage, warum genau Sie an dem Training teilnehmen sollten, und Informationen, wie Sie kontaktiert werden können. Bitte antworten Sie auf Englisch, da Chris den Teilnehmer auswĂ€hlen wird, der an dem Training teilnehmen wird.
Wir werden den Namen des Teilnehmers bis spĂ€testens 19. Juli in einem Update zu diesem Beitrag und in den sozialen Netzwerken von Avito fĂŒr Entwickler (AvitoTech auf Facebook, Vkontakte, Twitter) bekannt geben.

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster