Wenn Sie nicht in einer Höhle leben, wissen Sie vielleicht, dass Microservices die heutige Architektur sind. Mit der Entwicklung dieses Trends
akzeptierte das Segment-Produkt es frühzeitig
als die Best Practice , die in einigen Fällen gut und in anderen, wie Sie bald sehen werden, nicht so gut war.
Kurz gesagt, Microservices sind eine serviceorientierte Softwarearchitektur, in der serverseitige Anwendungen durch die Kombination vieler minimaler Netzwerkdienste mit nur einer Aufgabe erstellt werden. Zu den Vorteilen gehören eine verbesserte Modularität, vereinfachte Tests, eine bessere funktionale Zusammensetzung, die Isolierung der Umgebung und die Autonomie der Entwicklungsteams. Das Gegenteil ist eine monolithische Architektur, bei der sich eine große Menge an Funktionen in einem Dienst befindet, in dem das Testen, Bereitstellen und Skalieren als Ganzes stattfindet.
Anfang 2017 haben wir mit dem Großteil unseres
Segmentprodukts einen Wendepunkt erreicht . Es sah so aus, als würden wir von einem Microservice-Baum fallen und jeden Ast auf dem Weg nach unten treffen. Anstatt sich schneller zu entwickeln, steckte ein kleines Team in zunehmender Komplexität. Die wesentlichen Vorteile dieser Architektur sind zu einer Belastung geworden. Als unsere Geschwindigkeit sank, nahm die Anzahl der Fehler zu.
Infolgedessen konnte das Team mit drei Vollzeitingenieuren, die die meiste Zeit nur mit der Wartung des Systems verbringen, keinen Erfolg haben. Etwas musste sich ändern. Dieser Beitrag handelt davon, wie wir einen Schritt zurückgetreten sind und einen Ansatz gewählt haben, der unseren Anforderungen und den Bedürfnissen des Teams gut entspricht.
Warum Microservices funktionieren
Die Segment-Client-Dateninfrastruktur empfängt Hunderttausende von Ereignissen pro Sekunde und leitet sie an die Partner-API weiter, die wir als serverseitige Ziele bezeichnen. Es gibt über hundert Arten dieser Bereiche, z. B. Google Analytics, Optimizely oder benutzerdefinierte Web-Hooks.
Vor Jahren, als das Produkt ursprünglich auf den Markt kam, war die Architektur einfach. Es gab eine API, die Ereignisse empfing und an die verteilte Nachrichtenwarteschlange sendete. In diesem Fall handelte es sich um ein JSON-Objekt, das von einer Web- oder Mobilanwendung generiert wurde und Informationen zu Benutzern und ihren Aktionen enthält. Eine beispielhafte Nutzlast sah folgendermaßen aus:
{
"type": "identify",
"traits": {
"name": "Alex Noonan",
"email": "anoonan@segment.com",
"company": "Segment",
"title": "Software Engineer"
},
"userId": "97980cfea0067"
}
, , . API , , , – Segment API, , . Segment .
, . , . , , , . , HTTP 500, -. , , , , . , .

, , , ,
. , , ,
.
, X -. , , X, . , , . , X . , .

, . -, . , , , . , , , .

API , . – X
traits.dob
, API
traits.birthday
. X :
const traits = {}
traits.dob = segmentEvent.birthday
Segment, . , API . , , XML .
, , . , , . , . . , .
. .
50 50 . , , HTTP , .
, ,
event.name()
.
name
Name
. ,
firstName
,
first_name
,
FirstName
. , .
Identify.prototype.name = function() {
var name = this.proxy('traits.name');
if (typeof name === 'string') {
return trim(name)
}
var firstName = this.firstName();
var lastName = this.lastName();
if (firstName && lastName) {
return trim(firstName + ' ' + lastName)
}
}
. .
. . . , , . .
, . , . . , , .
, . , – . , .
, , - , .
, , , . , . .
140 . . , .
, . , , .
Centrifuge. Centrifuge .

, , , . , .
120 . . , .
, . , . .
, . , .
, . HTTP , , , .
, . , . , HTTP , . , . . , , .
HTTP . , . 5 . 140 .
Traffic Recorder. Traffic Recorder
yakbak, . , , . . , . , HTTP , .
, , Traffic Recorder. , 140+ . .
., . , . 140+ . .
. 2016, , 32 . 46. 6 , 2016 .
. , . , , .
, :
- . , , , . , . , , .
- . , , , . 3000+ , . - Redis , . , .
, . , . , . , .
, . , , , .
- . , , . , , .
- , , , . , .
. , , . .