Si no vive en una cueva, puede saber que los microservicios son la arquitectura actual. Con el desarrollo de esta tendencia, el producto Segment en una etapa temprana lo
aceptó como la mejor práctica que sirvió bien en algunos casos y, como pronto verá, no es tan bueno en otros.
En resumen, los microservicios son una arquitectura de software orientada a servicios en la que las aplicaciones del lado del servidor se crean combinando muchos servicios de red mínimos de una sola tarea. Los beneficios incluyen una modularidad mejorada, pruebas simplificadas, una mejor composición funcional, aislamiento del entorno y autonomía de los equipos de desarrollo. Lo opuesto es una arquitectura monolítica, donde se encuentra una gran cantidad de funcionalidad en un servicio, en el que las pruebas, la implementación y el escalado se llevan a cabo en su conjunto.
A principios de 2017, llegamos a un punto de inflexión con la mayor parte de nuestro
producto Segmento . Parecía que estábamos cayendo de un árbol de microservicios, golpeando cada rama en el camino. En lugar de desarrollarse más rápido, un pequeño equipo sumido en una complejidad creciente. Las ventajas significativas de esta arquitectura se han convertido en una carga. A medida que nuestra velocidad disminuía, aumentaba la cantidad de defectos.
Como resultado, el equipo no pudo tener éxito con tres ingenieros de tiempo completo que dedicaron la mayor parte de su tiempo simplemente a mantener el sistema. Algo tuvo que cambiar. Esta publicación es una historia sobre cómo retrocedimos un paso y adoptamos un enfoque que se correspondía bien con nuestros requisitos y las necesidades del equipo.
¿Por qué funcionó el microservicio?
La infraestructura de datos del cliente Segment recibe cientos de miles de eventos por segundo y los redirige a la API asociada, que llamamos destinos del lado del servidor. Existen más de cien tipos de estas áreas, como Google Analytics, Optimizely o enlaces web personalizados.
Hace años, cuando el producto se lanzó originalmente, la arquitectura era simple. Hubo una API que recibió eventos y los envió a la cola de mensajes distribuidos. El evento en este caso fue un objeto JSON generado por una aplicación web o móvil que contiene información sobre los usuarios y sus acciones. Un ejemplo de carga útil se veía así:
{
"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 , . , .
, . , . , . , .
, . , , , .
- . , , . , , .
- , , , . , .
. , , . .