Subido por Cristian Luis Caceres Espinola

building-microservices-designing-fine-grained-systems-es

Anuncio
microservici
os
construcción
El diseño de sistemas de grano fino
Sam Newman
microservicios construcción
distributed sysTEMS hCra becommi mesre bien-grainere yonorte ºmi
past 10 años, Pasando de código-pesado aplicaciones monolíticas a microservicios más pequeños,
independientes. Pero el desarrollo de estos sistemas trae su propio conjunto de dolores de cabeza. Con una gran
cantidad de ejemplos y consejos prácticos, este libro tiene una visión integral de los temas que los arquitectos y
administradores de sistemas deben tener en cuenta al construir, gestionar, y la evolución de las arquitecturas
MICROSERVICE.
MICROSERVICE tecnologías se están moviendo rápidamente. Autor Sam
Newman le proporciona una base sólida en los conceptos, mientras que el
buceo en las soluciones actuales para el modelado, integración, pruebas,
implementación y seguimiento de sus propios servicios autónomos. Usted
seguirá una compañía ficticia a lo largo del libro para aprender cómo
construir una arquitectura microService afecta a un solo dominio.
■ Descubren cómo microservicios permiten alinear el diseño
de su sistema con objetivos de su organización
■
Aprender opciones para integrar un servicio con el resto de
su sistema
■
Tomar un enfoque gradual cuando se divide codebases
monolíticos
■
Implementar microservicios individuales a través de
la integración continua
■
Examinar la complejidad de las pruebas y el seguimiento de los
servicios distribuidos
■
Administrar la seguridad con los modelos de usuario-aservicio y Servicio-al-servicio
■
Entender los desafíos de intensificar las
arquitecturas MICROSERVICE
La arquitectura tiene
“muchas
microservicios
apelando cualidades,
pero el camino hacia
ella tiene trampas
dolorosas para los
incautos. Este libro le
ayudará a determinar
si este camino es para
usted, y cómo evitar
esas trampas en su
viaje.
”
-Martin Fowler
Jefe Científico, ThoughtWorks
Sam Newman es un tecnólogo en ThoughtWorks, donde divide su tiempo
entre ayudar a los clientes a nivel mundial y trabajar como arquitecto de
sistemas internos ThoughtWorks'. Ha trabajado con una variedad de
compañías en todo el mundo tanto en las operaciones de TI y de
desarrollo.
PROGRAMACIÓN
NOSOTROS $ 49.99 CAN $ 57.99
ISBN: 978-1-491-95035-7
Twitter: @oreillymedia
facebook.com/oreilly
microservicios
construcción
Sam Newman
microservicios construcción
por Sam Newman
Copyright © 2015 Sam Newman. Todos los derechos
reservados. Impreso en los Estados Unidos de
América.
Publicado por O'Reilly Media, Inc., 1005 Gravenstein Carretera Norte, Sebastopol, CA 95472.
libros de O'Reilly pueden ser adquiridos para uso educacional, comercial, o el uso promocional de ventas.
ediciones en línea también están disponibles para la mayoría de los títulos (http://safaribooksonline.com).
Para obtener más información, póngase en contacto con nuestro departamento corporativo / institucional
ventas: 800-998-9938 [email protected].
editores: Mike Loukides y Brian
MacDonald
Editor de Producción: Kristen
Brown Editor de copia: Rachel
Monaghan Corrector de
pruebas: Jasmine Kwityn
febrero 2015: Primera
indexador: Judith McConville
Diseñador de interiores: David
Futato Diseñador de la portada:
Ellie Volckhausen Illustrator:
Rebecca Demarest
Edición
Historial de revisiones para la primera edición
01/30/2014: Primera versión
Ver http://oreilly.com/catalog/errata.csp?isbn=9781491950357 para los detalles de la versión.
El logotipo de O'Reilly es una marca registrada de la imagen de portada de las abejas O'Reilly Media,
Inc. microservicios de construcción, y la imagen comercial son marcas comerciales de O'Reilly Media,
Inc.
Mientras que el editor y el autor han utilizado los esfuerzos de buena fe para asegurar que la información
y las instrucciones contenidas en este trabajo son exactos, el editor y el autor declinan toda
responsabilidad por errores u omisiones, incluyendo, sin responsabilidad limitación de los daños
producidos por el uso o dependencia de este trabajo. El uso de la información y las instrucciones
contenidas en este trabajo es bajo su propio riesgo. Si ninguna de las muestras de código u otra tecnología
este trabajo contiene o describe está sujeto a licencias de código abierto o los derechos de propiedad
intelectual de terceros, es su responsabilidad asegurarse de que el uso de los mismos cumple con dichas
licencias y / o derechos.
978-1-491-95035-7
[LSI]
Mesa Contenido
Preface.xiii ...........................................................................................................
1. Microservices.1 ...............................................................................................
¿Cuáles son microservicios?
Pequeña, y se centró en hacer una cosa bien
Autónomo
Beneficios clave
La heterogeneidad tecnología
Resiliencia
Escalada
Facilidad de implementación
La alineación organizacional
Compuestabilidad
Optimización para Reemplazabilidad
¿Qué hay de arquitectura orientada a servicios?
Otras técnicas descomposicional
Las bibliotecas compartidas
módulos
No Bala de plata
Resumen
2
2
3
4
4
5
5
6
7
7
7
8
9
9
10
11
11
2. el evolutiva Architect.13 ..................................................................................
Las comparaciones inexactas
Una visión evolutiva para el Arquitecto
zonificación
Un enfoque de principios
Metas estratégicas
13
15
dieciséis
17
18
iii
principios
prácticas
Combinando Principios y Prácticas
Un ejemplo del mundo real
El nivel requerido
Vigilancia
Interfaces
Seguridad arquitectónica
A través de la gobernabilidad Código
ejemplares
adaptada Plantilla de servicio
Técnico Deuda
Manejo de excepciones
Gobernabilidad y va desde el Centro
La construcción de un equipo
Resumen
18
19
19
19
20
21
21
21
22
22
22
24
24
25
26
27
3. Cómo Modelar Services.29 ..............................................................................
La introducción de MusicCorp
Lo que hace un buen servicio?
Bajo acoplamiento
alta cohesión
El contexto acotado
Compartida y Modelos Ocultos
Módulos y Servicios
La descomposición prematura
Las capacidades de negocio
tortugas Toda la calle abajo
La comunicación en términos de conceptos de negocio
El límite técnico
Resumen
29
30
30
30
31
31
33
33
34
34
36
36
37
4. Integration.39 .................................................................................................
En busca de la integración de la tecnología Ideal
Evitar Los cambios de última hora
Mantenga su independiente de la tecnología API
Hacer del Servicio simple para los consumidores
Ocultar detalle de implementación interna
Interfaz con Clientes
La base de datos compartida
Versus síncrono asíncrono
Orquestación Versus Coreografía
iv| Tabla de contenido
39
39
39
40
40
40
41
42
43
Llamadas a procedimiento remoto
46
tecnología de acoplamiento
Las llamadas locales no son como las llamadas remotas
fragilidad
Es RPC Terrible?
DESCANSO
REST y HTTP
Hipermedia como el motor del estado de la aplicación
JSON, XML, o algo más?
Cuidado con demasiada Conveniencia
Los inconvenientes se detuvo encima de HTTP
La implementación asíncrona Colaboración basado en eventos
opciones de tecnología
Complejidades de asincrónicos Arquitecturas
Servicios como Máquinas de Estado
Extensiones reactivas
SECO y los peligros de la reutilización de código en un mundo Microservice
bibliotecas de cliente
El acceso de Referencia
de versiones
Aplazar durante tanto tiempo como sea posible
Coger Breaking cambios tempranos
Utilizar Versiones semántica
Coexistir diferentes criterios de valoración
Utilizar Múltiples versiones de servicio concurrentes
Usuario Interfaces
Hacia Digital
restricciones
Composición API
Composición UI Fragmento
Backends para Frontends
Un enfoque híbrido
La integración con software de terceros
Falta de control
personalización
La integración de los espaguetis
En sus propios términos
El patrón de estrangulador
Resumen
47
47
47
49
49
50
51
53
54
54
55
55
57
58
58
59
59
60
62
62
63
64
64
66
67
67
68
68
69
71
73
73
74
74
74
75
77
78
5. la división de la Monolith.79 ...........................................................................
Sus Todo sobre costuras
79
v
Rompiendo Aparte MusicCorp
Las razones para dividir el monolito
Ritmo del cambio
Equipo Estructura
Seguridad
Tecnología
Enredado dependencias
La base de datos
Tener el control de la Problema
Ejemplo: Rompiendo clave Exteriores Relaciones
Ejemplo: compartido de datos estáticos
Ejemplo: datos compartidos
Ejemplo: compartido Tablas
Bases de datos de refactorización
Puesta en escena de las vacaciones
Los límites transaccionales
Tratar De nuevo más tarde
Abortar la operación entera
Las transacciones distribuidas
¿Entonces lo que hay que hacer?
informes
La base de datos de informes
Recuperación de datos a través de llamadas de servicio
Bombas de datos
destinos alternativos
Bomba de datos de eventos
Bomba de los datos de copia de seguridad
Hacia Tiempo real
Costo de Cambio
Causas comprensión
Resumen
80
81
81
81
81
82
82
82
82
84
85
86
87
88
89
89
91
91
92
93
93
93
95
96
98
98
99
100
100
101
102
6. Deployment.103 ..............................................................................................
Una breve introducción a la integración continua
¿Usted está haciendo realmente?
Mapeo de integración continua a microservicios
Construir oleoductos y Entrega Continua
Y las excepciones inevitables
Los artefactos Específicos de la Plataforma
Los artefactos del sistema operativo
Imágenes personalizadas
Imágenes como artefactos
vi| Tabla de contenido
103
104
105
107
108
109
110
111
113
Servidores inmutables
entornos
Configuración de servicio
Servicio-a-Host Mapping
Servicios Múltiples por host
contenedores de aplicaciones
Servicio individual por sistema
Plataforma como servicio
Automatización
Dos Los estudios de casos sobre el poder de la automatización
De físico a virtual
La virtualización tradicional
Vagabundo
Linux Contenedores
Estibador
Una interfaz de despliegue
Definición de Medio Ambiente
Resumen
113
114
115
116
116
118
119
120
121
122
122
123
124
124
126
127
128
130
7. Testing.131......................................................................................................
tipos de pruebas
Prueba Scope132
Unidad pruebas
Servicio pruebas
De extremo a extremo pruebas
Comercio-Offs135
Cómo Muchos? 136
Servicio de implementación de pruebas
burla o se Stubbing137
Un talón inteligente Service138
Aquellos End-to-End Tricky pruebas
Los inconvenientes de extremo a extremo Pruebas
Escamosa y quebradiza pruebas
Quien escribe estas Pruebas?
Cómo Tiempo? 141
El gran Pila-up142
los Metaversion143
Prueba No viajes, Stories143
Las pruebas dirigidos por el consumidor a la Rescue144
Pact145
Sus Acerca de Conversations147
Así que hay que usar End-to-End Pruebas?
131
134
134
135
136
138
140
140
141
147
vi
i
Pruebas Después Production148
La separación de despliegue desde Release148
Canario Releasing149
Tiempo medio de reparación Con el tiempo medio entre Fracasos? 150
De funciones cruzadas Pruebas
Actuación pruebas
Summary153
151
152
8. Monitoring.155 ...............................................................................................
Servicio sola, sola Server156
Servicio individual, múltiple Servers156
Servicios Múltiples, Múltiples Servers157
Troncos, troncos y aún Más Troncos ... 158
Seguimiento métrica a través de múltiples Services159
Servicio Metrics160
Sintético Monitoring161
La implementación de Semántica Monitoring162
Correlación IDs162
los Cascade164
Standardization165
Considera el Audience165
los Future166
Summary167
9. Security.169 ....................................................................................................
Autenticación y Authorization169
Común de sesión único Implementations170
Inicio de sesión único Gateway171
De grano fino Authorization172
Servicio-al-servicio de autenticación y Authorization173
Permitir todo dentro de la Perimeter173
HTTP (S) básico Authentication174
Utilizar SAML o OpenID Connect174
Cliente Certificates175
Durante HMAC HTTP176
API Keys177
El diputado Problem178
Asegurar los datos en Rest180
Vaya con el Pozo Known180
Sus Todo sobre el Keys181
Escoja su objetivos
descifrar el Demand181
viii| Tabla de contenido
181
Cifrar Backups181
defensa en Depth182
Firewalls182
Logging182
Detección de Intrusos (y prevención) System182
Red Segregation183
Operando System183
Un Trabajado Example184
Ser Frugal186
El humano Element187
El Dorado Rule187
Seguridad para hornear In187
Externo Verificación
Summary188
188
10. Conway Ley y el Sistema Design.191 ................................................................
Evidence191
Suelta y de estructura rígida Organizations192
ventanas Vista192
Netflix y Amazon192
¿Qué podemos hacer con Este? 193
La adaptación a la Comunicación vías
Servicio Ownership194
Controladores para Compartido Services195
También Difícil de Split195
Característica equipos
Entrega Bottlenecks196
Abrir interna Source196
El papel de la Custodians197
Maturity197
Estampación
Contextos acotadas y equipo Structures198
el Huérfano Servicio? 198
Caso de estudio: RealEstate.com.au199
Conway ley de Reverse201
People202
Summary203
193
195
198
11. microservicios en Scale.205 .............................................................................
El fracaso es Everywhere205
¿Cuánto es demasiado Mucho? 206
Degradante Functionality207
ix
Seguridad arquitectónica Measures208
el Antifragile Organization210
Timeouts211
Circuito Breakers212
Bulkheads214
Isolation215
Idempotency215
Scaling216
Ir Bigger217
Terrible Las cargas de trabajo
Su difusión Risk217
Carga Balancing219
Worker-Basado Systems220
Comenzando Again221
Escalada Databases222
Disponibilidad de servicio Versus Durabilidad de Data222
la ampliación de Reads222
la ampliación de escribe
Base de datos compartida Infrastructure224
CQRS224
Caching225
Del lado del cliente, Proxy, y del lado del servidor Caching226
El almacenamiento en caché en HTTP226
El almacenamiento en caché de escribe
El almacenamiento en caché de Resilience228
Cómo ocultar la Origin228
Quédatelo Simple229
El envenenamiento de la caché: A Cautionary Cuento
Autoscaling230
GORRA Theorem232
sacrificando Consistency233
sacrificando Availability233
partición sacrificar ¿Tolerancia?
AP o CP? 235
Sus No todos o Nothing235
Y el real Mundo
Servicio Discovery236
DNS237
Servicio dinámico Registries238
Zookeeper238
Consul239
Eureka240
x| Tabla de contenido
217
223
228
230
234
236
Su rodando Own241
no Olvida el Los seres humanos! 241
documentar Services241
Swagger242
HAL y el HAL Browser242
La auto-describen System243
Summary243
12. Bringing It All Together.245 .............................................................................
Principios de Microservices245
Alrededor de modelo de negocios Concepts246
Adoptar una cultura de Automation246
Ocultar implementación interna Details247
Todo el descentralizar Things247
Independientemente Deployable248
Aislar Failure248
Muy Observable249
¿Cuándo debe usted utilizar no Microservicios? 249
De despedida Palabras
250
Index.251 .............................................................................................................
xi
Prefacio
Microservicios son una aproximación a los sistemas distribuidos que promuevan el
uso de los servicios de grano fino con sus propios ciclos de vida, que colaboran
juntos. Debido a que los servicios de micro se modelan principalmente en torno a los
dominios de negocios, se evitan los problemas de las arquitecturas tradicionales
gradas. Microservicios también se integran las nuevas tecnologías y técnicas que han
surgido en la última década, lo que ayuda a evitar las caídas PIT muchas
implementaciones de arquitectura orientada a servicios.
Este libro está lleno de ejemplos concretos de uso microService en todo el mundo,
INCLUYENDO en organizaciones como Netflix, Amazon, dorado, y el grupo REA,
todos los cuales han encontrado que el aumento de la autonomía de esta arquitectura
da a sus equipos es una gran ventaja.
Quién debería leer este libro
El objetivo de este libro es amplio, ya que las implicaciones de las arquitecturas
MICROSERVICE de grano fino también son amplias. Como tal, se debería hacer un
llamamiento a las personas interesadas en los aspectos de diseño, desarrollo,
implementación, pruebas y mantenimiento de los sistemas. Aquellos de ustedes que
ya han emprendido el viaje hacia arquitecturas de grano más fino, ya sea para una
aplicación totalmente nueva o como parte de la descomposición de un sistema
existente, más monolítica, encontrará un montón de consejos prácticos para ayudarle.
También ayudará a aquellos de ustedes que quieren saber lo que todos los problemas
se trata, de manera que se puede determinar si microservicios son adecuados para
usted.
Por qué escribí este libro
Empecé a pensar en el tema de las arquitecturas de aplicaciones hace muchos años,
cuando se trabaja para ayudar a las personas entregan su software más rápido. Me di
cuenta de que si bien la automatización infra- estructura, pruebas y técnicas de
administración continuos podrían ayudar, si el diseño funda- mental del sistema no
xiii
hace que sea fácil hacer cambios, entonces hay límites a lo que puede lograrse.
xiv | Prefacio
Al mismo tiempo, muchas organizaciones estaban experimentando con arquitecturas
de grano más fino para lograr objetivos similares, sino también para lograr cosas
como la mejora de la escala, el aumento de la autonomía de los equipos, o para
abrazar con mayor facilidad las nuevas tecnologías. Mis propias experiencias, así
como los de mis colegas en ThoughtWorks y en otros lugares, reforzó el hecho de
que el uso de un mayor número de servicios con sus propios ciclos independientesvida resultó en más dolores de cabeza que tuvieron que ser tratados. En muchos
sentidos, este libro fue concebido como una ventanilla única que ayudaría a abarcar
la amplia variedad de ics Top- que son necesarios para la comprensión de
microservicios-algo que me han ayudado mucho en el pasado!
Una palabra en microservicios Hoy
Microservicios es un tema de rápido movimiento. Aunque la idea no es nueva
(aunque el término en sí es), las experiencias de la gente de todo el mundo, junto con
la aparición de nuevas tecnologías, están teniendo un profundo efecto en la forma en
que se utilizan. Debido al rápido ritmo del cambio, he tratado de enfocar este libro
sobre las ideas más de tecnologías específicas, sabiendo que los detalles de
implementación siempre cambian más rápido que los pensamientos detrás de ellos.
Sin embargo, estoy totalmente de esperar que en pocos años a partir de ahora vamos
a aprendido aún más acerca de dónde encajan microservicios, y cómo usarlos bien.
Así, mientras que yo he hecho todo lo posible para destilar la esencia del tema en este
libro, si te interesa el tema, debe estar preparado para muchos años de aprendizaje
continuo para mantener en la parte superior del estado del arte!
La navegación de este libro
Este libro está organizado principalmente en un formato basado en el tema. Como tal,
es posible que desee saltar en los temas específicos que más le interesen. Mientras
que he hecho todo lo posible para hacer referencia a términos e ideas en los capítulos
anteriores, me gustaría pensar que incluso las personas que se consideran bastante
experimentado encontrará algo de interés en todos los capítulos aquí. Sin duda
sugerir que tome un vistazo aCapitulo 2, Que afecta a la amplitud del tema, así como
proporcionar parte de la construcción de cómo hago las cosas en caso de que si
quieres profundizar más en algunos de los temas posteriores.
Para la gente nueva en el tema, he estructurado Los capítulos de una manera que
espero que tenga sentido para leer de principio a fin.
He aquí un resumen de lo que cubrimos:
Capítulo 1, microservicios
Comenzaremos con una introducción a microservicios, incluyendo los beneficios
clave, así como algunas de las desventajas.
xiii
Capítulo 2, el arquitecto evolutiva
Este capítulo trata de las dificultades que enfrentamos en términos de hacer
compensaciones como arquitectos, y cubre específicamente cuántas cosas
tenemos que pensar con microservicios.
Capítulo 3, Cómo modelo de servicios
Aquí vamos a empezar a definir los límites de microservicios, usando técnicas de
diseño de dominio impulsada para ayudar a enfocar nuestro pensamiento.
Capítulo 4, Integración
Aquí es donde comienza a recibir un poco más en las implicaciones tecnológicas
específicas, como veremos qué tipo de técnicas de colaboración de servicios nos
ayudará más. También vamos a profundizar en el tema de las interfaces de
usuario y la integración con el legado y (COTS) productos off-the-shelf
comerciales.
Capítulo 5, la división del monolito
Muchas personas se interesan en microservicios como un antídoto para sistemas
grandes y de difícil acceso de cambio monolíticas, y esto es exactamente lo que
vamos a cubrir en detalle en este capítulo.
Capítulo 6, despliegue
Aunque este libro es principalmente teórica, pocos temas en el libro han sido tan
afectados por los cambios recientes en la tecnología como la implementación, lo
que vamos a explorar aquí.
Capítulo 7, Testing
En este capítulo se adentra en el tema de las pruebas, un área de especial
preocupación cuando se manipula el despliegue de múltiples servicios discretos.
De particular interés será el papel que los contratos orientados al consumidor
pueden desempeñar para ayudar a asegurar la calidad de nuestro software.
Capítulo 8, Monitorización
Pruebas nuestro software antes de la producción no ayuda en caso de problemas,
una vez que vayamos en vivo, y este capítulo explora cómo podemos controlar
nuestros sistemas de grano fino y hacer frente a parte de la complejidad
emergente de los sistemas distribuidos.
Capítulo 9, Seguridad
Aquí vamos a examinar los aspectos de seguridad de microservicios y considerar
cómo manejar usuario-a-servicio y la autenticación de servicio a servicio y
autorización. La seguridad es un tema muy importante en la informática, que se
descuida con demasiada facilidad. Aunque soy de ninguna manera un experto en
seguridad, espero que este capítulo lo menos ayudarle a considerar algunos de
los aspectos que hay que tener en cuenta en la construcción de sistemas y
sistemas MICROSERVICE en particular.
XVI | Prefacio
Capítulo 10 de la Ley de Conway y Diseño de Sistemas
Este capítulo se centra en la interacción de la estructura organizativa y
arquitec- tura. Muchas organizaciones se han dado cuenta que los problemas
producirá si no se mantienen los dos en armonía. Vamos a tratar de llegar
fondo de este dilema, y con- Sider algunas diferentes maneras de alinear
diseño del sistema con la estructura de sus equipos.
la
se
al
el
Capítulo 11, microservicios en la Escala
Aquí es donde empieza a observar haciendo todo esto a escala, de manera que
podamos manejar el mayor riesgo de falla que puede ocurrir con un gran número
de servicios, así como grandes volúmenes de tráfico.
Capítulo 12, Uniendo fuerzas
Los intentos de los capítulos finales para destilar abajo de la esencia de la base
de lo que hace servicios de micro diferente. Incluye una lista de siete principios
microservicios, así como una recapitulación de los puntos clave del libro.
Las convenciones usadas en este libro
Las siguientes convenciones tipográficas se utilizan en este libro:
Itálico
Indica nuevos términos, direcciones URL, direcciones de correo electrónico, nombres de
archivos y extensiones de archivo.
anchura constante
Se utiliza para las listas de programas, así como dentro de los párrafos para
referirse a programar ele- mentos tales como nombres de variable o función,
bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.
Anchura constante negrita
Muestra los comandos u otro texto que debe ser escrito, literalmente, por parte del usuario.
Constant cursiva ancho
Muestra texto que debe ser reemplazado con valores proporcionados por el
usuario o por valores determinado por el contexto.
Libros en Safari®
Safari Books Online es una biblioteca digital bajo demanda
que deliv- ERS experto contenido tanto en forma de libros y
de vídeo de los autores más importantes del mundo en
tecnología y negocios.
profesionales de la tecnología, los desarrolladores de software, diseñadores web, y
los negocios y profesionales tivos crea- utilizan Safari Books Online como su
Prefacio | xv
principal recurso para la investigación, resolución de problemas, el aprendizaje y la
formación para la certificación.
XVI | Prefacio
Safari Books Online ofrece una gama de planes y precios para empresa, gobierno,
educacióne individuos.
Los miembros tienen acceso a miles de libros, videos de entrenamiento, y los
manuscritos originales, en una base de datos completa de búsqueda de editores como
O'Reilly Media, Prentice Hall Professional, Addison-Wesley Professional, Microsoft
Press, Sams, Que, Peachpit Press, Focal Press, Cisco prensa, John Wiley & Sons,
Syngress, Morgan Kaufmann, libros rojos de IBM, Packt, Adobe Press, FT Press,
Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett, Tecnología de golf y
cientos más. Para obtener más información sobre Safari Books Online, por favor
visiteen línea.
Cómo contactarnos
Por favor dirigirse a los comentarios y preguntas en relación con este libro a la editorial:
O'Reilly Media, Inc.
1005 carretera de Gravenstein Norte
Sebastopol, CA 95472
800-998-9938 (en los Estados Unidos o
Canadá) 707-829-0515 (internacional o local)
707-829-0104 (fax)
Tenemos una página web para este libro, en el que lista de erratas, ejemplos, y
cualquier información adicional. Puede acceder a esta página enhttp://bit.ly/buildingmicroservices.
Para comentar o hacer preguntas técnicas acerca de este libro, envía un correo
electrónico a bookques- [email protected].
Para obtener más información acerca de nuestros libros, cursos, conferencias y
noticias, visite nuestro sitio en la Web http://www.oreilly.com.
Encuentranos en Facebook: http://facebook.com/oreilly
Síguenos en Twitter: http://twitter.com/oreillymedia
ver en YouTube: http://www.youtube.com/oreillymedia
Expresiones de gratitud
Este libro está dedicado a Lindy Stephens, sin los cuales no existiría. Ella me animó a
empezar en este viaje, me han apoyado durante todo el proceso a menudo estresante
de la escritura, y es el mejor socio que podría haber pedido. También me gustaría
dedicar esto a mi padre, Howard Newman, que siempre ha estado ahí para mí. Esto
es para los dos.
Prefacio | xvii
Me gustaría destacar Ben Christensen, Vivek Subramaniam, y Martin Fowler para
proporcionar retroalimentación detallada a lo largo del proceso de escritura,
ayudando a dar forma a lo convirtió en este libro. También me gustaría dar las
gracias a James Lewis, con los que he consumido muchas cervezas discuten las ideas
presentadas en este libro. Este libro sería una sombra de sí mismo sin su ayuda y
orientación.
Además, muchos otros proporcionaron ayuda y retroalimentación sobre las primeras
versiones del libro. En concreto, me gustaría dar las gracias (en ningún orden en
particular) Kane Venables, Anand Krishnaswamy, Kent McNeil, Charles Haynes,
Chris Ford, Aidy Lewis, Will Támesis, Jon Aleros, Rolf Russell, Badrinath
Janakiraman, Daniel Bryant, Ian Robinson, Jim Webber, Stewart Gleadow, Evan
Bottcher, Eric Espada, Olivia Leonard, y todos mis otros colegas en ThoughtWorks y
en toda la industria, que me han ayudado a llegar hasta aquí.
Por último, me gustaría dar las gracias a toda la gente de O'Reilly, incluyendo Mike
Loukides por conseguirme a bordo, mi editor Brian MacDonald, Rachel Monaghan,
Kristen Brown, Betsy Waliszewski, y todas las otras personas que han contribuido de
una manera que mayo Nunca conocer.
xviii | Prefacio
CAPÍTULO 1
microservicios
Desde hace muchos años, hemos ido encontrando mejores maneras de construir
sistemas. Hemos estado aprendiendo de lo que ha venido antes, la adopción de
nuevas tecnologías, y observando cómo una nueva ola de empresas de tecnología
operan en diferentes formas de crear siste- mas de TI que ayudan a hacer sus clientes
y sus propios desarrolladores más feliz.
Driven Design-Domain libro de Eric Evans (Addison-Wesley) nos ayudó a
comprender la importancia de representar el mundo real en nuestro código, y nos
mostró mejores maneras de modelar nuestros sistemas. El concepto de la entrega
continua mostró cómo podemos conseguir mayor eficacia y eficiencia de nuestro
software en producción, infundiendo en nosotros la idea de que debemos tratar a cada
registro de entrada como una versión candidata. Nuestra comprensión de cómo
funciona la Web nos ha llevado a desarrollar mejores maneras de tener máquinas
hablan con otras máquinas. concepto de Alistair Cockburnarquitectura hexagonal nos
guiaron lejos de las arquitecturas de capas donde la lógica de negocio podría ocultar.
plataformas de virtualización nos permite cambiar el tamaño y la disposición nuestras
máquinas a voluntad, con la infraestructura de automatización ción que nos da una
manera de manejar estas máquinas a escala. Algunos exitosas zaciones grandes,
organiza- como Amazon y Google acuerdo con la idea de pequeños equipos con el
ciclo de vida completo de sus servicios. Y, más recientemente, Netflix ha compartido
con nosotros los caminos de la construcción de sistemas antifragile a una escala que
habría sido difícil de comprender hace apenas 10 años.
Dominio impulsada por el diseño. El suministro continuo. virtualización bajo
demanda. automatización de infra- estructura. equipos autónomos pequeños.
Sistemas a escala. Microservicios han surgido de este mundo. Ellos no fueron
inventados o descritos antes del hecho; surgieron como una tendencia o un patrón, de
un uso en el mundo real. Pero existen sólo por todo lo que ha pasado antes. A lo
largo de este libro, voy a tirar de hilos de este trabajo previo para ayudar a pintar un
cuadro de cómo construir, gestionar y evolucionar microservicios.
1
Muchas organizaciones han encontrado que al abrazar de grano fino,
MICROSERVICE arquitecturas, pueden ofrecer software más rápido y abrazar las
nuevas tecnologías. Microser-
10 | Capítulo 1: microservicios
vicios nos dan significativamente más libertad para reaccionar y tomar decisiones
diferentes, que nos permite responder más rápido a los cambios inevitables que nos
impacta a todos.
¿Cuáles son microservicios?
Microservicios son pequeños servicios, autónomos que trabajan en conjunto. Vamos
a romper que inition def- un poco y considerar las características que hacen
microservicios diferente.
Pequeña, y se centró en hacer una cosa bien
Bases de código crecen mientras escribimos código para agregar nuevas
características. Con el tiempo, puede ser difícil saber por dónde hay que hacer un
cambio porque el código base es tan grande. A pesar de una unidad de bases de
código monolíticos claras, modulares, con demasiada frecuencia estos límites
arbitrarios en proceso descomponen. Código relacionado con funciones similares
empieza a ser extendido por todo, lo que hace corregir errores o implementaciones
más difícil.
Dentro de un sistema monolítico, que lucha contra estas fuerzas, tratando de asegurar
que nuestro código es más cohesiva, a menudo mediante la creación de abstracciones
o módulos. Cohesión-la unidad de código relacionado haber agrupado-es un concepto
importante cuando pensamos en microservicios. Esto se ve reforzado por la
definición de Robert C. MartinSoltero Principio de responsabilidad, Que establece
que “Reúnanse las cosas que cambian por la misma razón, y separan aquellas cosas
que cambian por diferentes razones.”
Microservicios toman este mismo enfoque a los servicios independientes. Nos
centramos nuestros límites del servicio en los límites de negocios, por lo que es obvio
que el código vive para una determinada pieza de funcionalidad. Y manteniendo este
servicio centrado en un límite explícito, evitamos la tentación para que crezca
demasiado grande, con todas las dificultades asociadas que esto puede introducir.
La pregunta a menudo me preguntan cómo es pequeño es pequeño? Dando un
número de líneas de código es problemático, ya que algunas lenguas son más
expresivos que otros y por lo tanto, pueden hacer más en menos líneas de código.
También hay que considerar el hecho de que podíamos estar tirando en varias
dependencias, que a su vez contienen muchas líneas de código. Además, una parte de
su dominio puede ser legítimamente complejo, que requiere más código. Jon Aleros
en RealEstate.com.au en Australia caracteriza a un microService como algo que
podría ser reescrito en dos semanas, una regla de oro que tenga sentido para su
contexto particular.
Otra respuesta un tanto trillada que puedo dar es lo suficientemente pequeño y no
más pequeño. Al hablar en conferencias, que casi siempre la pregunta que tiene un
sistema que es demasiado grande y que desea romper? Casi todos levantan sus
1
manos. Parece que tenemos un muy buen sentido de lo que es demasiado grande, y
por lo tanto se podría argumentar que una vez que una pieza de código ya no se
siente demasiado grande, es lo suficientemente pequeño, probablemente.
10 | Capítulo 1: microservicios
Un importante factor en ayudar a responder a lo pequeño? es lo bien que el servicio
se alinea al equipo estructuras. Si el código base es demasiado grande para ser
manejado por un equipo pequeño, mirando a descomponerlo es muy sensible.
Hablaremos más sobre alineación de la organización en el futuro.
Cuando se trata de lo pequeño que es lo suficientemente pequeño, me gusta pensar en
estos términos: cuanto menor sea el servicio, más que maximizar los beneficios y
desventajas de la arquitectura vice microser-. A medida que se hacen más pequeños,
los beneficios de todo aumento de la interdependencia. Pero también lo hace parte de
la complejidad que surge de tener más y más partes en movimiento, algo que vamos
a explorar en este libro. A medida que vaya mejor en el manejo de esta complejidad,
se puede luchar por los servicios cada vez más pequeños.
Autónomo
Nuestra microService es una entidad separada. Podría ser desplegado como un
servicio aislado en una plataforma como servicio (PaaS), o podría ser su propio
proceso del sistema operativo. Tratamos de evitar el embalaje múltiples servicios en
la misma máquina, aunque la definición de la máquina en el mundo actual es bastante
confusa! Como veremos más adelante, a pesar de este aislamiento puede añadir un
poco por encima, dando como resultado la simplicidad hace que nuestro sistema
distribuido mucho más fácil razonar sobre, y más nuevas tecnologías son capaces de
mitigar muchos de los desafíos asociados con esta forma de implementación.
Todas las comunicaciones entre los servicios que ellos mismos son a través de
llamadas de red, para hacer cumplir la separación entre los servicios y evitar los
peligros de acoplamiento fuerte.
Estos servicios deben ser capaces de cambiar de forma independiente el uno del otro,
y desplegarse por sí mismos sin exigir a los consumidores a cambiar. Tenemos que
pensar en lo que nuestros servicios deben exponer, y lo que debemos permitir que se
oculta. Si hay demasiada compartir, nuestros servicios de consumo se vuelven junto a
nuestras representaciones internas. Esto disminuye nuestra autonomía, ya que
requiere una coordinación adicional con los consumidores cuando se hacen cambios.
Nuestro servicio expone una interfaz de programación de aplicaciones (API), y los
servicios que colaboran comunican con nosotros por esas API. También tenemos que
pensar en lo que tecnologıa es apropiada para asegurar que esto mismo no lo hace par
de los consumidores. Esto puede significar recoger las API independiente de la
tecnología para asegurar que no limitan las opciones tecnológicas. Volveremos una y
otra vez a la importancia de las buenas, APIs desacoplados lo largo de este libro.
Sin desacoplamiento, todo se descompone para nosotros. La regla de oro: se puede
hacer un cambio a un servicio y desplegarlo por sí mismo sin cambiar nada más? Si
la respuesta es no, entonces muchas de las ventajas que se discuten en este libro será
difícil para que usted pueda lograr.
A hacer desacoplamiento así, tendrá que modelar sus servicios a la derecha y
¿Cuáles son microservicios? |3
conseguir la API derecha. Voy a estar hablando de que una gran cantidad.
4| Capítulo 1: microservicios
Beneficios clave
Los beneficios de microservicios son muchas y variadas. Muchos de estos beneficios
se pueden imputarse a la aplicación de cualquier sistema distribuido. Microservicios,
sin embargo, tienden a lograr estos beneficios a un grado mayor, debido
principalmente a la distancia que toman los conceptos detrás de los sistemas
distribuidos y la arquitectura orientada a servicios.
La heterogeneidad tecnología
Con un sistema compuesto de múltiples servicios, que colaboran, podemos decidir
utilizar dife- rentes tecnologías dentro de cada uno. Esto nos permite recoger la
herramienta adecuada para cada trabajo, en lugar de tener que seleccionar un más
estandarizado, una talla única para todos que a menudo termina siendo el
denominador común más bajo.
Si una parte de nuestro sistema necesita mejorar su rendimiento, podríamos decidir
usar una pila de tecnología diferente, que es más capaz de alcanzar los niveles de
rendimiento requeridos. También podemos decidir que la forma en que almacenamos
nuestros datos debe cambiar para diferentes partes de nuestro sistema. Por ejemplo,
para una red social, podríamos almacenar las interacciones de nuestros usuarios en
una base de datos orientada gráfico-para reflejar la naturaleza altamente
interconectada de un gráfico social, pero tal vez los mensajes que los usuarios hacen
podrían ser almacenados en un almacén de datos orientada a documentos, dando
lugar a una arquitectura heterogénea como la que se muestra en laFigura 1-1.
La Figura 1-1. Microservicios pueden permitir a abrazar con mayor facilidad las diferentes
tecnologías
Con microservicios, sino que también son capaces de adoptar la tecnología más
rápidamente, y entienda cómo los nuevos avances nos pueden ayudar. Uno de los
mayores obstáculos para probar y la adopción de la nueva tecnología es los riesgos
asociados a ella. Con una aplica- ción monolítico, si quiero probar un nuevo lenguaje
de programación, bases de datos o marco, cualquier cambio afectará a una gran
cantidad de mi sistema. Con un sistema que consta de múltiples servicios, tengo
varios nuevos lugares en los que probar una nueva pieza de tecnología. Puedo elegir
un servicio que es quizás menor riesgo y el uso de la tecnología allí, sabiendo que
¿Cuáles son microservicios? |5
puedo limitar cualquier posible impacto negativo. Muchas organizaciones consideran
esta capacidad de absorber más rápidamente nuevas tecnologías para ser una ventaja
real para ellos.
6| Capítulo 1: microservicios
Abrazando múltiples tecnologías no viene sin una sobrecarga, por supuesto. Algunas
organizaciones optan por colocar algunas restricciones sobre las opciones de idioma.
Netflix y Twitter, por ejemplo, sobre todo utilizar la máquina virtual de Java (JVM)
como una plataforma, ya que tienen una muy buena comprensión de la fiabilidad y el
rendimiento de ese sis- tema. También desarrollan las bibliotecas y utillaje para la
JVM que hacen que opera a escala mucho más fácil, pero hacen que sea más difícil
para los servicios o clientes no basados en Java. Pero ni Twitter ni Netflix utilizan
sólo una pila de tecnología para todos los puestos de trabajo, ya sea. Otro
contrapunto a las preocupaciones acerca de la mezcla de diferentes tecnologías es el
tamaño. Si realmente puedo reescribir mi microService en dos semanas, es posible
que así mitigar los riesgos de las nuevas tecnologías embrac- ing.
Ya que encontrará en este libro, al igual que muchas cosas en relación con
microservicios, se trata de encontrar el equilibrio adecuado. Discutiremos cómo
tomar decisiones de tecnología enCapitulo 2, Que se centra en la arquitectura
evolutiva; y enCapítulo 4, Que se ocupa de la integración, aprenderá la forma de
garantizar que sus servicios pueden evolucionar su tecnología de forma
independiente entre sí sin acoplamiento indebida.
Resiliencia
Un concepto clave en la ingeniería de la resiliencia es la mampara. Si uno de los
componentes de un sistema falla, pero que el fallo no se conectan en cascada, se
puede aislar el problema y el resto del sistema puede seguir trabajando. los límites
del servicio se convierten en sus mamparos obvias. En un servicio monolítico, si el
servicio falla, todo deja de funcionar. Con un sistema monolítico, que puede
ejecutarse en múltiples máquinas para reducir nuestras posibilidades de fracaso, pero
con microservicios, podemos construir sistemas que manejan el fracaso total de los
servicios y degradar la funcionalidad en consecuencia.
Nosotros tenemos que tener cuidado, sin embargo. Para asegurar que nuestros
sistemas MICROSERVICE puede abarcar adecuadamente esta mayor resistencia,
tenemos que entender las nuevas fuentes de fracaso que los sistemas distribuidos
tienen que tratar. Las redes pueden y se producirá un error, ya que las máquinas.
Tenemos que saber cómo manejar esto, y qué impacto (si lo hay) que debe tener en el
usuario final de nuestro software.
Hablaremos más sobre una mejor capacidad de recuperación de manipulación, y
cómo manejar los modos de fallo, en Capítulo 11.
Escalada
Con un servicio monolítica grande, tenemos que escalar todo junto. Una pequeña
parte de nuestro sistema global está limitado en el rendimiento, pero si ese
comportamiento es encerrado en una aplicación monolítica gigante, tenemos que
manejar escalamiento todo como una pieza. Con los servicios más pequeños, sólo
Beneficios clave | 5
podemos escalar los servicios que necesitan de escala, lo que nos permite ejecutar
otras partes del sistema en un hardware más pequeños, menos potentes, como
enFigura 1-2.
6| Capítulo 1: microservicios
La Figura 1-2. Puede orientar la ampliación a tan sólo aquellos que lo necesitan microservicios
Dorada, un minorista en línea de la manera, adoptó microservicios por esta razón
exacta. A partir de 2007 con una aplicación Rails monolítico, para el año 2009 el
sistema de la cerda joven fue incapaz de hacer frente a la carga que se le plantean. Al
dividir a cabo piezas de la base de su sistema, dorado fue ter BET capaz de tratar con
sus picos de tráfico, y en la actualidad cuenta con más de 450 microservicios, cada
uno que se ejecuta en múltiples máquinas separadas.
Cuando abrazar sistemas de aprovisionamiento bajo demanda como los
proporcionados por los Servicios Web de Amazon, incluso podemos aplicar esta
escala en la demanda de aquellas piezas que lo necesitan. Esto nos permite controlar
nuestros costos de manera más eficaz. No es frecuente que un enfoque arquitectónico
puede ser tan estrechamente correlacionada con un ahorro de costes casi inmediatos.
Facilidad de implementación
Un cambio de una línea para una aplicación monolítica millones de líneas de larga
requiere toda la aplicación para ser desplegado a fin de liberar el cambio. Eso podría
ser un impacto a gran, el despliegue de alto riesgo. En la práctica, de gran impacto,
las implementaciones de alto riesgo terminan sucediendo con poca frecuencia debido
al temor comprensible. Desafortunadamente, esto significa que nuestros cambios se
acumulan y se acumulan entre los lanzamientos, hasta que la nueva versión de
nuestra producción golpear aplicación tiene masas de cambios. Y cuanto mayor sea
el delta entre versiones, mayor es el riesgo de que vamos a llegar algo mal!
Con microservicios, podemos hacer un cambio a un único servicio y desplegarlo
inde- pendientemente del resto del sistema. Esto nos permite obtener nuestro código
desplegado más rápido. Si se produce un problema, se puede aislar rápidamente a un
servicio individual, haciendo rápida reversión fácil de lograr. También significa que
podemos conseguir nuestra nueva funcionalidad a tomers cliente central más rápidos.
Beneficios clave | 7
Esta es una de las razones principales por las organizaciones como Amazon y Netflix
utilizan estas arquitecturas para asegurar que eliminar la mayor cantidad de
impedimentos como posi- ble para conseguir el software fuera de la puerta.
8| Capítulo 1: microservicios
La tecnología en este espacio ha cambiado mucho en el último par de años, y vamos
a estar buscando más profundamente en el tema de la implementación en un mundo
en microService Capítulo 6.
La alineación organizacional
Muchos de nosotros hemos experimentado los problemas asociados a los grandes
equipos y grandes bases de código. Estos problemas pueden exacerbarse cuando el
equipo se distribuye. También sabemos que los equipos más pequeños que trabajan
en bases de código más pequeños tienden a ser más productivo.
Microservicios nos permiten alinear mejor nuestra arquitectura de nuestra
organización, ayudando a minimizar el número de personas que trabajan en una sola
base de código para golpear el punto dulce del tamaño del equipo y la productividad.
También podemos cambiar la propiedad de los servicios entre los equipos para tratar
de mantener a la gente que trabaja en un servicio colocated. Vamos a entrar en
muchos más detalles sobre este tema cuando hablemos de la ley de Conway
enCapítulo 10.
Compuestabilidad
Una de las promesas clave de los sistemas distribuidos y arquitecturas orientadas a
servicios es que abrimos oportunidades para la reutilización de funcionalidad. Con
microservicios, permitimos a nuestra funcionalidad para ser consumido en diferentes
maneras para diferentes propósitos. Esto puede ser especialmente importante cuando
pensamos en cómo los consumidores utilizan nuestro software. Se ha ido el tiempo
en que se podría pensar por poco acerca de nuestro sitio web ya sea de escritorio o
aplicación móvil. Ahora tenemos que pensar en las miles de maneras que podríamos
desear para entretejer capacidades para la Web, aplicaciones nativas, web móvil,
aplicación tableta o dispositivo portátil. A medida que las organizaciones se mueven
lejos de pensar en términos de canales estrechos a conceptos más globales de la
participación del cliente, necesitamos arquitecturas que pueden mantener el ritmo.
Con microservicios, pensar en nosotros abriendo las costuras en nuestro sistema que
son direccionables por terceros. A medida que cambian las circunstancias, podemos
construir cosas de diferentes maneras. Con una aplicación monolítica, que a menudo
tienen una costura de grano grueso que se puede utilizar desde el exterior. Si quiero
romper ese hasta conseguir algo más útil, necesitaré un martillo! EnCapítulo 5, Voy a
discutir maneras para que usted pueda romperse sistemas monolíticos existentes, y es
de esperar cambiarlos a algunos, re-ces componibles microservi- reutilizables.
Optimización para Reemplazabilidad
Si usted trabaja en una de tamaño medio o grande organización, es probable que
usted está enterado de algún gran sistema, herencia desagradable sentado en la
esquina. El que nadie quiere tocar. El que es de vital importancia a la forma en que su
Beneficios clave | 9
empresa funciona, pero eso pasa a ser escrito en Fortran alguna variante rara y sólo
se ejecuta en hardware que llegó a final de la vida hace 25 años. Por qué no ha sido
sustituido? ¿Sabe por qué: es demasiado grande y arriesgado trabajo.
10| Capítulo 1: microservicios
Con nuestros servicios individuales son pequeñas en tamaño, el costo para
reemplazarlos con una mejor aplicación, o incluso eliminar por completo, es mucho
más fácil de manejar. ¿Cuántas veces ha eliminado más de un centenar de líneas de
código en un solo día y no preocuparse demasiado acerca de él? Con microservicios
siendo a menudo de tamaño similar, las barreras para reescribir o eliminar por
completo los servicios son muy bajos.
equipos utilizando enfoques MICROSERVICE se sienten cómodos con reescribir por
completo los servicios cuando sea necesario, y acaba de matar a un servicio cuando
ya no se necesita. Cuando una base de código es sólo unos pocos cientos de líneas de
largo, es difícil que la gente se emoción- aliado unido a él, y el costo de la sustitución
es bastante pequeña.
¿Qué hay de arquitectura orientada a servicios?
arquitectura orientada al servicio (SOA) es un enfoque de diseño donde laborate
múltiples servicios COL- para proporcionar un conjunto final de las capacidades. Un
servicio aquí normalmente significa un proceso del sistema operativo independiente
completamente com-. La comunicación entre estos servicios se produce a través de
llamadas a través de una red en lugar de llamadas de método dentro de un límite
proceso.
SOA surgido como un enfoque para combatir los retos de las grandes aplica- ciones
monolíticos. Es un enfoque que tiene como objetivo promover la reutilización de
software; dos o más aplicaciones de usuario final, por ejemplo, podrían utilizar tanto
los mismos servicios. Su objetivo es hacer que sea más fácil de mantener o reescribir
el software, ya que en teoría se puede sustituir un servicio con otro sin que nadie lo
sepa, siempre que la semántica del servicio no cambian demasiado.
SOA en su corazón es una idea muy sensata. Sin embargo, a pesar de muchos
esfuerzos, hay una falta de buen consenso sobre cómo hacer bien SOA. En mi
opinión, gran parte de la industria ha dejado de mirar de manera integral lo suficiente
en el problema y presentar una alternativa convincente a la narrativa establecida por
varios vendedores en este espacio.
Muchos de los problemas establecidos en la puerta de SOA son en realidad
problemas con cosas como los protocolos de comunicación (por ejemplo, jabón),
middleware proveedor, una falta de orientación sobre el servicio granular, o la
dirección equivocada en recoger lugares para dividir su sistema. Vamos a hacer
frente a cada uno de estos a su vez a lo largo del resto del libro. Un cínico podría
Sugiérale que los vendedores cooptado (y en algunos casos condujo) el movimiento
SOA como una forma de vender más productos, y aquellos productos mismísimos en
el extremo socavado el objetivo de SOA.
Gran parte de la sabiduría convencional en torno a SOA no ayudará a entender cómo
dividir algo grande en algo pequeño. Que no habla de lo grande que es demasiado
grande. No habla lo suficiente sobre el mundo real, las formas prácticas para asegurar
Beneficios clave |
11
que los servicios no se vuelven excesivamente acoplados. El número de cosas que
van no se dice es que muchos de los problemas asociados con SOA se originan.
12| Capítulo 1: microservicios
El enfoque microService ha surgido de uso del mundo real, teniendo nuestra mejor
comprensión de los sistemas y la arquitectura SOA para hacerlo bien. Así que en su
lugar debe pensar en microservicios como un enfoque específico para SOA de la
misma manera que XP o Scrum son enfoques específicos para el desarrollo ágil de
software.
Otras técnicas descomposicional
Cuando pones a ello, muchas de las ventajas de una arquitec- tura basada en
microService provienen de su naturaleza granular y el hecho de que le da muchas
más opciones en cuanto a cómo resolver los problemas. Pero podrían técnicas
similares descomposicionales lograr los mismos beneficios?
Las bibliotecas compartidas
Una técnica descomposicional muy estándar que se integra en prácticamente
cualquier idioma está rompiendo una base de código en múltiples bibliotecas. Estas
bibliotecas pueden ser proporcionados por terceros, o se crean en su propia
organización.
Las bibliotecas que dan una forma de compartir funciones entre los equipos y
servicios. Podría crear un conjunto de utilidades de recolección útiles, por ejemplo, o
tal vez una biblioteca de estadísticas que se pueden volver a utilizar.
Los equipos pueden organizarse en torno a estas bibliotecas, y las propias bibliotecas
pueden ser reutilizados. Sin embargo, hay algunos inconvenientes.
En primer lugar, se pierde la heterogeneidad verdadera tecnología. La biblioteca
generalmente tiene que estar en el mismo idioma, o por lo menos se ejecutan en la
misma plataforma. En segundo lugar, la facilidad con que se puede escalar partes de
su sistema de forma independiente el uno del otro se ve reducida. A continuación, a
menos que estés usando bibliotecas de enlace dinámico, no se puede desplegar una
nueva biblioteca sin volver a desplegar todo el proceso, por lo que su capacidad de
implementar cambios en el aislamiento se reduce. Y tal vez el truco es que carecen
de las costuras evidentes alrededor de los cuales erigir las medidas de seguridad
arquitectónicas para garantizar la flexibilidad del sistema.
Las bibliotecas compartidas tienen su lugar. Se encontrará la creación de código para
tareas comunes que no son específicos de su ámbito empresarial que desee volver a
utilizar en toda la organización, que es un candidato obvio para convertirse en una
biblioteca reutilizable. Usted necesita tener cuidado, sin embargo. código compartido
utilizado para la comunicación entre los servicios puede convertirse en un punto de
acoplamiento, algo que discutiremos enCapítulo 4.
Los servicios pueden y deben hacer un uso intensivo de las bibliotecas de terceros
para reutilizar código común. Pero no nos reciben todo el camino.
Otras técnicas descomposicional | 9
módulos
Algunos lenguajes proporcionan sus propias técnicas de descomposición modulares
que van más allá de simples bibliotecas. Permiten cierta gestión del ciclo de vida de
los módulos, de tal manera que se pueden implementar en un proceso en ejecución,
que le permite hacer cambios sin tener todo el proceso.
La Iniciativa de Entrada de código abierto (OSGi) es digna de ser llamada como uno
de los enfoques Tecnología en concreto a la descomposición modular. Java en sí no
tiene un verdadero concepto de módulos, y vamos a tener que esperar al menos hasta
el 9 de Java para ver esto, añadido a la lengua. OSGi, que surgió como un marco para
permitir que los plug-ins que se instalarán en el IDE Java Eclipse, ahora se utiliza
como una manera de adaptar un concepto modular en Java a través de una biblioteca.
El problema con OSGi es que está tratando de hacer cumplir las cosas como la
gestión del ciclo de vida del módulo sin suficiente apoyo en el lenguaje mismo. Esto
se traduce en más trabajo que tiene que ser hecho por los autores de módulos para
entregar en el aislamiento del módulo adecuado. Dentro de un límite de proceso,
también es mucho más fácil caer en la trampa de hacer módu- excesivamente
acopladas entre sí, causando todo tipo de problemas. Mi propia experiencia con
OSGi, que se corresponde con la de los colegas de la industria, es que incluso con
buenos equipos es fácil para OSGi para convertirse en una fuente mucho más grande
de la complejidad de su orden de beneficios.
Erlang sigue un enfoque diferente, en el que los módulos se cuecen al horno en el
tiempo de ejecución de lenguaje. Por lo tanto, Erlang es un enfoque muy maduro a la
descomposición modular. Erlang módulos se pueden detener, arrancará de nuevo y
actualizar sin problema. Erlang incluso admite la ejecución de más de una versión del
módulo en un momento dado, lo que permite la actualización módulo más elegante.
Las capacidades de los módulos de Erlang son realmente impresionantes, pero
incluso si tenemos la suerte de usar una plataforma con estas capacidades, que
todavía tienen los mismos defectos como lo hacemos con las bibliotecas compartidas
normales. Estamos estrictamente limitados en nuestra capacidad de utilizar las
nuevas tecnologías, limitado en cómo podemos escalar de forma independiente,
puede derivar hacia técnicas de integración que son demasiado acoplamiento, y las
costuras de la falta de medidas de seguridad de arquitectura.
Hay una pena compartir observación final. Técnicamente, debería ser posible CRE
comían bien-factorizada, módulos independientes dentro de un solo proceso
monolítico. Y sin embargo, rara vez vemos que esto suceda. Los propios módulos
pronto se convertirá estrechamente unidos con el resto del código, la entrega de una
de sus principales ventajas. Tener un proceso de separación obligados- ary hace
cumplir la higiene limpio en este sentido (o al menos hace que sea más difícil de
hacer las cosas mal!). Yo no diría que este debe ser el principal impulsor para la
separación de procesos, por supuesto, pero es interesante que las promesas de
10| Capítulo 1: microservicios
separación modular dentro de los límites del proceso rara vez se entregan en el
mundo real.
Así, mientras que la descomposición modular dentro de un límite de proceso puede
ser algo que desea hacer, así como la descomposición de su sistema en los servicios,
por sí sola no va a ayudar
Otras técnicas descomposicional | 11
resolver todo. Si usted es una tienda de puro Erlang, la calidad del módulo de Erlang
Implementation puede conseguir que un camino muy largo, pero sospecho que
muchos de ustedes no están en esa situación. Para el resto de nosotros, hay que ver
como módulos que ofrece el mismo tipo de ataques benefactores como bibliotecas
compartidas.
No hay bala de plata
Antes de terminar, me llamo que microservicios hay almuerzo gratis o con una bala
de plata, y para hacer una mala elección como un martillo de oro. Tienen todas las
complejidades asociadas de sistemas distribuidos, y aunque hemos aprendido mucho
acerca de cómo administrar bien los sistemas distribuidos (del que hablaremos a lo
largo del libro) es todavía difícil. Si viene desde un punto de vista sistema
monolítico, que tendrá que ser mucho mejor en el manejo de implementación,
pruebas y monitoreo para desbloquear los beneficios que hemos cubierto hasta ahora.
También tendrá que pensar diferente acerca de cómo cambia la escala de sus sistemas
y asegurarse de que son resistentes. No se sorprenda si también cosas como las
transac- ciones distribuidas o teorema de tapa inicial que le da dolores de cabeza, ya
sea!
Toda empresa, organización, y el sistema es diferente. Una serie de factores se
juegan en si o no microservicios son adecuados para usted, y lo agresivo que puede
estar en adoptarlos. A lo largo de cada capítulo de este libro voy a tratar de darle
Ance guid- destacando los peligros potenciales, que deberían ayudar a trazar una
trayectoria constante.
Resumen
Esperemos que ahora que sabes lo que es un microService es, lo que lo hace diferente
de otras técnicas de composición, y cuáles son algunas de las principales ventajas
son. En cada uno de los siguientes capítulos vamos a entrar en más detalles sobre
cómo lograr estos beneficios y cómo evitar algunos de los problemas más comunes.
Hay una serie de temas a tratar, pero tenemos que empezar por alguna parte. Uno de
los principales retos a los que introducen microservicios es un cambio en el papel de
aquellos que a menudo guiar la evolución de nuestros sistemas: los arquitectos.
Veremos siguiente en algunos enfoques diferentes para este papel que pueden
garantizar que sacar el mayor provecho de esta nueva arquitectura.
No hay bala de plata |
11
CAPITULO 2
El arquitecto evolutiva
Como hemos visto hasta ahora, microservicios nos dan una gran variedad de
alimentos, y por lo tanto una gran cantidad de decisiones que tomar. Por ejemplo, el
número de tecnologías diferentes deberíamos usar, debemos dejar que diferentes
equipos utilizan diferentes lenguajes de programación, y debemos dividir o combinar
un servicio? ¿Cómo hacemos para tomar estas decisiones? Con el ritmo acelerado del
cambio, y el medio ambiente más fluido que estas arquitecturas permiten, el papel del
arquitecto también tiene que cambiar. En este capítulo, voy a tomar una visión
bastante obstinado de lo que es el papel de un arquitecto, y es de esperar lanzo un
último asalto a la torre de marfil.
Las comparaciones inexactas
Tú seguir usando esa palabra. No creo que significa lo que usted piensa que significa.
-Inigo Montoya, desde
La novia princesa
Los arquitectos tienen un trabajo importante. Ellos son los encargados de asegurarse
de que tenemos una visión técnica se unió en marcha, uno que debería ayudarnos a
entregar el sistema de nuestros clientes necesitan. En algunos lugares, que sólo
pueden tener que trabajar con un equipo, en cuyo caso el papel del arquitecto y
técnico principal suele ser el mismo. En otros casos, pueden ser defin- ing la visión
de todo un programa de trabajo, en coordinación con varios equipos de todo el
mundo, o tal vez incluso una organización entera. Cualquiera sea el nivel en que
operan, el papel es un asunto difícil de precisar, ya pesar de que a menudo siendo
sión de la carrera obvia progresión para los desarrolladores en las organizaciones
empresariales, sino que también es un papel que pone CISM más criti- que
prácticamente cualquier otro. Más que cualquier otra función, los arquitectos pueden
tener un impacto directo en la calidad de los sistemas construidos, en las condiciones
de trabajo de sus gues collea-, y en la capacidad de su organización para responder al
cambio, y sin embargo, por lo que parece fre- cuentemente para conseguir este papel
13
equivocado. ¿Porqué es eso?
14| Capítulo 2: El Arquitecto evolutiva
Nuestra industria es un joven. Esto es algo que parece que olvidamos, y sin embargo,
sólo han sido la creación de programas que se ejecutan en lo que reconocemos como
ordenadores de alrededor de 70 años. Por lo tanto, estamos constantemente buscando
a otras profesiones en un intento de explicar lo que hacemos. No somos médicos o
ingenieros, pero ni somos fontaneros o electricistas. En su lugar, se cae en un término
medio, lo que hace que sea difícil para que la sociedad nos entienden, o para nosotros
comprender dónde encajamos.
Así que tomamos prestada de otras profesiones. Nos llamamos “ingenieros de
software”, o “arquitectos”. Pero no estamos, ¿verdad? Arquitectos e ingenieros tienen
un rigor y la disci- plina que sólo podían soñar, y su importancia en la sociedad se
entiende bien. Recuerdo hablar con un amigo mío, el día antes de convertirse en un
arquitecto cualificado. “Mañana,” dijo, “si me dará consejos en el pub acerca de
cómo construir algu- cosa y que está mal, consigo rendir cuentas. Podría ser
demandado, al igual que en los ojos de la ley ahora soy un arquitecto cualificado y
que debería ser considerado responsable si se equivocan.”La importancia de estos
puestos de trabajo a la sociedad significa que las cualificaciones que debe sonas PLE
tienen que cumplir . En el Reino Unido, por ejemplo, se requiere un mínimo de siete
años de estudio antes de que pueda ser llamado un arquitecto. Sin embargo, estos
trabajos también se basan en un conjunto de conocimientos que se remonta miles de
años. ¿Y nosotros? No exactamente. ¿Cuál es la razón por la que ver la mayoría de
las formas de certificación de TI como sin valor, como se sabe muy poco acerca de lo
que parecen las buenas.
Una parte de nosotros quiere reconocimiento, por lo que pedir prestado los nombres
de otras profesiones que ya cuentan con el reconocimiento como industria
anhelamos. Pero esto puede ser doblemente perjudicial. En primer lugar, implica que
sabemos lo que estamos haciendo, cuando claramente no lo hacemos. Yo no diría que
los edifi- cios y puentes no se caigan, sino que caerá mucho menor que el número de
veces que nuestros programas se colgará, haciendo comparaciones con los ingenieros
bastante injusto. Segundo, las analogías se descomponen muy rápidamente cuando se
les da incluso una mirada superficial. Para cambiar las cosas, si la construcción de
puentes eran como la programación, a medio camino a través encontraríamos que la
otra orilla era ahora 50 metros más lejos, que en realidad era de barro en lugar de
granito, y que en lugar de construir un puente peatonal que se construye en vez - ing
un puente de carretera.
Tal vez el término arquitecto ha hecho el mayor daño. La idea de que alguien que
redacte un plan detallado de otros a interpretar, y espera que esto se lleve a cabo. La
ance equili- parte del artista, ingeniero parte, supervisando la creación de lo que
normalmente es una visión lar singu-, con todos otros puntos de vista ser servil, salvo
la de vez en cuando del ingeniero estructural en relación con las leyes de la física. En
nuestra industria, esta visión del arquitecto lleva a algunas prácticas terribles.
Diagrama tras diagrama, página tras página de documentación, creada con el fin de
informar la construcción del sistema perfecto, sin tener en cuenta el futuro
fundamentalmente incognoscible. Que carece por completo de cualquier
15
comprensión en cuanto a lo difícil que será la aplicación, o
16| Capítulo 2: El Arquitecto evolutiva
si es o no realmente funciona, y mucho menos tener ninguna posibilidad de cambiar a
medida que aprendemos más.
Cuando nos comparamos con los ingenieros o arquitectos, corremos el riesgo de
hacer a todos un mal servicio. Por desgracia, estamos atascados con la palabra
arquitecto por ahora. Así que lo mejor que podemos hacer es redefinir lo que
significa en nuestro contexto.
Una visión evolutiva para el Arquitecto
Nuestros requisitos cambian más rápidamente que lo hacen para las personas que
diseñan y construyen edificios-al igual que las técnicas y herramientas a nuestra
disposición. Las cosas que creamos no son puntos fijos en el tiempo. Una vez puesto
en marcha en la producción, nuestro software continuará evolucionando a medida
que la forma en que se utiliza cambios. Para la mayoría de las cosas que creamos,
tenemos que aceptar que una vez que el software se pone en manos de nuestros
clientes tendremos que reaccionar y adaptarse, en lugar de ser un artefacto que nunca
cambia. Por lo tanto, nuestros arquitectos necesitan cambiar su forma de pensar fuera
de la creación del producto final perfecto, y en lugar de centrarse en ing ayuda- crear
un marco en el que los sistemas adecuados pueden surgir, y seguirá creciendo a
medida que aprendemos más.
Aunque he pasado gran parte del capítulo hasta el momento que le advierte de
comparar a nosotros mismos demasiado a otras profesiones, hay una analogía que me
gusta cuando se trata de la función del arquitecto de TI y que creo que mejor resume
lo que queremos que este papel que sea. Erik Doernenburg primero compartió
conmigo la idea de que debemos pensar en nuestro papel más como urbanistas que
los arquitectos para el entorno construido. El papel del planificador de la ciudad debe
ser familiar para cualquiera de ustedes que han jugado antes SimCity. El papel de un
planificador de la ciudad es mirar a una multitud de fuentes de información, y luego
tratar de optimizar el diseño de una ciudad para adaptarse mejor a las necesidades de
los ciudadanos de hoy, teniendo en cuenta su uso futuro. La forma en que influye en
cómo evoluciona la ciudad, sin embargo, es interesante. No dice, “construir este
edificio específico allí”; en cambio, las zonas de una ciudad. Así como en SimCity,
es posible designar parte de su ciudad como una zona industrial, y otra parte como
una zona residencial. Le corresponde entonces a otras personas para decidir qué
edificios se crean exacta, pero hay restricciones: si usted quiere construir una fábrica,
que tendrá que ser en una zona industrial. En lugar de preocuparse demasiado acerca
de lo que ocurre en una zona, el planificador de la ciudad en su lugar pasar mucho
más tiempo de trabajo cómo per- sonas y las utilidades se mueven de una zona a otra.
Más de una persona ha comparado una ciudad a un ser vivo. La ciudad cambia con el
tiempo. Se cambia y evoluciona a medida que sus ocupantes utilizan de diferentes
maneras, o como fuerzas externas a darle forma. El urbanista hace todo lo posible
para anticipar estos cambios, pero acepta que tratar de ejercer un control directo
sobre todos los aspectos de lo que sucede es inútil.
Una visión evolutiva para el arquitecto | 15
La comparación con el software debería ser obvia. A medida que nuestros usuarios
utilizan nuestro software, tenemos que reaccionar y cambio. No podemos prever todo
lo que va a pasar, y así en lugar de plan para cualquier eventualidad, hay que
planificar para permitir el cambio evitando
16| Capítulo 2: El Arquitecto evolutiva
el impulso de overspecify hasta la última cosa. Nuestra ciudad-del-sistema tiene que
ser un buen lugar, feliz para todos los que lo utiliza. Una cosa que la gente suele
olvidar es que nuestro sistema no se limita a dar cabida a los usuarios; También tiene
capacidad para desarrolladores y opera- ciones personas que también tienen que
trabajar allí, y que tienen el trabajo de asegurarse de que puede cambiar según sea
necesario. Para tomar prestado un término de Frank Buschmann, arquitectos tienen el
deber de asegurar que el sistema es habitable para los desarrolladores también.
Un planificador de la ciudad, al igual que un arquitecto, también necesita saber
cuando no se está siguiendo su plan. Ya que es menos prescriptivo, el número de
veces que tiene que involucrarse para corregir dirección debe ser mínima, pero si
alguien decide construir una planta de aguas residuales en una zona residencial, tiene
que ser capaz de apagarlo.
Así como nuestros arquitectos urbanistas necesitan para fijar la dirección a grandes
rasgos, y sólo involucrarse en ser altamente específica sobre detalle de
implementación en casos limitados. Tienen que asegurar que el sistema es adecuado
para el propósito, pero también una plataforma para el futuro. Y que necesitan para
asegurarse de que es un sistema que hace que los usuarios y desarrolladores
igualmente feliz. Esto suena como una orden muy alto. ¿Donde empezamos?
zonificación
Así que, para continuar con la metáfora del arquitecto como planificador de la ciudad
por un momento, ¿cuáles son las zonas? Estos son nuestros límites de servicio, o tal
vez los grupos de grano grueso de los servicios. Como arquitectos, tenemos que
preocuparnos mucho menos de lo que sucede dentro de la zona de lo que sucede
entre las zonas. Eso significa que necesitamos para pasar el tiempo promueva su
acerca de cómo nuestros servicios de hablar unos con otros, o asegurar que podemos
moni- tor adecuadamente la salud general de nuestro sistema. ¿Qué tan involucrado
tenemos dentro de la zona puede variar un poco. Muchas organizaciones han
adoptado microservicios con el fin de maximizar la autonomía de los equipos, algo
que va a expandir en enCapítulo 10. Si se encuentra en dicha organización, se basan
más en el equipo para tomar la decisión derecha local.
Sin embargo, entre las zonas o las cajas en nuestro diagrama de la arquitectura
tradicional, tenemos que tener cuidado; hacer las cosas mal aquí conduce a todo tipo
de problemas y puede ser muy difícil de corregir.
Dentro de cada servicio, puede estar bien con el equipo que posee esa zona de la
selección de un conjunto de tecnología rentes o los datos dife- tienda. Otras
preocupaciones pueden entran en juego aquí, por supuesto. Su inclinación a dejar que
los equipos de recoger la herramienta adecuada para el trabajo puede ser atemperada
por el hecho de que se hace más difícil contratar a personas o moverlos entre los
equipos si tiene 10 pilas de tecnología diferente a apoyar. Del mismo modo, si cada
equipo elige un completamente dife- rentes de almacenamiento de datos, usted puede
Una visión evolutiva para el arquitecto | 17
encontrarse que carecen de experiencia suficiente para ejecutar cualquiera de ellos a
escala. Netflix, por ejemplo, ha estandarizado sobre todo en Cassandra como una
tecnología de almacenamiento de datos. Aunque puede no ser la mejor opción para
todos sus casos, Netflix siente que el valor obtenido mediante la construcción de
herramientas y experiencia en torno a Cassandra es más importante que tener que
soportar y operar a escala de múltiples otras plataformas que pueden ser una
18| Capítulo 2: El Arquitecto evolutiva
mejor ajuste para ciertas tareas. Netflix es un ejemplo extremo, donde es probable
que el factor primordial escala más fuerte, pero se entiende la idea.
Entre los servicios es donde las cosas pueden causar problemas, sin embargo. Si un
servicio decide exponer a través de HTTP REST, otro hace uso de búferes de
protocolo, y un tercero utiliza Java RMI, a continuación, la integración puede
convertirse en una pesadilla, ya que consumen los servicios tienen que Deben
conocerse y soportar múltiples estilos de intercambio. Esto es por lo que trate de
cumplir con la directriz que debemos “estar preocupado por lo que sucede entre las
cajas, y ser liberal en lo que sucede en su interior.”
El arquitecto
Codificación
Si hemos de asegurar que los sistemas que creamos son habitables para nuestros
desarrolladores, a continuación, nuestros arquitectos necesitan entender el impacto de
sus decisiones. Al menos, esto significa pasar tiempo con el equipo, y lo ideal es que
debe significar que estos desarrolladores en realidad pasan el tiempo de codificación
con el equipo también. Para aquellos de ustedes que practican par programa- ción, se
convierte en una cuestión simple para un arquitecto para unirse a un equipo durante
un corto período como uno de los miembros de la pareja. Idealmente, usted debe
trabajar en historias normales, para comprender realmente lo normal de trabajo es
similar. No puedo enfatizar lo importante que es para el arquitecto para sentarse en
realidad con el equipo! Esto es significativamente más eficaz que el que tiene una
llamada o simplemente mirando a su código.
En cuanto a la frecuencia con que debe hacer esto, eso depende en gran medida del
tamaño del equipo (s) que está trabajando. Pero la clave es que debe ser una actividad
rutinaria. Si está trabajando con cuatro equipos, por ejemplo, pasar medio día con
cada equipo cada cuatro semanas asegura a construir una conciencia y una mejor
comunicación con los equipos con los que trabaja.
Un enfoque de principios
Las reglas son para la obediencia de los tontos y de la orientación de los magos.
-Generalmente atribuido a Douglas Bader
La toma de decisiones en el diseño del sistema es todo acerca de las compensaciones,
y microService arquitecturas nos dan un montón de ventajas y desventajas de hacer!
Al escoger un almacén de datos, podemos recoger una plataforma que tenemos
menos experiencia con, pero eso nos da una mejor escala? ¿Está bien para nosotros
contar con dos pilas de tecnología diferentes en nuestro sistema? ¿Qué hay de tres?
Algunos las decisiones se pueden hacer por completo sobre el terreno con la
información disponible para nosotros, y estos son los más fáciles de hacer. Pero ¿qué
pasa con esas decisiones que podrían tener que hacerse en información incompleta?
Enmarcando aquí puede ayudar, y una gran manera de ayudar a enmarcar nuestra
toma de decisiones es definir un conjunto de principios y prácticas que la guían, en
base a los objetivos que estamos tratando de lograr. Veamos cada uno de ellos.
Un enfoque de principios |
17
Metas estratégicas
El papel del arquitecto ya está lo suficientemente desalentador, así que
afortunadamente no suelen tener también definir objetivos estratégicos! objetivos
estratégicos deben hablar a dónde va su empresa, y cómo se ve a sí mismo como el
mejor hacer felices a sus clientes. Estos serán los objetivos de alto nivel, y pueden no
incluir la tecnología en absoluto. Podrían definirse en un nivel com- pañía o un nivel
de división. Podrían ser cosas como “expandirse en el sudeste de Asia para abrir
nuevos mercados”, o “dejar que el cliente a lograr lo más posible el uso de autoservicio.” La clave es que aquí es donde se dirige su organización, por lo que necesita
para asegurarse la tecnología está alineado a la misma.
Si usted es la persona que define la visión técnica de la empresa, esto puede
significar que tendrá que pasar más tiempo con las partes no técnicos de su
organización (o el negocio, ya que a menudo se llaman). ¿Cuál es la visión de
conducción para el negocio? Y ¿cómo cambia?
principios
Los principios son normas que ha realizado con el fin de alinear lo que está haciendo
para algún objetivo más grande, y a veces cambiar. Por ejemplo, si uno de sus
objetivos estratégicos como organización es disminuir el tiempo de salida al mercado
de nuevas características, es posible definir un principio que dice que los equipos de
entrega tienen un control total sobre el ciclo de vida de su soft- ware para enviar
siempre que estén listos , independientemente de cualquier otro equipo. Si otro
objetivo es que su organización se está moviendo a crecer agresivamente su oferta en
otros países, es posible que decide poner en práctica un principio de que todo el
sistema debe ser portátil para permitir que se despliegue a nivel local con el fin de
respetar la soberanía de los datos.
Es probable que no quiere un montón de éstos. Menos del 10 es un buen número de
pequeñas suficiente como para que la gente puede recordar, o para caber en pequeños
carteles. Los ples más cipios que tienen, mayor es la probabilidad de que se
superponen o se contradicen entre sí.
Heroku de 12 Factores son un conjunto de principios de diseño estructurado en torno
a la meta de ayuda- ing crear aplicaciones que funcionan bien en la plataforma
Heroku. También pueden muy bien tener sentido en otros contextos. Algunos de los
principios son en realidad las restricciones basadas en los comportamientos de su
aplicación necesita para exhibir el fin de trabajar en Heroku. Una restricción es
realmente algo que es muy difícil (o prácticamente imposible) para cambiar, mientras
que los principios son cosas que decide elegir. Usted puede decidir llamar
explícitamente a cabo las cosas que son principios frente a los que son limitaciones, a
ayudar a indicar aquellas cosas que realmente no se puede cambiar. En lo personal,
creo que no puede haber algún valor en mantenerlos en la misma lista para animar a
las limitaciones difíciles de vez en cuando y ver si realmente son inamovibles!
18| Capítulo 2: El Arquitecto evolutiva
prácticas
Nuestras prácticas son cómo nos aseguramos de nuestros principios se están llevando
a cabo. Son un conjunto de orientación detallada y práctica para la realización de
tareas. Ellos serán a menudo Tecnología en específico, y debe ser lo suficientemente
bajo nivel que cualquier desarrollador puede entenderlos. Prácticas podrían incluir
pautas de codificación, el hecho de que todos los datos de registro tiene que ser CAPTured centralmente, o que HTTP / REST es el estilo estándar de integración. Debido
a su naturaleza técnica, las prácticas suelen cambiar más a menudo que los
principios.
Al igual que con los principios, a veces reflejan las limitaciones prácticas en su
organización. Por ejemplo, si sólo son compatibles con CentOS, esto tendrá que
reflejarse en sus prácticas.
Prácticas debe servir de base a nuestros principios. Un principio que indica que los
equipos de entrega de con- trol del ciclo de vida completo de sus sistemas puede
significar que tiene una práctica que indica que todos los servicios se implementan en
las cuentas de AWS aislados, proporcionando la gestión de auto-servicio de los
recursos y el aislamiento de otros equipos.
Combinando Principios y Prácticas
principios de una persona son las prácticas de los demás. Es posible que decida
llamar el uso de HTTP / descansar un principio más que una práctica, por ejemplo. Y
que iba a estar bien. El punto clave es que hay valor en tener ideas generales que
guían la forma en que evoluciona el sistema, y en tener el suficiente detalle para que
la gente sepa cómo poner en práctica esas ideas. Para un grupo lo suficientemente
pequeño, tal vez un solo equipo, combinando los principios y prácticas podrían estar
bien. Sin embargo, para las grandes organizaciones, donde la tecnología y las
prácticas de trabajo pueden ser diferentes, es posible que desee un conjunto diferente
de prácticas en diferentes lugares, siempre y cuando los dos se asignan a un conjunto
común de principios. Un equipo .NET, por ejemplo, podría tener un conjunto de
prácticas, y un equipo de Java otra, con un conjunto de prácticas comunes a ambos.
Los principios, sin embargo, podría ser el mismo para ambos.
Un ejemplo del mundo real
Mi colega Evan Bottcher desarrolló el diagrama mostrado en la Figura 2-1 en el
curso de trabajar con uno de nuestros clientes. La figura muestra la interacción de los
objetivos, principios y prácticas en un formato muy claro. En el transcurso de un par
de años, las prácticas de la extrema derecha va a cambiar con bastante regularidad,
mientras que los principios siguen siendo bastante estático. Un diagrama de este tipo
se puede imprimir bien en una sola hoja de papel y compartida, y cada idea es
bastante simple para el desarrollador promedio para recordar. Hay, por supuesto, con
más detalle detrás de cada punto aquí, pero ser capaz de articular esta en forma resuUn enfoque de principios |
19
men es muy útil.
20| Capítulo 2: El Arquitecto evolutiva
La Figura 2-1. Un ejemplo del mundo real de los principios y prácticas
Eso tiene sentido tener documentación de apoyo algunos de estos artículos. En
general, sin embargo, me gusta la idea de tener código de ejemplo que se puede
ver, inspeccionar y ejecutar, que encarna estas ideas. Aún mejor, podemos crear
herramientas que hace lo correcto fuera de la caja. Discutiremos eso con mayor
profundidad momentáneamente.
El nivel requerido
Cuando se trabaja a través de sus prácticas y pensando en las ventajas y desventajas
que hay que hacer, uno de los resultados básicos se encuentran a la cantidad de
variabilidad para permitir en su sistema. Una de las claves para identificar lo que
debe ser constante de servicio a servicio es definir lo que es un buen
comportamiento, buen servicio se parece. ¿Qué es un servicio de “buena Zen ciuda-”
en su sistema? ¿Qué capacidades Qué hay que tener para asegurarse de que su
sistema es manejable y que un mal servicio no hacer caer todo el sistema? Y, como
con las personas, lo que es un buen ciudadano en un contexto no refleja lo que parece
en otro lugar. Sin embargo, hay algunas caracterís- ticas comunes de los servicios de
buen comportamiento que creo que son bastante importante a observar. Estas son las
pocas áreas clave en las que permiten demasiada divergencia puede resultar en un
tiempo bastante tórrida.
Un enfoque de principios |
21
autonomía del individuo microService sin perder de vista el panorama general.
Definición de los atributos claro que cada servicio debe tener es una forma de ser
clara en cuanto a dónde se encuentra ese equilibrio.
Vigilancia
Eso Es esencial que seamos capaces de elaborar coherentes vistas, cruz de servicio de
nuestra salud del sistema. Esto tiene que ser una visión de todo el sistema, no un
punto de vista específico del servicio. Como veremos enCapítulo 8, Sabiendo que la
salud de un servicio individual es útil, pero a menudo sólo cuando se está tratando de
diagnosticar un problema más amplio o entender una tendencia más amplia. Para que
esto sea lo más fácil posible, sugeriría asegurar que todos los servicios de salud y
emiten las métricas generales derivadas del seguimiento de la misma manera.
Tú podrían optar por adoptar un mecanismo de empuje, donde cada servicio tiene que
empujar estos datos en una ubicación central. Por sus métricas de esto podría ser
grafito, y para su salud podría ser Nagios. O es posible que decida utilizar sistemas
de votación que raspan los datos de los propios nodos. Pero lo que usted elija, intenta
mantenerlo estandarizada. Hacer que la tecnología dentro de la caja opaca, y no
requieren que su monitoreo sis- tems cambio con el fin de apoyar la misma. Tala cae
en la misma categoría aquí: lo necesitamos en un solo lugar.
Interfaces
Escoger un pequeño número de tecnologías de interfaz definidos ayuda a integrar
nuevos con- sumidores. Tener un estándar es un buen número. Dos no es tan malo,
tampoco. Tener 20 estilos diferentes de integración es malo. Esto no es sólo acerca
de escoger la tecnología y el protocolo. Si usted escoge HTTP / REST, por ejemplo,
va a utilizar verbos o sustantivos? Cómo va a manejar la paginación de los recursos?
Cómo va a manejar versiones de los puntos finales?
Seguridad arquitectónica
Nosotros no puede permitirse el lujo de un servicio mal comportamiento de arruinar la
fiesta para todo el mundo. Tenemos que asegurarnos de que nuestros servicios se
escudan consecuencia de las llamadas riachuelo no saludable, Down-. Cuantos más
servicios que tenemos que no maneja adecuadamente el potencial Ure fail de las
llamadas aguas abajo, los más frágiles nuestros sistemas serán. Esto indica que
probablemente tendrá que autorice como mínimo que cada servicio de aguas abajo
tiene su propio conjunto de conexiones, e incluso se puede ir tan lejos como para
decir que cada uno también utiliza un interruptor de circuito. Esta quede cubierta con
mayor profundidad cuando discutimos microservicios a escala deCapítulo 11.
Las reglas del juego es importante cuando se trata de códigos de respuesta, también.
Si su disyuntores se basan en códigos HTTP, y un servicio decide enviar de vuelta
los códigos 2XX de errores, o confunde los códigos 4XX con códigos 5XX, a
continuación, estas medidas de seguridad pueden desmoronarse. Preocupaciones
22| Capítulo 2: El Arquitecto evolutiva
similares se aplicarían incluso si usted no está utilizando HTTP; conocer la dife-
El nivel requerido | 21
ferencia entre una solicitud de que estaba bien y procesado correctamente, una
petición que era malo y por lo tanto impide el servicio de hacer cualquier cosa con
ella, y una petición que podría estar bien, pero no podemos decir que el servidor
estaba abajo es clave para asegurar que puede fallar rápido y rastrear problemas. Si
nuestros servicios jugar rápido y libremente con estas normas, nos encontramos con
un sistema más vulnerable.
A través de la gobernabilidad Código
Reunirse y ponerse de acuerdo sobre cómo pueden hacerse las cosas es una buena
idea. Pero spend- ing tiempo de asegurar que las personas están siguiendo estas
directrices es menos divertido, como se supone una carga para los desarrolladores
implementar todas estas cosas normales que se pueden esperar de cada servicio que
debe hacer. Soy un gran creyente en lo que es fácil hacer lo correcto. Dos técnicas
que he visto el trabajo bien aquí están utilizando ejemplos y proporcionando
plantillas de servicio.
ejemplares
Escrito documentación es buena y útil. Veo claramente el valor; Después de todo,
he POR ESCRITO este libro. Sin embargo, los desarrolladores también les gusta
código y el código que puedan correr y explorar. Si usted tiene un conjunto de
normas o prácticas óptimas que le gustaría animar a continuación, tienen
ejemplares que se pueden señalar a la gente es útil. La idea es que la gente no
puede ir muy mal acaba imitando algunas de las mejores partes de su sistema.
Idealmente, estos deben ser los servicios del mundo real que tiene y que sale bien, en
lugar de los servicios aislados que solo se implementan para ser ejemplos perfectos.
Al garantizar que se están utilizando realmente sus ejemplares, se asegura de que
todos los principios que realmente han sentido.
Plantilla medida Servicio
¿No sería estupendo si pudiera hacer que sea muy fácil para todos los desarrolladores
a seguir la mayor parte de las directrices que tiene con muy poco trabajo? ¿Qué pasa
si, fuera de la caja, el ERS desarrollos tuvieron la mayor parte del código en lugar de
implementar el núcleo atributos que las necesidades de cada servicio?
Dropwizard y karyon son dos microrrecipientes fuente abierto, basado en JVM. Ellos
funcionan de manera similar, integrando una serie de bibliotecas para proporcionar
funciones como la comprobación de estado, sirviendo HTTP, o exponer las métricas.
Por lo tanto, fuera de la caja, que tiene un servicio completo con un contenedor de
servlets incrustado que puede ser lanzado desde la línea de Mand com-. Esta es una
gran manera de ponerse en marcha, pero ¿por qué detenerse allí? Mientras estás en
ello, por qué no hacer algo así como un Dropwizard o Karyon, y añadir más
características para que sea compatible para su contexto?
22| Capítulo 2: El Arquitecto evolutiva
Por ejemplo, es posible que desee ordenar el uso de los interruptores. En ese caso, es
posible integrar una biblioteca como disyuntorhystrix. O es posible que tenga una
práctica que deben ser enviados a un servidor central de grafito todas sus métricas, lo
que tal vez tire en una
A través de la gobernabilidad
Código | 23
biblioteca de código abierto como Dropwizard de Métrica y configurarlo para que,
fuera de la caja, los tiempos de respuesta y las tasas de error se envían
automáticamente a una ubicación conocida.
Mediante la adaptación de una plantilla de dicho servicio para su propio conjunto de
prácticas de desarrollo, se asegura de que los equipos pueden ponerse en marcha más
rápido, y también que los desarrolladores tienen que salir de su manera de hacer que
sus servicios se portan mal.
Por supuesto, si usted abrazado múltiples pilas de tecnología dispares, que había
necesidad de una plantilla de servicio que iguala las de cada uno. Esto puede ser una
forma en que la restringirá sutilmente opciones de idioma en sus equipos, sin
embargo. Si la plantilla de servicio en la casa sólo es compatible con Java, entonces
las personas pueden ser disuadidos de recoger pilas alternativas si tienen que hacer
mucho más trabajo por sí mismos. Netflix, por ejemplo, se refiere especialmente a
aspectos como la tolerancia a fallos, para asegurar que la interrupción de una parte de
su sistema no puede tomar lo every- abajo. Para controlar esto, una gran cantidad de
trabajo se ha hecho para asegurar que no son bibliotecas de cliente en la JVM para
proporcionar equipos con las herramientas que necesitan para mantener sus servicios
de buen comportamiento. Cualquiera que la introducción de una nueva tecnología de
pila significaría tener que reproducir todo este esfuerzo. La principal preocupación
para Netflix es menos acerca de la duplicación de esfuerzos, y más sobre el hecho de
que es tan fácil de conseguir este mal. El riesgo de un servicio de conseguir la
tolerancia a fallos de reciente aplicación incorrecta es alta si se pudiera tener un
impacto mayor del sistema. Netflix mitiga mediante el uso de los servicios del coche
lateral, que se comunican a nivel local con una JVM que está utilizando las
bibliotecas apropiadas.
Tú tiene que tener cuidado de que la creación de la plantilla de servicio no se
convierta en el trabajo de un equipo de herramientas o la arquitectura central de
quien dicta cómo deben hacerse las cosas, aunque sea a través de código. La
definición de las prácticas que utilice deben ser una actividad colectiva, por lo que
idealmente su equipo (s) debe asumir la responsabilidad conjunta para la
actualización de esta plantilla (un enfoque de código abierto interno funciona bien
aquí).
También he visto a muchos moral y la productividad de un equipo destruido por
tener un manda- Ted marco de empuje sobre ellos. En un intento por mejorar la
reutilización de código, más y más trabajo se coloca en un marco centralizado hasta
que se convierte en un strosity MON abrumadora. Si decide utilizar una plantilla de
servicio a medida, pensar muy cuidadosamente acerca de lo que es su trabajo.
Idealmente, su uso debe ser puramente opcional, pero si usted va a ser más
contundente en su adopción es necesario comprender que la facilidad de uso para los
desarrollos ERS ha de ser una fuerza primordial de guía.
También ser conscientes de los peligros de código compartido. En nuestro deseo de
crear código reutilizable, podemos introducir fuentes de acoplamiento entre los
24| Capítulo 2: El Arquitecto evolutiva
servicios. Al menos una organización que habló es tan preocupado por esto que en
realidad copia su código de plantilla de servicio manualmente en cada servicio. Esto
significa que una actualización a la plantilla de servicio básico requiere más tiempo
para ser aplicado a través de su sistema, pero esto es menos preocupante para él que
el peligro de acoplamiento. Otros equipos que han hablado con simplemente han
tratado la plantilla de servicio como una dependencia binaria compartida, aunque
tienen que ser muy diligente en no dejar que la tendencia de DRY (no repita usted
mismo) resultará en un sistema demasiado junto! Este es un tema lleno de matices, lo
que vamos a explorar en mayor detalle en elCapítulo 4.
A través de la gobernabilidad
Código | 23
Deuda técnica
Nosotros a menudo se ponen en situaciones en las que no se puede seguir a través de
la carta en nuestra visión técnica. A menudo, tenemos que hacer una elección para
cortar algunas esquinas para obtener algunas características urgentes a cabo. Este es
sólo uno más disyuntiva que nos encontraremos tener que hacer. existe nuestra visión
técnica por una razón. Si nos desviamos de este motivo, podría tener un beneficio a
corto plazo, pero un coste a largo plazo. Un concepto que nos ayuda a comprender
esta disyuntiva es la deuda técnica. Cuando devenga la deuda técnica, al igual que la
deuda en el mundo real que tiene un costo en curso, y es algo que queremos pagar.
A veces la deuda técnica no es sólo algo que causamos al tomar atajos. ¿Qué pasa si
nuestra visión de los cambios en el sistema, pero no todos de nuestro sistema de
partidos? En esta situación, también, hemos creado nuevas fuentes de deuda técnica.
El trabajo del arquitecto es mirar el cuadro más grande, y comprender este equilibrio.
Hav- ing algún punto de vista en cuanto al nivel de la deuda, y dónde participar, es
importante. Dependiendo de su empresa, es posible que pueda proporcionar
orientación suave, pero tienen los equipos deciden por sí mismos cómo realizar el
seguimiento y pagar la deuda. Para otras organizaciones, es posible que tenga que ser
más estructurado, tal vez el mantenimiento de un registro de la deuda que se revisa
periódicamente.
Manejo de excepciones
Así que nuestros principios y prácticas guían cómo se deben construir nuestros
sistemas. Pero lo HAP plumas cuando nuestro sistema se desvía de esto? A veces
tomamos una decisión que es sólo una excepción a la regla. En estos casos, puede ser
que valga la captura de una decisión de este tipo en un registro en alguna parte para
referencia futura. Si se encuentran bastantes excepciones, puede eventu- aliado
sentido para cambiar el principio o en la práctica para reflejar una nueva
comprensión del mundo. Por ejemplo, podríamos tener una práctica que los estados
que siempre vamos a utilizar MySQL para el almacenamiento de datos. Pero
entonces vemos razones de peso para utilizar Cassandra para el almacenamiento
altamente escalable, momento en el que cambiamos nuestra práctica decir, “Use
MySQL para la mayoría de los requisitos de almacenamiento, a menos que se puede
esperar un gran crecimiento en los volúmenes, en cuyo caso el uso de Cassandra”.
Sus probablemente vale la pena reiterar, sin embargo, que cada organización es
diferente. He trabajado con algunas empresas en las que los equipos de desarrollo
tienen un alto grado de confianza y autonomía, y no los principios son ligeros (y la
necesidad de tratamiento de excepciones abierta se reduce en gran medida si no se
elimina). En organiza- ciones más estructuradas en las que los desarrolladores tienen
menos libertad, excepciones de rastreo pueden ser vitales para asegurar que las reglas
puestas en marcha reflejan adecuadamente los retos que se enfrentan las personas.
Con todo lo dicho, soy un fan de microservicios como una forma de optimizar la
26| Capítulo 2: El Arquitecto evolutiva
autonomía de los equipos, dándoles tanta libertad como sea posible para resolver el
problema en cuestión. Si está trabajando en una organización que coloca un montón
de restricciones sobre cómo los desarrolladores pueden hacer su trabajo, entonces
microservicios no puede ser para usted.
A través de la gobernabilidad
Código | 23
Gobernabilidad y va desde el Centro
Parte de lo que los arquitectos tienen que manejar es la gobernabilidad. ¿Qué quiero
decir por el gobierno? Resulta que los Objetivos de Control para la Información y
Tecnología Relacionada (COBIT) tiene una definición bastante buena:
Gobernabilidad se asegura de que la empresa objetivos se logran mediante la
evaluación de las partes interesadas necesidades, condiciones y opciones; establecer
la dirección a través de establecimiento de prioridades y la toma de decisiones; y
monitorear el desempeño, el cumplimiento y el progreso contra la dirección y
objetivos acordados en.
-COBIT 5
Gobernabilidad puede aplicar a varias cosas en el foro de TI. Queremos centrarnos en
el aspecto de la gestión técnica, algo que siento es el trabajo del arquitecto. Si uno de
los puestos de trabajo del arquitecto es asegurar que hay una visión técnica, a
continuación, la gobernabilidad se trata de garantizar lo que estamos construyendo
partidos esta visión, y la evolución de la visión si es necesario.
Los arquitectos son responsables de una gran cantidad de cosas. Tienen que asegurar
que haya un conjunto de principios que pueden guiar el desarrollo, y que estos
principios que coincida con la estrategia de la organiza- ción. Tienen que asegurarse
así de que estos principios no requieren prácticas que hacen los desarrolladores
miserables de trabajo. Que necesitan para mantenerse al día con las nuevas
tecnologías, y saber cuándo hacer las correctas soluciones de compromiso. Se trata
de una gran cantidad de responsabilidad. Todo eso, y ellos también tienen que llevar
a la gente con ellos, es decir, para garantizar que los colegas que están trabajando a
entender las decisiones que se toman y se traen a llevarlas a cabo. Ah, y como ya
hemos mencionado: que necesitan para pasar algún tiempo con los equipos de
entender el impacto de sus decisiones, y tal vez incluso el código también.
¿Una orden grande? Absolutamente. Pero yo soy de la firme opinión de que no deben
hacer esto solo. Un grupo de gobierno que funcione adecuadamente pueden trabajar
juntos para compartir el trabajo y dar forma a la visión.
Normalmente, gobierno es una actividad de grupo. Podría ser una charla informal con
un equipo lo suficientemente pequeño, o una reunión regular más estructurada con
membresía formal de grupo para un mayor alcance. Aquí es donde creo que los
principios que cubrimos anteriormente deben discutirse y modificarse según sea
necesario. Este grupo necesita ser dirigido por un técnico, y se compone
fundamentalmente de personas que están ejecutando el trabajo que se rige. Este
grupo también debe ser responsable para el seguimiento de la gestión de riesgos y
técnicas.
Un modelo Favorezco en gran medida está teniendo la silla arquitecto del grupo, pero
que tiene la mayor parte del grupo dibujado a partir de los tecnólogos de cada entrega
de equipo los cables de cada equipo en un mínimo. El arquitecto es responsable de
asegurarse de que funciona el grupo, pero el grupo en su conjunto es responsable de
26 | Capítulo 2: El Arquitecto evolutiva
la gestión pública. Esta comparte la carga, y asegura que hay un mayor nivel de
aceptación. También asegura que la información fluye libremente de los equipos en
el grupo, y como resultado, la toma de decisiones es mucho más sensato e informado.
Gobernabilidad y va desde el Centro | 25
A veces, el grupo puede tomar decisiones con las que no está de acuerdo el
arquitecto. En este punto, ¿cuál es el arquitecto que hacer? Después de haber estado
en esta posición antes, te puedo decir que esta es una de las situaciones más difíciles
de enfrentar. A menudo, tomo el enfoque que debería ir con la decisión del grupo.
Considero que he hecho todo lo posible para convencer a la gente, pero en última
instancia no estaba lo suficientemente convincente. El grupo es a menudo mucho más
sabia que el individuo, y he ha equivocado más de una vez! E imaginar cómo
debilitante que puede ser para un grupo que se ha dado espacio para llegar a una
deci- sión, y en última instancia ser ignorado. Pero a veces me he anulado el grupo.
Pero ¿por qué, y cuándo? ¿Cómo elegir las líneas?
Piense en enseñar a los niños a montar en bicicleta. No se puede andar por ellos. Si se
les mira bamboleo, pero si intervino cada vez que parecía que podrían caerse,
entonces nunca iba a aprender, y en todo caso de que se caigan mucho menos de lo
que lo harán! Pero si los ves a punto de virar hacia el tráfico, o en un estanque de
patos cerca, entonces usted tiene que intervenir. Del mismo modo, como arquitecto,
es necesario tener una firme comprensión de que, en sentido figurado, su equipo está
dirigiendo en un pato estanque. También es necesario tener en cuenta que incluso si
usted sabe que está a la derecha y hacer caso omiso del equipo, esto puede minar su
posición y también hacer que el equipo sienten que no tienen voz. A veces lo
correcto es ir junto con una decisión que no está de acuerdo con. Saber cuándo
hacerlo y cuándo no es difícil, pero a veces es vital.
La construcción de un equipo
Siendo el principal punto de responsable de la visión técnica de su sistema y asegurar
que se está ejecutando en esta visión no se trata sólo de hacer que la tecnología decisiones. Es la gente que trabaja con los que va a hacer el trabajo. Gran parte del papel
del líder técnico se trata de ayudar al crecimiento de ellos, para ayudarles a entender
la visión a sí mismos, y también asegurando que puedan participar activamente en la
elaboración y aplicación de la visión también.
Ayudar a las personas a su alrededor en su propio crecimiento profesional puede
tomar muchas formas, la mayoría de los cuales están fuera del alcance de este libro.
Hay un aspecto, sin embargo, donde una arquitectura microService es especialmente
relevante. Con los sistemas más grandes, monolíticos, hay menos oportunidades para
la gente para subir y poseer algo. Con los servicios de micro, por otro lado, tenemos
múltiples bases de código autónomas que tendrán sus propios ciclos de vida
independientes. Ayudar a las personas incrementen haciendo que toman buque
propietario- de los servicios individuales antes de aceptar más responsabilidad puede
ser una gran manera de ayudar a alcanzar sus propios objetivos de carrera, y al
mismo tiempo aligera la carga en el que está a cargo!
Soy una firme creyente de que un gran software proviene de grandes personas. Si
usted se preocupa sólo por el lado de la tecnología de la ecuación, que se está
perdiendo mucho más de la mitad de la imagen.
26 | Capítulo 2: El Arquitecto evolutiva
Resumen
Para resumir este capítulo, he aquí lo que veo como las principales responsabilidades
del arquitecto lutionary evo-:
Visión
Asegúrese de que haya una visión técnica comunicado claramente para el sistema
que ayudará a su sistema cumple con los requisitos de sus clientes y la
organización
Empatía
Comprender el impacto de sus decisiones en sus clientes y colegas
Colaboración
Comprometerse con mayor número de sus compañeros y colegas como sea
posible para ayudar a definir, refinar, y ejecutar la visión
Adaptabilidad
Asegúrese de que la visión técnica cambia a medida que sus clientes u
organización lo requiere
Autonomía
Encontrar el equilibrio adecuado entre la estandarización y permitir la autonomía
para sus equipos
Gobernancia
Asegúrese de que el sistema que está siendo implementado ajusta a la visión técnica
El arquitecto evolutiva es aquel que entiende que quitar de esta hazaña es un acto de
equilibrio cons- tante. Las fuerzas están siempre empujando una manera u otra, y la
comprensión de dónde hacer retroceder ni a dónde ir con el flujo es a menudo algo
que sólo se logra con la experiencia. Pero la peor reacción a todas estas fuerzas que
nos empujan hacia el cambio es llegar a ser más rígido o fijo en nuestro pensamiento.
Aunque gran parte de los consejos de este capítulo se puede aplicar a cualquier
arquitecto de sistemas, servicios de micro nos dan muchas más decisiones que tomar.
Por lo tanto, estar en mejores condiciones para equilibrar todas estas compensaciones
es esencial.
En el siguiente capítulo, vamos a tomar algo de nuestra nueva conciencia del papel
del arquitecto con nosotros a medida que empezamos a pensar acerca de cómo
encontrar los límites adecuados para nuestros microservicios.
resumen | 27
CAPÍTULO 3
Cómo al modelo de servicios
el razonamiento de mi oponente Me recuerda a los paganos, que, le pide en lo que se puso el
mundo, respondió: “En una tortuga.” Pero en lo que significan las siglas la tortuga? “En
otra tortuga.”
-Joseph Barker (1854)
Así que ya sabes lo que son microservicios, y es de esperar tener un sentido de sus
principales ventajas. Probablemente usted está ansioso por ir ahora y empezar a hacer
ellos, ¿verdad? Pero por dónde empezar? En este capítulo, vamos a ver cómo pensar
acerca de los límites de sus microservicios que se espera maximizar los aspectos
positivos y evitar algunas de las desventajas potenciales. Pero primero, necesitamos
algo con que trabajar.
La introducción de MusicCorp
Libros sobre ideas funcionan mejor con ejemplos. Siempre que sea posible, voy a
compartir historias de situaciones del mundo real, pero he encontrado que es también
útil disponer de un dominio ficticio con el que trabajar. A lo largo del libro, que
volveremos a este dominio, viendo cómo el concepto de microservicios funciona
dentro de este mundo.
Así que vamos a centrar nuestra atención a la vanguardia en línea minorista
MusicCorp. MusicCorp fue recientemente una tienda de ladrillo y mortero, pero
después de la parte inferior se retiró de la industria del disco de gramófono se
centró cada vez más de sus esfuerzos en línea. La compañía tiene un sitio web,
pero siente que ahora es el momento de doblar hacia abajo en el mundo en línea.
Después de todo, los iPods son sólo una moda pasajera (Zunes son mucho mejor,
obviamente) y aficionados a la música son muy felices de esperar a los CD para
llegar a sus puertas. Calidad sobre la conveniencia, ¿verdad? Y ya que estamos
en ello, ¿qué es este Spotify sigue hablando-algún tipo de tratamiento de la piel
para los adolescentes?
29
A pesar de ser un poco detrás de la curva, MusicCorp tiene grandes ambiciones. Por
suerte, se ha decidido que su mejor oportunidad de tomar el mundo es asegurándose
de que puede hacer cambios tan fácilmente como sea posible. Microservicios para la
victoria!
30| Capítulo 3: Cómo modelo de
servicios
Lo que hace un buen servicio?
Antes de que el equipo de MusicCorp arranca en la distancia, la creación de un
servicio después de servicio en un intento de entregar las cintas de ocho pistas a todo
el mundo, vamos a poner el freno y hablar un poco acerca de la idea subyacente más
importante que necesitamos para mantener en mente. Lo que hace un buen servicio?
Si has sobrevivido a una implementación SOA fallado, es posible que tenga alguna
idea de dónde voy siguiente. Pero por si acaso usted no es que (des) nate Afortunada, quiero que se centra en dos conceptos clave: acoplamiento débil y una alta
cohesión. Hablaremos en detalle a lo largo del libro sobre otras ideas y prácticas,
pero son todo para nada si conseguimos estas dos cosas mal.
A pesar de que estos dos términos se utilizan mucho, sobre todo en el contexto de los
sistemas orientados a objetos, vale la pena discutir lo que significan en términos de
microservicios.
Bajo acoplamiento
Cuando los servicios están débilmente acoplados, un cambio a un servicio no debe
requerir un cambio a otro. El punto entero de un microService es ser capaz de hacer
un cambio a un servicio y desplegarlo, sin necesidad de cambiar ninguna otra parte
del sistema. Esto es realmente muy importante.
¿Qué tipo de cosas causan estrecho acoplamiento? Un error clásico es elegir un estilo
de integración que se une fuertemente un servicio a otro, provocando cambios dentro
del servicio a requerir un cambio a los consumidores. Vamos a discutir la forma de
evitar esto con más profundidad enCapítulo 4.
Un servicio débilmente acoplado sabe tan poco como necesita acerca de los servicios
con los que colabora. Esto también significa que probablemente desee limitar el
número de diferentes tipos de llamadas de un servicio a otro, porque más allá del
potencial pro- blema de rendimiento, comunicación hablador puede conducir a un
acoplamiento apretado.
alta cohesión
Nosotros desee el comportamiento relacionado para sentarse juntos, y el
comportamiento relacionado a sentarse en otro lugar. ¿Por qué? Bueno, si queremos
cambiar el comportamiento, queremos ser capaces de cambiar en un solo lugar, y
liberar ese cambio tan pronto como sea posible. Si tenemos que cambiar ese
comportamiento en muchos lugares diferentes, vamos a tener que soltar un montón
de diferentes servicios (tal vez al mismo tiempo) para entregar ese cambio. Hacer
cambios en muchos lugares diferentes es más lento, y el despliegue de una gran
cantidad de servicios a la vez es arriesgado, tanto de los cuales queremos evitar.
Por lo que queremos encontrar los límites dentro de nuestro dominio del problema
que ayudan a asegurar que la conducta relacionada está en un lugar, y que se
31
comunican con otros límites tan libremente como sea posible.
32| Capítulo 3: Cómo modelo de
servicios
El contexto acotado
Driven Design-Domain libro de Eric Evans (Addison-Wesley) se centra en cómo
crear sistemas que los dominios del mundo real modelo. El libro está lleno de
grandes ideas como el uso del lenguaje en todas partes, las abstracciones del
repositorio, y similares, pero hay un concepto muy importante que introduce Evans
me pasó completamente por al primero: contexto acotado. La idea es que cualquier
dominio dado se compone de límites múltiples contextos, y que reside dentro de cada
uno son las cosas (Eric usa la palabra modelo mucho, lo que es probablemente la
BET-ter que las cosas) que no deben ser comunicadas exterior, así como cosas que se
comparten externamente con otros contextos delimitadas. Cada contexto delimitada
tiene una interfaz explícita, donde se decide qué modelos para compartir con otros
contextos.
Otra definición de contextos acotadas me gustan es “una responsabilidad específica
que se aplica por límites explícitos.” 1 Si desea información de un contexto limitado,
o si desea hacer peticiones de funcionalidad dentro de un contexto acotado, se
comunica con su límite explícita el uso de modelos. En su libro, Evans usa la
analogía de las células, donde “[c] pueden existir ells porque sus membranas definen
lo que está dentro y fuera y determinan lo que puede pasar.”
Vamos volver por un momento a la empresa MusicCorp. Nuestro dominio es todo el
Ness Busi- en el que estamos operando. Abarca todo, desde el almacén hasta el
mostrador de recep- ción, desde las finanzas a pedido. Podemos o no ser
representativos de todo eso en nuestro software, pero que, sin embargo el dominio en
el que estamos operando. Vamos a pensar en partes de ese dominio que se parecen a
los contextos acotadas que se refiere a Evans. En MusicCorp, nuestro almacén es un
hervidero de actividad órdenes-gestión de ser enviados a cabo (y el retorno impar), la
recepción de nuevas acciones, hacer carreras de carretillas elevadoras, y así
sucesivamente. En otra parte, el departamento de finanzas es quizás menos amante de
la diversión, pero todavía tiene una función muy importante dentro de nuestra
organización. Estos empleados a manejar la nómina, mantener las cuentas de la
empresa, y producen informes importantes. Un montón de informes.
Compartida y Modelos Ocultos
Para MusicCorp, podemos considerar el departamento financiero y el almacén para
ser acotadas dos contextos distintos. Ambos tienen una interfaz explícita al mundo
exterior (en términos de informes de inventario, recibos de pago, etc.), y tienen
detalles que sólo ellos necesitan saber acerca de (carretillas elevadoras, calculadoras).
Ahora el departamento de finanzas no necesita saber sobre el funcionamiento interno
detallado del depósito. Se necesita saber algunas cosas, aunque, por ejemplo que
necesita saber acerca de los niveles de existencias para mantener las cuentas al
día.Figura 3-1 muestra un ejemplo
El contexto acotado | 31
1 http://bit.ly/bounded-context-explained
32| Capítulo 3: Cómo modelo de
servicios
diagrama contextual. Vemos conceptos que son internos al almacén, como Selector
(PEO ples que recogen órdenes), estantes que representan lugares de valores, y así
sucesivamente. Del mismo modo, contabilidad general de la empresa es parte integral
de la financiación, pero no es compartida externamente aquí.
La Figura 3-1. Un modelo compartido entre el departamento financiero y el almacén
Para ser capaz de trabajar a cabo la valoración de la empresa, sin embargo, los
empleados financieros necesitan información acerca de las acciones que tenemos. El
artículo común se convierte entonces en un modelo compartido entre los dos
contextos. Sin embargo, tenga en cuenta que no es necesario exponer a ciegas todo lo
relacionado con el tema de valores del contexto almacén. Por ejemplo, aunque
internamente mantenemos un registro en un artículo común en cuanto a dónde debe
vivir dentro del alma- cén, que no necesita ser expuesta en el modelo compartido. Por
lo que no es el único de su tipo, interna, y la representación exterior exponemos. En
muchos sentidos, esto prefigura la discusión en torno a descansar enCapítulo 4.
A veces podemos encontrar los modelos con el mismo nombre que tienen
significados muy diferentes en diferentes contextos también. Por ejemplo, podríamos
tener el concepto de un retorno, lo que representa un cliente de enviar algo a cambio.
Dentro del contexto del cliente, una vuelta es todo sobre cómo imprimir una etiqueta
de envío, el envío de un paquete, ya la espera de un reembolso. Para el almacén, esto
podría representar un paquete que está a punto de llegar, y un artículo común que
necesita ser reabastecido. De ello se desprende que dentro del almacén almacenamos
información adicional asociada con el rendimiento que se refiere a las tareas que se
llevarán a cabo; por ejemplo, podemos generar una petición de volver a surtir. El
modelo compartido de la devolución se asocia con diferentes procesos y entidades
ING Soporte- dentro de cada contexto acotado, pero eso es en gran medida una
preocupación interna dentro del propio contexto.
El contexto acotado | 33
Módulos y Servicios
Al pensar con claridad acerca de lo que los modelos deben ser compartidos, y no
compartir nuestras representaciones internas, evitamos uno de los peligros
potenciales que pueden resultar en estrecho acoplamiento (lo contrario de lo que
queremos). También hemos identificado un límite dentro de nuestro dominio en el
que todas las capacidades de negocio afines deben vivir, que nos da la alta cohesión
que queremos. Estos contextos delimitadas, a continuación, se prestan muy bien a ser
los límites de composición.
Como ya comentamos en Capítulo 1, Tenemos la opción de utilizar los módulos
dentro de un límite proceso para mantener el código relacionado juntos y tratar de
reducir el acoplamiento a otros módulos en el sistema. Cuando estás empezando en
una nueva base de código, esto es probablemente un buen lugar para comenzar. Así
que una vez que haya encontrado sus contextos limitados en su dominio, asegúrese
de que se modelan dentro de su código base como módulos, con modelos
compartidos y ocultos.
Estos límites modulares se convierten en excelentes candidatos para microservicios.
En general, deben alinearse microservicios limpiamente a los contextos acotados.
Una vez que sea muy competente, puede decidir omitir el paso de mantener el
contexto acotado mo- Eled como un módulo dentro de un sistema más monolítica, y
saltar directamente a un servicio separado. Al comenzar, sin embargo, mantener un
nuevo sistema en el lado más monolítica; obtener los límites de servicio incorrecto
puede ser costoso, así que esperar que las cosas se estabilizan como se llega a
enfrentarse con un nuevo dominio es sensato. Discutiremos esto más enCapítulo 5,
Junto con técnicas para ayudar a romper aparte los sistemas existentes en
microservicios.
Por lo tanto, si nuestros límites del servicio se alinean con los contextos delimitados
en nuestro dominio, y nuestros microservicios representan esos contextos
delimitadas, estamos frente a un excelente comienzo para asegurar que nuestros
microservicios están relacionadas de forma flexible y fuertemente cohesionada.
La descomposición prematura
A ThoughtWorks, nosotros mismos experimentó los problemas de rotura de los
vicios a cabo microser- demasiado rápido. Aparte de consultoría, también creamos
unos pocos productos. Uno de ellos es SnapCI, una integración continua alojada y
una herramienta de liberación continua (discutiremos más adelante en esos
conceptosCapítulo 6). El equipo había trabajado previamente en otra herramienta
simi- lar, Go-CD, una herramienta de administración continua fuente abierta que se
puede implementar de forma local en lugar de estar alojada en la nube.
Aunque había algo de reutilización de código muy temprano entre el SnapCI y
proyectos de CD Ir, al final SnapCI resultó ser un nuevo código base. Sin embargo,
la experiencia previa del equipo en el dominio de las herramientas de CD les animó a
34| Capítulo 3: Cómo modelo de
servicios
moverse con mayor rapidez en la identificación de las fronteras, y la construcción de
su sistema como un conjunto de microservicios.
Al cabo de unos meses, sin embargo, se hizo evidente que los casos de uso de
SnapCI eran sutilmente lo suficientemente diferentes que la captura inicial sobre los
límites del servicio no estaba del todo bien. Esta
El contexto acotado | 35
dado lugar a una gran cantidad de cambios realizados a través de los servicios, y un
alto costo asociado al cambio. Eventualmente, el equipo combinó los servicios de
nuevo en un sistema monolítico, dándoles tiempo para comprender mejor dónde
deben existir los límites. Un año más tarde, el equipo fue capaz de dividir el sistema
monolítico aparte en microservicios, cuyos límites demostrado ser mucho más
estable. Esto está lejos de ser el único ejemplo de esta situación que he visto.
Prematuramente descomponer un sistema en microservicios puede ser costoso,
especialmente si usted es nuevo en el dominio. En muchos sentidos, con una base de
código existen- tes desea descomponer en microservicios es mucho más fácil que
tratar de ir a microservicios desde el principio.
Las capacidades de negocio
Cuando se empieza a pensar en los contextos limitados que existen en su
organización, debe ser no pensar en términos de datos que se comparte, sino de las
capacidades de aquellos contextos proporcionar al resto del dominio. El almacén
puede proporcionar la capa- bilidad para obtener una lista actual de las acciones, por
ejemplo, o el contexto financiero bien puede exponer a las cuentas de fin de mes o
permitirá configurar la nómina para un nuevo recluta. Estos lazos capabili- pueden
requerir el intercambio de información compartida-modelos-pero he visto demasiado
a menudo que pensar en los datos conduce a anemia, a base de CRUD (crear, leer,
actualizar, eliminar) los servicios. Así que pregunte primero “¿Qué hace este
contexto?”, Y luego “Entonces, ¿qué datos no se necesita hacer eso?”
Cuando modelado como los servicios, estas capacidades se convierten en las
operaciones clave que serán expuestos a través del cable a otros colaboradores.
Tortugas todo el camino
Al principio, es probable que identificar una serie de contextos acotados de
granularidad gruesa. Pero estos contextos delimitadas pueden a su vez contienen más
acotada contextos. Por ejem- plo, se puede descomponer el almacén en capacidades
asociadas con el fin fillment Fulbright, gestión de inventario, o recepción de
mercancías. Al considerar los límites de sus microservicios, primero pensar en
términos de los contextos más grandes, de grano más grueso, y luego subdividir a lo
largo de estos contextos anidados cuando se está en busca de los beneficios de la
división a cabo estas costuras.
He visto estos contextos anidados permanecen ocultos a otra, colaborando microservicios con gran efecto. Para el mundo exterior, que siguen haciendo uso de capacidades de negocio en el almacén, pero son conscientes de que sus solicitudes en
realidad están siendo asignados de forma transparente a dos o más servicios por
separado, como se puede ver enFigura 3-2. A veces, usted decidirá que tiene más
sentido para el contexto acotado de nivel superior no puede modelar de forma
explícita como un límite de servicio, como enFigura 3-3, Por lo que en lugar de una
36| Capítulo 3: Cómo modelo de
servicios
sola frontera de almacén, en su lugar podría dividir a cabo el inventario,
cumplimiento de pedidos y recepción de mercancías.
El contexto acotado | 37
Figura 3-2. Microservicios que representan contextos anidados delimitadas
ocultos en el interior del almacén
Figura 3-3. Los contextos delimitados en el interior del almacén se aparecieron en
sus propios contextos de alto nivel
En general, no hay una regla dura y rápida en cuanto a qué enfoque tiene más
sentido. Sin embargo, si se elige el enfoque anidado sobre el enfoque de la
separación completa debe basarse en su estructura organizativa. Si el cumplimiento
de pedidos, gestión de inventario y recepción de los bienes son administrados por
diferentes equipos, es probable que merecen su condición de microservicios de alto
nivel. Si, por el contrario, todos ellos son gestionados por un equipo, entonces el
modelo anidado tiene más sentido. Esto se debe a la interacción de las estructuras de
organización y arquitectura de software, lo que vamos a discutir hacia el final del
libro deCapítulo 10.
Otra razón para preferir el enfoque anidado podría ser a su trozo de arquitectura para
simplificar las pruebas. Por ejemplo, al probar los servicios que consumen el
almacén, no tengo a stub cada servicio dentro del contexto de almacén, sólo la API
de grano más coarse-. Esto también le puede dar una unidad de aislamiento cuando se
consideran grandes las pruebas de ámbito. Puede que, por ejemplo, decidir tener
pruebas de extremo a extremo en el que poner en marcha todos los servicios dentro
del contexto de almacén, sino para todos los demás colaboradores que podría
dejamos vacías. Vamos a estudiar más sobre las pruebas y el aislamiento deCapítulo
7.
Tortugas hasta el fondo | 35
La comunicación en términos de conceptos de negocio
Los cambios que implementamos en nuestro sistema son a menudo acerca de los
cambios que la empresa quiere hacer a cómo se comporta el sistema. Estamos
cambiando la funcionalidad de las capacidades- que están expuestos a nuestros
clientes. Si nuestros sistemas se descomponen a lo largo de los contextos acotados
que representan nuestro dominio, los cambios que queremos hacer son más
propensos a ser aislado a uno, límite microService sola. Esto reduce el número de
lugares que tenemos que hacer un cambio, y nos permite desplegar rápidamente que
el cambio.
Sus También es importante pensar en la comunicación entre estos microservicios en
términos de los mismos conceptos de negocio. El modelado de software Después de
su dominio Ness Busi- no debe detenerse en la idea de contextos acotados. Los
mismos términos e ideas que se comparten entre las partes de su organización deben
reflejarse en sus interfaces. Puede ser útil pensar en formas de ser enviados entre
estos microservicios, tanto como las formas se envían alrededor de una organización.
El límite técnico
Eso puede ser útil para ver lo que puede salir mal cuando los servicios se modelan de
forma incorrecta. Hace un tiempo, unos colegas y yo estábamos trabajando con un
cliente en California, ayudando a la compañía adoptar algunas prácticas de código
más limpio y se mueven más hacia las pruebas automatizadas. Habíamos empezado
con algo de la fruta madura, como el servicio decomposi- ción, cuando nos dimos
cuenta de algo mucho más preocupante. No puedo entrar en detalles en cuanto a lo
que hizo la solicitud, pero era una aplicación de cara al público con una gran base de
clientes global.
El equipo y el sistema, habían crecido. Originalmente la visión de una persona, el
sistema había tomado más y más características, y más y más usuarios. Con el
tiempo, la or- ganización decidió aumentar la capacidad del equipo por tener un
nuevo grupo de res desarrollos basados en Brasil asuma una parte del trabajo. El
sistema quedó dividido, con la mitad delantera de la aplicación siendo esencialmente
sin estado, implementar el sitio de cara al público en web, como se muestra enFigura
3-4. La media parte posterior del sistema era simplemente una interfaz remota
llamada procedi- miento (RPC) durante un almacén de datos. Esencialmente, imagina
que había tomado una capa de repositorio en su base de código y hecho de este un
servicio independiente.
36| Capítulo 3: Cómo modelo de
servicios
La Figura 3-4. Una fracción de frontera de servicio a través de una costura técnico
Los cambios tenían con frecuencia que deben introducirse en ambos servicios.
Ambos servicios hablaban en términos de bajo nivel, el método de estilo llamadas
RPC, que eran demasiado frágiles (discutiremos esto en futherCapítulo 4). La
interfaz de servicio también era muy hablador también, lo que resulta en problemas
de rendimiento. Esto dio lugar a la necesidad de mecanismos RPC-lotes elaborados.
Me llamó esta arquitectura de cebolla, ya que tenía un montón de capas y me hizo
llorar cuando tuvimos que cortar a través de él.
Ahora, en vista de ello, la idea de dividir el sistema monolítico previamente a lo largo
de líneas geográficas / organización tiene mucho sentido, ya que vamos a ampliar en
en Capítulo 10. Aquí, sin embargo, en lugar de tomar una rebanada vertical, centrada
en el negocio a través de la pila, el equipo recogió lo que antes era una API en
proceso e hizo un corte horizontal.
La toma de decisiones para modelar los límites del servicio a lo largo de las costuras
técnicas no siempre es malo. Ciertamente, he visto esto hace mucho sentido cuando
una organización está tratando de lograr ciertos objetivos de rendimiento, por
ejemplo. Sin embargo, debe ser su controlador secundario para la búsqueda de estas
costuras, no su primaria.
Resumen
En este capítulo, usted ha aprendido un poco acerca de lo que hace un buen servicio,
y cómo encontrar las costuras en nuestro espacio del problema que nos dan el doble
beneficio de ambos bajo acoplamiento y alta cohesión. contextos acotadas son una
herramienta vital en ayudarnos a encontrar estas costuras, y alineando nuestros
microservicios a estos límites nos aseguramos de que el sistema resultante tiene todas
las posibilidades de mantener intactas las virtudes. También tenemos una pista sobre
cómo podemos subdividir aún más nuestros microservicios, algo que vamos a
explorar en mayor profundidad más adelante. Y también introdujimos MusicCorp, el
resumen | 37
dominio de ejemplo que vamos a utilizar en este libro.
38| Capítulo 3: Cómo modelo de
servicios
Las ideas presentadas en Diseño guiado por el dominio de Eric Evans son muy útiles
para nosotros en la búsqueda de límites razonables para nuestros servicios, y yo sólo
hemos arañado la superficie aquí. Recomiendo Driven Design-libro de dominio de
aplicación de Vaughn Vernon (Addison-Wesley) para ayudar a entender los aspectos
prácticos de este enfoque.
Aunque en este capítulo ha sido en su mayoría de alto nivel, tenemos que conseguir
mucho más téc- nico en el siguiente. Hay muchos problemas asociados con la
implementación de las interfaces entre los servicios que pueden conducir a todo tipo
de problemas, y vamos a tener que tomar una inmersión profunda en este tema si
queremos mantener nuestros sistemas de convertirse en un gigante, maraña.
resumen | 39
CAPÍTULO 4
Integración
Conseguir la derecha de integración es el aspecto más importante de la tecnología
asocia- dos con microservicios en mi opinión. Hacerlo bien, y sus microservicios
conservan su autonomía, que le permite cambiar y liberarlos independiente del
conjunto. Se equivocan, y la catástrofe que nos espera. Con suerte, una vez que haya
leído este capítulo usted aprenderá cómo evitar algunas de las mayores dificultades
que han afectado a otros intentos de SOA y sin embargo podría le esperan en su viaje
a microservicios.
En busca de la integración de la tecnología Ideal
Hay una desconcertante variedad de opciones que hay para cómo uno microService
puede hablar con otro. Pero cual es la correcta: jabón? XML-RPC? ¿DESCANSO?
tampones protocolo? Vamos a bucear en los que en un momento, pero antes de
hacerlo, vamos a pensar en lo que queremos de cualquier tecnología que elegimos.
Evitar Los cambios de última hora
De vez en cuando, podemos hacer un cambio que requiere nuestros consumidores a
cambiar también. Vamos a discutir cómo manejar esto más adelante, pero queremos
recoger tecnología que garantiza esto sucede lo menos posible. Por ejemplo, si un
microService añade nuevos campos a una parte de los datos que envía, los
consumidores existentes no deberían verse afectados.
Mantenga su independiente de la tecnología API
Si usted ha estado en la industria de TI durante más de 15 minutos, no hace falta que
decir que trabajamos en un espacio que está cambiando rápidamente. La única
certeza es el cambio. Nuevas herramientas, marcos y lenguas están saliendo todo el
tiempo, la aplicación de nuevas ideas que pueden ayudar a trabajar más rápido y con
mayor eficacia. En este momento, es posible que una tienda de .NET. Pero ¿qué pasa
39
en un año a partir de ahora, o cinco años a partir de ahora? Que si tu
40| Capítulo 4: Integración
desee experimentar con una pila de tecnologías alternativas que podrían hacer más
productivo?
Soy un gran fan de mantener mis opciones abiertas, por lo que yo soy un fan de
vicios tales microser-. También es por eso que creo que es muy importante para
asegurarse de que mantener las API utilizadas para la comunicación entre
microservicios independiente de la tecnología. Esto significa evitar la tecnología de
integración que dicta lo que la tecnología pilas que podemos utilizar para poner en
práctica nuestros microservicios.
Hacer del Servicio simple para los consumidores
Nosotros querer hacer más fácil para los consumidores a utilizar nuestro servicio.
Tener un microService reada bellamente fac- no cuenta para mucho si el costo de
utilizarlo como un consumidor está por las nubes! Así que vamos a pensar en lo que
hace que sea fácil para los consumidores a utilizar nuestro nuevo servicio
maravilloso. Idealmente, nos gustaría para permitir a nuestros clientes completa
libertad en su elección de la tecnología, pero por otro lado, proporcionar una
biblioteca de cliente puede aliviar la adopción. A menudo, sin embargo, dichas
bibliotecas son incompatibles con otras cosas que queremos lograr. Por ejemplo,
podríamos utilizar bibliotecas de cliente para hacer más fácil para los consumidores,
pero esto puede llegar a costa de un mayor acoplamiento.
Ocultar detalle de implementación interna
Nosotros no hacemos queremos que nuestros consumidores a estar unidos a nuestra
aplicación interna. Esto conduce a un aumento de acoplamiento. Esto significa que si
queremos cambiar algo dentro de nuestra microService, podemos romper nuestros
consumidores al obligarles a cambiar también. Esto incrementa el coste del cambioel resultado exacto que estamos tratando de evitar. También significa que son menos
propensos a querer hacer un cambio por temor a tener que actualizar nuestros
consumidores, que pueden conducir a un aumento de la deuda técnica dentro del
servicio. Por lo que cualquier tecnología que nos empuja a exponer detalladamente
representación interna debe ser evitado.
Interfaz con Clientes
Ahora que tenemos algunas pautas que pueden ayudar a seleccionar una buena
tecnología a utilizar para la integración entre los servicios, vamos a ver algunas de las
opciones más comunes por ahí y tratar de averiguar qué funciona mejor para
nosotros. Para ayudarnos a pensar en esto, vamos a elegir un ejemplo del mundo real
desde MusicCorp.
creación del cliente a primera vista podría ser considerado como un simple conjunto
de opera- ciones CRUD, pero para la mayoría de los sistemas es más complejo que
eso. Registro de una nueva cliente puede necesitar para poner en marcha procesos
41
adicionales, como la creación de pagos financieros o Enviar- ing mensajes de correo
electrónico de bienvenida. Y cuando cambiar o eliminar un cliente, otros procesos de
negocio puede ser que consiga disparado también.
Así que con esto en mente, debemos mirar algunas maneras diferentes en las que lo
que se quiere trabajar con los clientes en nuestro sistema MusicCorp.
42| Capítulo 4: Integración
La base de datos compartida
Con mucho, la forma más común de integración que yo o cualquiera de mis colegas
veo en la industria es la base de datos (DB) de integración. En este mundo, si quieren
otros servicios de informa- ción de un servicio, que llegan a la base de datos. Y si
quieren cambiarlo, que llegan a la base de datos! Esto es muy simple cuando se
piensa en ello en primer lugar, y es probablemente la forma más rápida de la
integración a comenzar con-lo que probablemente explica su popularidad.
Figura 4-1 nuestra muestra la interfaz de usuario de registro, que crea los clientes
mediante la realización de operaciones SQL directamente en la base de datos.
También muestra nuestra aplicación de centro de llamadas que ve y edita los datos
del cliente mediante la ejecución de SQL en la base de datos. Y el almacén actualiza
la información sobre pedidos de los clientes mediante la consulta de la base de datos.
Este es un patrón bastante com- mon, pero es uno lleno de dificultades.
La Figura 4-1. Usando la integración DB para acceder y cambiar la información del cliente
En primer lugar, estamos permitiendo que las partes externas a ver y se unen a los
detalles de implementación interna. Las estructuras de datos que almacenamos en la
base de datos son un juego justo para todos; que se comparten en su totalidad con
todas las demás partes con acceso a la base de datos. Si decido cambiar mi esquema
para representar mejor a mis datos, o hacer mi sistema más fácil de mantener, puedo
romperme los consumidores. El DB es efectivamente una API muy grande,
compartida que también es bastante frágil. Si quiero cambiar la lógica asociada con,
por ejemplo, cómo el servicio de asistencia gestiona los clientes y esto requiere un
cambio en la base de datos, tengo que tener mucho cuidado de que no se rompen las
partes del esquema utilizado por otros servicios. Esta situación da lugar normalmente
a que requiere una gran cantidad de pruebas de regresión.
En segundo lugar, mis consumidores están ligados a una elección específica de la
tecnología. Tal vez en este momento que tiene sentido para almacenar los clientes en
una base de datos relacional, por lo que mis consumidores utilizan un controlador
adecuado (potencialmente DB-específico) para hablar con él. ¿Qué pasa si el paso del
tiempo nos damos cuenta de que sería mejor almacenar datos en una base de datos
relacional? Puede tomar esa decisión? Así que los consumidores están íntimamente
ligados a la implementación del servicio al cliente. Como hemos comentado
La base de datos compartida
| 41
anteriormente, que realmente queremos para asegurar que detalle de implementación
se oculta a los consumidores para que nuestro servicio de un nivel de autonomía en
términos de cómo cambia su funcionamiento interno a través del tiempo. Adiós,
acoplamiento suelto.
42| Capítulo 4: Integración
Por último, vamos a pensar en el comportamiento por un momento. No va a ser
lógica asociada con la forma en que se cambia un cliente. ¿Dónde es que la lógica? Si
los consumidores están manipulando directamente la base de datos, entonces tienen
que poseer la lógica asociada. La lógica para per- formar el mismo tipo de
manipulación para un cliente puede ahora ser extendido entre los consumidores
multi- ples. Si el almacén, la interfaz de usuario de registro y centro de llamadas de
interfaz de usuario toda la necesidad de editar la información del cliente, lo que
necesito para corregir un error o cambiar el comportamiento en tres lugares
diferentes, e implementar esos cambios también. Adiós, la cohesión.
Recuerde que cuando hablamos de los principios básicos detrás de buenas
microservicios? Fuerte cohesión y la suelta de acoplamiento con la integración de la
base de datos, se pierden ambas cosas. la integración de bases de datos hace que sea
fácil para los servicios para compartir datos, pero no hace nada acerca de compartir
comportamiento. Nuestra representación interna se expone sobre el alambre a
nuestros con- sumidores, y puede ser muy difícil de evitar hacer cambios de última
hora, lo que inevitablemente conduce a un temor de cualquier cambio en absoluto.
Evitar a (casi) todos los costes.
Para el resto del capítulo, vamos a explorar diferentes estilos de integración que
involucran servicios laborating COL-, que a su vez ocultar sus propias
representaciones internas.
Versus síncrono asíncrono
Antes de empezar a bucear en los detalles de las diferentes opciones de tecnología,
debemos discutir una de las decisiones más importantes que podemos hacer en
términos de cómo colaboran los servicios. En caso de que la comunicación sea
síncrona o asíncrona? Esta elección funda- mental, inevitablemente, nos guía hacia
cierto detalle de implementación.
Con la comunicación síncrona, se realiza una llamada a un servidor remoto, que
bloquea hasta que se completa la operación. Con la comunicación asincrónica, la
persona que llama no espera a que se complete la operación, antes de regresar, y
puede incluso no importa si la operación se completa en absoluto.
comunicación sincrónica puede ser más fácil de razonar acerca. Sabemos que cuando
las cosas se han completado con éxito o no. La comunicación asíncrona puede ser
muy útil para trabajos de larga duración, donde mantener una conexión abierta
durante un largo período de tiempo entre el cliente y el servidor es poco práctico.
También funciona muy bien cuando se necesita una latencia baja, donde el bloqueo
de una llamada mientras se espera el resultado puede retrasar las cosas. Debido a la
naturaleza de las redes móviles y dispositivos, disparando las solicitudes y las cosas
asumiendo han trabajado (a menos que se diga lo contrario) puede asegurar que la
interfaz de usuario se mantenga sensible incluso si la red es muy perezoso. En el otro
lado, la tecnología para manejar la comunicación asyn- chronous puede ser un poco
La base de datos compartida
| 43
más complicado, como veremos en breve.
Estos dos modos diferentes de comunicación pueden habilitar dos estilos diferentes
idiomáticas de colaboración: petición / respuesta o basadas en eventos. Con petición /
respuesta, un ent CLI- inicia una petición y espera la respuesta. Este modelo se alinea
claramente bien a la comunicación síncrona, pero puede trabajar para la
comunicación asincrónica también. yo
44| Capítulo 4: Integración
podría poner en marcha una operación y registrar una devolución de llamada,
pidiendo al servidor para que me haga saber cuando mi operación se ha completado.
Con una colaboración basada en eventos, invertimos cosas. En lugar de un cliente
que inicia solicitudes que piden cosas por hacer, en lugar dice que esto sucedió y
espera que otras partes sepan qué hacer. Nunca cuentes a nadie lo que debe hacer.
Los sistemas basados en eventos, por su naturaleza son asíncronas. Los inteligencia
son distributed- de manera más uniforme es decir, la lógica de negocio no se
centraliza en los cerebros de núcleo, pero en vez empujado hacia fuera de manera
más uniforme a los diversos colaboradores. La colaboración basada en evento
también es altamente desacoplado. El cliente que emite un evento no tiene ninguna
manera de saber quién o qué va a reaccionar a ella, lo que también significa que se
pueden añadir nuevos suscriptores a estos eventos sin que el cliente ni siquiera tenga
que saber.
Así que ¿hay otros conductores que nos puedan empujar a elegir un estilo sobre otro?
Un factor importante a considerar es lo bien que se adaptan estos estilos para resolver
un problema complejo a menudo-: ¿Cómo manejamos procesos que abarcan los
límites del servicio y pueden ser de larga data?
Orquestación Versus Coreografía
A medida que comienzan a modelar más y más compleja lógica, tenemos que lidiar
con el problema de la gestión de procesos de negocio que se extienden a través del
límite de servi- cios individuales. Y con microservicios, vamos a golpear este límite
antes de lo habitual. Tomemos un ejemplo de MusicCorp, y veamos lo que sucede
cuando creamos un cliente:
1. Un nuevo registro se crea en el banco de puntos de fidelidad para el cliente.
2. Nuestro sistema postal envía un paquete de bienvenida.
3. Nosotros enviar un mensaje de bienvenida a los clientes.
Esto es muy fácil de modelar conceptualmente como un diagrama de flujo, como lo hacemos en
Figura 4-2.
Cuando se trata de la aplicación real de este flujo, hay dos estilos de la arquitectura
que podríamos seguir. Con la orquestación, nos basamos en un cerebro central para
guiar y conducir el proceso, al igual que el conductor de una orquesta. Con
coreografía, se informa a cada parte del sistema de su trabajo, y dejar que actúe en
los detalles, como bailarines ing todo hallazgo su camino y que reaccionan a otros a
su alrededor en un ballet.
Orquestación Versus Coreografía | 43
La Figura 4-2. El proceso para crear un nuevo cliente
Vamos a pensar en lo que es una solución de orquestación se vería de este flujo. En
este caso, probablemente la cosa más sencilla de hacerlo sería tener nuestro acto de
servicio al cliente como el cerebro central. En la creación, que habla con el banco de
puntos de fidelidad, servicio de correo electrónico, y el servicio postal como vemos
enFigura 4-3, A través de una serie de llamadas de petición / respuesta. El propio
servicio de cliente puede realizar un seguimiento de que un cliente está en este
proceso. Se puede comprobar para ver si la cuenta del cliente se ha establecido, o el
correo electrónico enviado o entregado el cargo. Tenemos la oportunidad de tomar el
diagrama de flujo deFigura 4-2 y modelar directamente en código. Podríamos incluso
utilizar herramientas que implementa esto por nosotros, tal vez utilizando un motor
de reglas apropiado. existen herramientas comerciales para este fin en forma de
software de modelado de procesos de negocio. Suponiendo que utilizamos síncrono
de solicitud / respuesta, incluso podríamos saber si cada etapa ha funcionado.
La Figura 4-3. Manejo de creación del cliente a través de la orquestación
La desventaja de este enfoque es que la orquestación de servicio al cliente puede
llegar a ser demasiado de una autoridad de gobierno central. Puede llegar a ser el
44| Capítulo 4: Integración
centro de operaciones en el medio de una
Orquestación Versus Coreografía | 45
web, y un punto central donde la lógica comienza a vivir. He visto a este resultado
enfoque en un pequeño número de servicios inteligentes “dios” contar los servicios
basados en CRUD anémica qué hacer.
Con un enfoque coreografía, que podría tener lugar sólo el servicio al cliente emite
un evento de manera asíncrona, diciendo creado cliente. El servicio de correo
electrónico, servicio postal, y los puntos de fidelidad bancaria a continuación, sólo se
suscriben a estos eventos y reaccionar en consecuencia, como enFigura 4-4. Este
enfoque es significativamente más desacoplado. Si algún otro servicio necesario para
llegar a la creación de un cliente, sólo tiene que suscrip- ción a los acontecimientos y
hacer su trabajo cuando sea necesario. La desventaja es que la visión explícita de los
procesos de negocio que vemos enFigura 4-2 Ahora se refleja de manera implícita en
nuestro sistema.
La Figura 4-4. Manipulación del cliente a través de la creación de la coreografía
Esto significa que se necesita trabajo adicional para asegurarse de que puede
controlar y realizar un seguimiento de que se han sucedido las cosas correctas. Por
ejemplo, puedes saber si el banco puntos de fidelidad tenía un error y por alguna
razón no se estableció la cuenta correcta? Uno de los enfoques que me gusta para
hacer frente a esto es crear un sistema de control que coincide explícitamente el
punto de vista del proceso de negocio deFigura 4-2, Pero luego las pistas lo que cada
uno de los servicios que lo hace como entidades independientes, que le permite ver
excepciones impares mapeados en el flujo de proceso más explícito. El diagrama de
flujo que vimos anteriormente no es la fuerza motriz, pero sólo un lente a través del
cual podemos ver cómo el sistema se está comportando.
En general, he encontrado que los sistemas que tienden más hacia el enfoque
coreografía son más débilmente acoplado, y son más flexibles y susceptibles de
cambio. Sí es necesario realizar un trabajo extra para controlar y realizar un
seguimiento de los procesos a través de los límites del sistema, sin embargo. He
encontrado implementaciones más fuertemente orquestado a ser extremadamente
frágil, con un coste más alto de cambio. Con esto en mente, yo prefiero firmemente
el objetivo de un sistema de coreografía, donde cada servicio es lo suficientemente
inteligente como para Deben conocerse su papel en todo el baile.
Hay bastantes factores para desempaquetar aquí. llamadas síncronas son más
46| Capítulo 4: Integración
simples, y llegar a saber si las cosas funcionaron de inmediato. Si nos gusta la
semántica de petición /
Orquestación Versus Coreografía | 47
respuesta, pero se trata de procesos de larga vida, que sólo podría iniciar solicitudes
nous asynchro- y esperar a que las devoluciones de llamada. Por otro lado, la ración
de eventos asíncronos colabora- nos ayuda a adoptar un enfoque coreografía, lo que
puede producir significativamente más desacoplado servicios de algo que queremos
luchar por asegurar que nuestros servicios son de forma independiente liberable.
Estamos, por supuesto, libre de mezclar y combinar. Algunas tecnologías se ajuste
más natural en un estilo u otro. Nosotros, sin embargo, necesitamos apreciar algunos
de los detalles de implementación diferentes técnicas que ayudarán aún más a hacer
la decisión correcta.
Para empezar, vamos a ver dos tecnologías que se adapten bien cuando estamos
considerando petición / respuesta: las llamadas a procedimiento remoto (RPC) y
Representational State Transfer (REST).
Llamadas a procedimiento remoto
Llamada a procedimiento remoto se refiere a la técnica de hacer una llamada local y
hacer que se eje- lindo en un servicio remoto en alguna parte. Hay un número de
diferentes tipos de tecnología de RPC que hay. Algunas de esta tecnología se basa en
tener una definición de interfaz (SOAP, Thrift, búferes de protocolo). El uso de una
definición de interfaz separada puede hacer que sea más fácil para generar recibos de
cliente y servidor para diferentes pilas de tecnología, por lo que, por ejem- plo,
podría tener un servidor Java exponiendo una interfaz SOAP, y un cliente .NET
generada desde el servicio Web Definition Language (WSDL) definición de la
interfaz. Otras tecnologías, como Java RMI, exige un acoplamiento estrecho entre el
cliente y el servidor, lo que requiere que ambos utilizan la misma tecnología
subyacente pero evita la necesidad de una definición de interfaz compartida. Todas
estas tecnologías, sin embargo, tienen la misma,
Muchos de estas tecnologías son de naturaleza binaria, como Java RMI, Thrift, o
tampones de protocolo, mientras que de SOAP utiliza XML para sus formatos de
mensaje. Algunas implementaciones están vinculados a un protocolo de red
específico (como SOAP, que hace uso nominal de HTTP), mientras que otros
podrían permitir el uso de diferentes tipos de protocolos de red, que a su vez puede
proporcionar funciones adicionales. Por ejemplo, TCP ofrece garantías acerca de la
entrega, mientras que UDP no, pero tiene una cabeza mucho más bajo. Esto puede
permitir el uso de la tecnología de redes diferentes para diferentes casos de uso.
Esas implementaciones RPC que le permiten generar recibos de cliente y servidor
ayudarle a empezar muy, muy rápido. Puedo ser el envío de contenido a través de
una frontera de la red en ningún momento a todos. Esto es a menudo uno de los
principales puntos de venta de RPC: su facilidad de uso. El hecho de que solo puedo
hacer una llamada a un método normal y, teóricamente, ignorar el resto es una
ventaja enorme.
Algunas implementaciones RPC, sin embargo, vienen con algunos inconvenientes
48| Capítulo 4: Integración
que pueden causar problemas. Estos problemas no son siempre evidentes al principio,
pero, no obstante, pueden ser lo suficientemente grave como para superar los
beneficios de ser tan fácil de poner en marcha rápidamente.
Orquestación Versus Coreografía | 49
tecnología de acoplamiento
Algunos mecanismos RPC, como Java RMI, están fuertemente ligados a una
plataforma específica, lo que puede limitar la cual la tecnología se puede utilizar en
el cliente y el servidor. De segunda mano y de protocolo amortiguadores tienen una
cantidad impresionante de soporte para lenguajes alternativos, lo que puede reducir
este inconveniente poco, pero tenga en cuenta que a veces la tecnología de RPC
viene con restricciones a la interoperabilidad.
En cierto modo, este acoplamiento tecnología puede ser una forma de exponer los
detalles técnicos mentación Implementers internos. Por ejemplo, el uso de RMI lazos
no sólo el cliente para la JVM, pero el servidor también.
Las llamadas locales no son como las llamadas remotas
La idea central de RPC es ocultar la complejidad de una llamada remota. Muchas
implementaciones de RPC, sin embargo, esconden demasiado. La unidad en algunas
formas de RPC para hacer llamadas a métodos remotos parecen llamadas a métodos
locales oculta el hecho de que estas dos cosas son muy diferentes. Puedo hacer un
gran número de llamadas locales, en proceso y sin Worry ing excesivamente sobre el
rendimiento. Con RPC, sin embargo, el costo de cálculo de referencias y cargas útiles
de clasificación de ONU-puede ser importante, por no mencionar el tiempo necesario
para enviar cosas por la red. Esto significa que hay que pensar de manera diferente
sobre el diseño de la API para las interfaces remotas frente a las interfaces locales.
Sólo tomando una API local y tratar de hacer que un límite de servicio sin es
probable que meter en problemas más pensamiento. En algunos de los peores
ejemplos,
Tú que pensar en la propia red. Lo conocido, la primera de las falacias de la
computación dis- tribuido es“La red es fiable”. Las redes no son fiables. Ellos pueden
y fallan, incluso si su cliente y el servidor que está hablando están bien. Ellos pueden
fallar rápido, pueden fallar lento, e incluso pueden malform sus paquetes. Usted debe
asumir que sus redes están plagadas de entidades malévolas listos para dar rienda
suelta a su ira en un capricho. Por lo tanto, los modos de fallo que puede esperar son
diferentes. Un Ure fail podría ser causado por el servidor remoto devolver un error, o
por usted haciendo una mala decisión. ¿Puede usted decir la diferencia, y si es así, se
puede hacer nada al respecto? Y, ¿qué hacer cuando el servidor remoto simplemente
empieza a responder lentamente? Vamos a cubrir este tema cuando hablamos de la
capacidad de resistencia deCapítulo 11.
fragilidad
Algunas de las implementaciones más populares de RPC puede conducir a algunas
formas desagradables de fragilidad, RMI de Java es un muy buen ejemplo. Vamos a
considerar una interfaz Java muy simple que hemos decidido hacer una API de
control remoto para la atención al cliente.Ejemplo 4-1 declara los métodos que
Llamadas a procedimientos
remotos | 47
vamos a exponer de forma remota. RMI de Java genera entonces los talones de
cliente y servidor para nuestro método.
48| Capítulo 4: Integración
Ejemplo 4-1. Definiendo un extremo de servicio usando Java RMI
importar java.rmi.Remote;
importar java.rmi.RemoteException;
interfaz pública ClienteRemote se extiende Remoto {
público Cliente findCustomer(ID de cadena) lanza RemoteException;
público Cliente createCustomer(Nombre de cuerdas, apellido cadena, cadena emailAddress)
lanza RemoteException;
}
En esta interfaz, findCustomer toma el primer nombre, apellido y dirección de correo
electrónico. ¿Qué ocurre si decidimos permitir que el objeto del cliente también
puede crear con sólo una dirección de correo electrónico? Podríamos añadir un nuevo
método en este punto con bastante facilidad, así:
...
público Cliente createCustomer(cadena emailAddress) lanza RemoteException;
...
El problema es que ahora hay que regenerar los stubs cliente también. Los clientes
que desean consumir el nuevo método necesitan los nuevos talones, y dependiendo
de la naturaleza de los cambios en la especificación, los consumidores que no
necesitan el nuevo método puede también necesitan que sus talones mejorado
también. Esto es manejable, por supuesto, pero hasta cierto punto. La realidad es que
los cambios de este tipo son bastante comunes. puntos finales RPC a menudo acaban
teniendo un gran número de métodos para diferentes formas de crear o interactuar
con los objetos. Esto se debe en parte al hecho de que todavía estamos pensando en
estas llamadas remotas como las locales.
Hay otro tipo de fragilidad, sin embargo. Vamos a echar un vistazo a lo que nuestro cliente
objeto se parece a:
clase pública Cliente implementos serializable {
privado cadena primerNombre;
privado apellido cadena;
privado cadena emailAddress;
privado cadena edad;
}
Ahora, ¿y si resulta que aunque exponemos el campo de la edad en nuestros objetos
de clientes, ninguno de nuestros consumidores cada vez se utiliza? Decidimos que
queremos eliminar este campo. Pero si la implementación del servidor elimina la
edad de su definición de este tipo, y no hacemos lo mismo para todos los
consumidores, a continuación, a pesar de que nunca se utiliza el campo, el código
asociado a deserializar el objeto al cliente en el lado del consumidor se romperá .
Para distribuir este cambio, tendría que implementar tanto un nuevo servidor y los
clientes al mismo tiempo. Este es un desafío clave con cualquier mecanismo RPC
que promueve el uso de la generación de código auxiliar binaria: usted no consigue
separar las implementaciones de cliente y servidor. Si utiliza esta tecnología,
Llamadas a procedimientos
remotos | 49
comunicados de bloqueo de paso pueden ser en el futuro.
50| Capítulo 4: Integración
Problemas similares se producen si quiero reestructurar el objeto al cliente, incluso si
no eliminar campos, por ejemplo, si quería encapsular primerNombre y apellidos en
un nuevo tipo de denominación para que sea más fácil de manejar. Podría, por
supuesto, arreglar esto pasando alrededor de los tipos de diccionario como los
parámetros de mis llamadas, pero en ese momento, voy a perder muchos de los
beneficios de los módulos de programa generados porque todavía tiene que coincidir
manualmente y extraer los campos que quiero .
En la práctica, los objetos utilizados como parte de serialización binaria a través del
cable pueden ser considerados como ampliar-únicos tipos. Este fragilidad resultados
en los tipos expuestos sobre el alambre y convertirse en una masa de campos,
algunos de los cuales ya no se utilizan, pero no se pueden eliminar de forma segura.
RPC es terrible?
A pesar de sus deficiencias, yo no iría tan lejos como para llamar RPC terrible.
Algunas de las implementaciones comunes que he encontrado puede llevar a la clase
de problemas que he descrito aquí. Debido a los retos de la utilización RMI, sin duda
dará que la tecnología de un gran rodeo. Muchas operaciones caen bastante bien en el
modelo basado en RPC, y más mecanismos modernos como búferes de protocolo o
Thrift mitigar algunos de los pecados del pasado, evitando la necesidad de
comunicados de bloqueo de paso de cliente y el código del servidor.
Acaba de ser conscientes de algunos de los peligros potenciales asociados con RPC si
se va a recoger este modelo. No abstractos sus llamadas remotas hasta el punto donde
la red está completamente oculto, y asegúrese de que puede evolucionar la interfaz de
servidor sin ing hav- insistir en las actualizaciones de bloqueo de paso para los
clientes. Encontrar el equilibrio adecuado para su código ent CLI- es importante, por
ejemplo. Asegúrese de que sus clientes no son ajenos al hecho de que una llamada a
la red se va a realizar. bibliotecas de cliente se utilizan a menudo en el contexto de la
RPC, y si no estructurado derecho que puede ser problemático. Hablaremos más
sobre ellos en breve.
En comparación con la integración de bases de datos, RPC es sin duda una mejora
cuando pensamos acerca de las opciones para la colaboración de solicitud / respuesta.
Pero hay otra opción para con- Sider.
DESCANSO
Representational State Transfer (REST) es un estilo arquitectónico inspirado en la
Web. Hay muchos principios y limitaciones detrás del estilo REST, pero vamos a
centrar en los que realmente nos ayude cuando nos enfrentamos a los retos de
integración en un mundo ces microservi-, y cuando estamos buscando un estilo
alternativo de RPC para nuestro servicio interfaces.
Lo más importante es el concepto de recursos. Se puede pensar en un recurso como
una cosa que el servicio en sí conoce, como un cliente. El servidor crea diferentes
RESTO | 49
representaciones de este cliente bajo petición. Como un recurso se muestra
externamente es
50| Capítulo 4: Integración
completamente desacoplado de la forma en que se almacena internamente. Un cliente
puede pedir una representación JSON de un cliente, por ejemplo, incluso si se
almacena en un formato completamente diferente. Una vez que un cliente tiene una
representación de este cliente, entonces se puede hacer peticiones para cambiarlo, y
el servidor puede o no puede cumplir con ellos.
Hay muchos estilos diferentes de descanso, y me tocan sólo brevemente sobre ellos
aquí. Os recomiendo echar un vistazo a laRichardson Modelo de Madurez, Donde se
comparan los diferentes estilos de descanso.
RESTO sí en realidad no hablar de protocolos subyacentes, aunque es más
comúnmente utilizado a través de HTTP. He visto las implementaciones de REST
utilizando diferentes protocolos antes, como serie o USB, aunque esto puede requerir
mucho trabajo. Algunas de las características que nos da HTTP como parte de la
especificación, como los verbos, hacer que la implementación de REST a través de
HTTP más fácil, mientras que con otros protocolos que tendrá que manejar estas
características sí mismo.
REST y HTTP
HTTP en sí define algunas capacidades útiles que juegan muy bien con el estilo
REST. Por ejemplo, los verbos HTTP (por ejemplo, GET, POST, y PUT) ya han bien
entendido significados en la especificación HTTP en cuanto a cómo deben trabajar
con recursos. El estilo arquitectónico REST realidad nos dice que los métodos deben
comportarse de la misma manera en todos los recursos, y la especificación HTTP
pasa a definir un montón de métodos que podemos utilizar. GET recupera un recurso
de una manera idempotente, y POST crea un nuevo recurso. Esto significa que
podemos evitar un montón de diferentes métodos createCustomer o editCustomer. En
su lugar, simplemente se puede publicar un representación al cliente para solicitar
que el servidor crea un nuevo recurso, e iniciar una petición GET para recuperar una
representación de un recurso. Conceptualmente, hay un punto final en forma de un
recurso de atención al cliente en estos casos,
HTTP también trae un gran ecosistema de herramientas y tecnología de apoyo.
Tenemos la oportunidad de utilizar servidores proxy caché HTTP como barniz y
equilibradores de carga como mod_proxy, y muchas herramientas de seguimiento ya
tienen un montón de soporte para HTTP fuera de la caja. Estos bloques de
construcción nos permiten manejar grandes volúmenes de tráfico HTTP y ruta con
inteligencia, de una manera bastante transparente. También recibimos a utilizar todos
los controles de seguridad con- disponibles con HTTP para asegurar nuestras
comunicaciones. A partir de autenticación básica de certificados de clientes, el
ecosistema HTTP nos da una gran cantidad de herramientas para hacer más fácil el
proceso de seguridad, y vamos a explorar este tema más enCapítulo 9. Dicho esto,
para obtener estos beneficios, usted tiene que utilizar HTTP también. Usar mal, y
puede ser tan insegura y difícil de escalar a medida que cualquier otra tec- nología
por ahí. Utilice bien, sin embargo, y se obtiene una gran cantidad de ayuda.
RESTO | 51
Tenga en cuenta que HTTP se puede utilizar para implementar RPC también. SOAP,
por ejemplo, va a parar a través de HTTP, pero desafortunadamente utiliza muy poco
de la especificación. Los verbos son ignorados, como son las cosas simples, como
códigos de error HTTP. Con demasiada frecuencia, al parecer, el vigente, bien
52| Capítulo 4: Integración
Estándares y Tecnología entendidos son ignorados en favor de nuevas normas que
sólo se pueden implementar utilizando tecnología de nuevo convenientemente
proporcionada por las mismas compañías que ayudan a diseñar las nuevas normas en
el primer lugar!
Hipermedia como el motor del estado de la aplicación
Otro principio introducido en REST que puede ayudar a evitar el acoplamiento entre
el cliente y el servidor es el concepto de hipermedia como el motor del estado de la
aplicación (a menudo abreviado como HATEOAS, y chico, no lo necesitan una
abreviatura). Esto es bastante densa redacción y un concepto bastante interesante, así
que vamos a romper un poco.
Hipermedia es un concepto por el cual un fragmento de contenido contiene enlaces a
otros elementos de contenido en una variedad de formatos (por ejemplo, texto,
imágenes, sonidos). Esto debe ser muy familiar para usted, ya que es lo que hace la
página web promedio: usted sigue los enlaces, que son una forma de controles
hipermedia, para ver contenido relacionado. La idea detrás de HATEOAS es que los
clientes deben realizar interacciones (que puede conducir a transiciones de estado)
con el servidor a través de estos enlaces a otros recursos. No necesita saber
exactamente donde los clientes viven en el servidor por saber qué URI para golpear;
en cambio, el cliente busca y navega enlaces para encontrar lo que necesita.
Esto es un poco de un concepto extraño, así que vamos primer paso atrás y
considerar cómo las personas inter-actuar con una página web, que ya hemos
establecido es rico con los controles de hipermedia.
Piense en el sitio de compras en Amazon.com. La ubicación de la cesta de la compra
ha cambiado con el tiempo. El gráfico ha cambiado. El enlace ha cambiado. Pero a
medida que los seres humanos somos lo suficientemente inteligente como para seguir
viendo un carro de compras, saber lo que es, e interactuar con él. Tenemos una
comprensión de lo que significa un carrito de compras, aunque la forma exacta y
control subyacente utilizado para representarla ha cambiado. Sabemos que si
queremos ver el carro, esto es el control que queremos interactuar con él. Esta es la
razón por páginas web pueden cambiar gradualmente con el tiempo. Mientras se
siguen cumpliendo estos contratos implícitos entre el al cliente central y el sitio web,
los cambios no tienen que estar rompiendo cambios.
Con controles hipermedia, que están tratando de lograr el mismo nivel de inteligencia
para nuestros consumidores electrónicos. Veamos un control hipermedia que
podríamos tener para MusicCorp. Hemos accedido a un recurso que representa una
entrada de catálogo para un álbum dado enEjemplo 4-2. Junto con la información
sobre el álbum, vemos una serie de controles de medios hiper.
Ejemplo 4-2. hipermedia controles utilizados en una lista álbum
<Álbum>
RESTO | 53
<Nombre>Donar sangre</ Name>
<link rel ="/artista" href ="/ artista / theBrakes" />
<Description>
Impresionante, corta, brutal, divertido y ruidoso. ¡Debes comprar!
</ Description>
54| Capítulo 4: Integración
<link rel ="/ Instantpurchase" href ="/ InstantPurchase / 1234" />
</ Álbum>
Este control hipermedia nos muestra dónde encontrar la información sobre el
artista. Y si queremos comprar el álbum, ahora sabemos a dónde ir.
En este documento, tenemos dos controles hipermedia. El cliente de la lectura de un docu- tales
ción necesita saber que un control con una relación del artista es donde necesita la
Navegación puerta para obtener información sobre el artista, y que instantpurchase es
parte del protocolo utilizado para comprar el álbum. El cliente tiene que entender la
semántica de la API o menos de la misma manera que un ser humano tiene que
entender que en un sitio web de ping tienda- el carro es donde los elementos para ser
adquiridos serán.
Como cliente, no necesito saber qué esquema URI para acceder a comprar el disco,
sólo necesito para acceder al recurso, encontrar el control de compra, y vaya a eso. El
Trol con- compra podría cambiar la ubicación, el URI podría cambiar, o en el sitio
podría incluso me envíe a otro servicio por completo, y como un cliente que no le
importaría. Esto nos da una enorme cantidad de desacoplamiento entre el cliente y el
servidor.
Nosotros se abstraen en gran medida del detalle subyacente aquí. Podríamos cambiar
completamente la implementación de cómo se presenta siempre el control como el
cliente todavía puede encontrar un control que coincide con su comprensión del
protocolo, de la misma manera que un control carrito de la compra puede pasar de ser
un simple enlace a una más compleja control de JavaScript. También es libre de
añadir nuevos controles al documento, tal vez representando nuevas transiciones de
estado que podemos realizar sobre el recurso en cuestión. Nos gustaría terminar
rompiendo nuestros consumidores sólo si cambiamos radicalmente la semántica de
uno de los controles por lo que se comportó de manera muy diferente, o si quitamos
un control completo.
El uso de estos controles para desacoplar el cliente y el servidor proporciona
beneficios significativos en el tiempo que compensan en gran medida el pequeño
aumento en el tiempo que se necesita para obtener estos protocolos en
funcionamiento. Siguiendo los enlaces, el cliente obtiene a descubrir
progresivamente la API, que puede ser una capacidad muy útil cuando estamos
implementando nuevos clientes.
Una de las desventajas es que esta navegación de los controles puede ser muy
hablador, ya que el cliente tiene que seguir los enlaces para encontrar la operación
que desea realizar. En última instancia, esto es una solución de compromiso. Yo
sugeriría que comience con tener a sus clientes a navegar estos controles conprimero, y luego optimizar más tarde si es necesario. Recuerde que tenemos una gran
cantidad de ayuda de la caja mediante el protocolo HTTP, que hemos comentado
anteriormente. Los males de la optimización prematura han sido bien documentados
RESTO | 55
antes, así que no es necesario ampliar sobre ellos aquí. También tenga en cuenta que
muchos de estos enfoques se han desarrollado para crear sistemas de hipertexto distribuido, y no todos ellos en forma! A veces se encontrará que sólo quieren buena
RPC pasada de moda.
56| Capítulo 4: Integración
Personalmente, soy un fan de la utilización enlaces para permitir a los consumidores
a navegar por los puntos finales de API. Los beneficios de descubrimiento progresivo
de la API y el acoplamiento puede ser reducida no puede signifi-. Sin embargo, está
claro que no todo el mundo se vende, ya que no veo que sea utilizado en cualquier
lugar cerca tanto como me gustaría. Creo que una gran parte de esto es que hay algo
de trabajo por adelantado inicial requerida, pero las recompensas a menudo vienen
después.
JSON, XML, o algo más?
El uso de formatos de texto estándar ofrece a sus clientes una gran flexibilidad en
cuanto a cómo mismos consumen recursos, y descansar sobre HTTP nos permite
utilizar una variedad de formatos. Los ejemplos que he dado hasta ahora utilizan
XML, pero en esta etapa, JSON es un mucho más popular tipo de contenido para
servicios que funcionan a través de HTTP.
El hecho de que JSON es un formato mucho más simple significa que el consumo es
también más fácil. Algunos defensores también citan su compacidad relativa en
comparación con XML como otro factor ganador, aunque esto no suele ser un
problema del mundo real.
JSON tiene algunas desventajas, sin embargo. XML define el control de enlace
utilizamos oído: Lier como control hipermedia. El estándar JSON no define nada
parecido, por lo que en la casa estilos se utilizan con frecuencia para calzador este
concepto. Lahipertexto Idioma de la aplicación (HAL) los intentos de solucionar este
problema mediante la definición de algunos SDRA Standards comunes para los
hipervínculos para JSON (XML y también, aunque sin duda XML necesita menos
ayuda). Si sigue la HAL estándar, puede utilizar herramientas como el navegador
HAL basado en la web para explorar controles hipermedia, que puede hacer la tarea
de crear un ent CLI- mucho más fácil.
No estamos limitados a estos dos formatos, por supuesto. Podemos enviar casi
cualquier cosa a través de HTTP, si queremos, incluso binario. Estoy viendo más y
más gente simplemente utilizando HTML como un formato en lugar de XML. Para
algunas interfaces, el HTML puede hacer una doble función como una interfaz de
usuario y una API, aunque hay trampas que hay que evitar aquí, ya que las
interacciones de un ser humano y una computadora son muy diferentes! Pero sin
duda es una idea atractiva. Hay un montón de programas de análisis de HTML por
ahí, después de todo.
Personalmente, sin embargo, todavía soy un fan de XML. Algunos de soporte de la
herramienta es mejor. Por ejemplo, si quiero extraer sólo ciertas partes de la carga
útil (una técnica que va a maldecir dis- más en“Versiones” en la página 62) Puedo
utilizar XPath, que es un estándar bien entendida con las porciones de soporte de
herramientas, o incluso los selectores CSS, que muchos encuentran IER incluso fácil. Con JSON, tengo JSONPATH, pero esto no es apoyado ampliamente. Me parece
extraño que la gente elige JSON porque es agradable y ligero, a continuación, tratar
RESTO | 57
de empujar los conceptos en él como controles hipermedia que ya existen en XML.
Acepto, sin embargo, que probablemente estoy en la minoría aquí y que JSON es el
formato de elección para la mayoría de la gente!
58| Capítulo 4: Integración
Cuidado con demasiada Conveniencia
Como el descanso se ha vuelto más popular, también lo han hecho los marcos que
nos ayudan a crear servicios web REST. Sin embargo, algunas de estas herramientas
de comercio fuera demasiado en términos de ganancia a corto plazo para el dolor a
largo plazo; al tratar de conseguir que ir rápido, pueden fomentara algunos malos
comportamientos. Por ejemplo, algunos marcos en realidad hacen que sea muy fácil
de tomar simplemente representaciones de base de datos de objetos, deserializar en
objetos en proceso, y luego se exponen directamente a éstos externamente. Recuerdo
que en una conferencia de ver esto demuestra usando la primavera de arranque y citó
como una de las principales ventajas. El acoplamiento inherente que esta
configuración promueve voluntad en la mayoría de los casos causa mucho más dolor
que el esfuerzo requerido para desacoplar adecuadamente estos conceptos.
Hay un problema más general en el juego aquí. Cómo decidimos para almacenar
nuestros datos, y cómo nos exponemos a nuestros consumidores, puede dominar
fácilmente nuestro pensamiento. Uno de los dibujos que vi utilizarse eficazmente por
uno de nuestros equipos fue para demorar la implementación de persistencia
apropiado para el microService, hasta que la interfaz se había estabilizado lo
suficiente. Durante un período transitorio, las entidades se acaba persistieron en un
archivo en el disco local, lo que obviamente no es una solución adecuada a largo
plazo. Esto aseguró que la forma en que los consumidores querían utilizar el servicio
condujo las decisiones de diseño e implementación. La razón dada, que se confirma
en los resultados, es que es demasiado fácil para la manera de almacenar las
entidades de dominio en un almacén de respaldo para influir abiertamente los
modelos que enviamos a través del cable a los colaboradores. Una de las desventajas
de este enfoque es que estamos aplazando el trabajo necesario para cablear nuestro
almacén de datos. Creo que para los nuevos límites del servicio, sin embargo, esto es
un compromiso aceptable.
Los inconvenientes se detuvo encima de HTTP
En términos de facilidad de consumo, no se puede generar fácilmente un resguardo
del cliente para su descanso sobre protocolo de aplicación HTTP como se hace con
RPC. Sin duda, el hecho de que HTTP está siendo utilizado significa que se llega a
tomar ventaja de todas las excelentes bibliotecas de cliente HTTP por ahí, pero si se
desea implementar y utilizar los controles de hipermedia como un cliente que está
bastante por su propia cuenta. En lo personal, creo que las bibliotecas de cliente
podrían hacer mucho mejor en esto que lo hacen, y son sin duda mejor ahora que en
el pasado, pero he visto este aparente aumento del resultado de la complejidad en las
personas recaídos en RPC contrabando a través de HTTP o bibliotecas de cliente de
construcción compartida. código compartido entre el cliente y el servidor puede ser
muy peligroso, como veremos en"SECO y el Los peligros de la reutilización de
código en un mundo Microservice”en la página 59.
Un punto más importancia es que algunos marcos de servidor web en realidad no
RESTO | 59
soportan bien todos los verbos HTTP. Eso significa que podría ser fácil para usted
para crear un controlador para peticiones GET o POST, pero puede que tenga que
pasar por el aro para conseguir poner o eliminar solicitudes para trabajar. marcos
descanso adecuado como Jersey no tienen este proble- ma, y que normalmente
pueden solucionar este problema, pero si usted está bloqueado en ciertas opciones de
trabajo marco esto podría limitar qué estilo de REST que puede utilizar.
60| Capítulo 4: Integración
El rendimiento también puede ser un problema. RESTO sobre cargas útiles HTTP en
realidad puede ser más compacto que el jabón porque es compatible con formatos
alternativos como JSON o incluso binario, pero todavía estará lejos de ser tan
delgado como un protocolo binario Thrift podría ser. La cabeza excesiva de HTTP
para cada solicitud también puede ser una preocupación para los requisitos de baja
latencia.
HTTP, mientras que puede ser adecuado también para grandes volúmenes de tráfico,
no es muy grande para las comunicaciones de baja latencia en comparación con los
protocolos alternativos que se construyen en la parte superior de Protocolo de
Control de Transmisión (TCP) u otra tecnología de red. A pesar del nombre,
WebSockets, por ejemplo, tiene muy poco que ver con la Web. Después del saludo
inicial de HTTP, que es sólo una conexión TCP entre el cliente y el servidor, pero
puede ser una manera mucho más eficiente para la emisión continua de datos para un
navegador. Si esto es algo que le interesa, tenga en cuenta que usted no está
realmente utilizando gran parte de HTTP, y mucho menos Any-que hay que hacer
con el descanso.
Para las comunicaciones de servidor a servidor, si una latencia extremadamente baja
o el tamaño pequeño mensaje es importante, las comunicaciones HTTP en general
puede no ser una buena idea. Es posible que necesite para recoger diferentes
protocolos subyacentes, como el Protocolo de datagramas de usuario (UDP), para
lograr el rendimiento que desea, y muchos marcos RPC felizmente ejecutar en la
parte superior de protocolos de red distintos de TCP.
El consumo de las cargas útiles a sí mismos requiere más trabajo que es
proporcionado por algunas implementaciones RPC que soportan los mecanismos de
serialización y deserialización avanzadas. Estos pueden convertirse en un punto de
acoplamiento por derecho propio entre cliente y servidor, como la aplicación de los
lectores tolerantes es una actividad trivial (hablaremos de esto en breve), pero desde
el punto de vista de levantarse y correr, que puede ser muy atractivo.
A pesar de estas desventajas, REST a través de HTTP es una opción por defecto
razonable para las interacciones servicio- a-servicio. Si quieres saber más,
recomiendoRESTO EN LA PRÁCTICA (O'Reilly), que cubre el tema de REST a
través de HTTP en profundidad.
La implementación asíncrona Colaboración basado en
eventos
Hemos hablado un poco acerca de algunas tecnologías que pueden ayudar a
implementar patrones de petición / respuesta. ¿Qué pasa con la comunicación
asíncrona basada en eventos?
opciones de tecnología
La implementación asíncrona colaboración basado en
eventos | 55
Hay dos partes principales que tenemos que considerar aquí: una manera para que
nuestros microservicios que emiten eventos, y una forma para que los consumidores
han sucedido nuestros para encontrar esos eventos.
Tradicionalmente, los intermediarios de mensajes como RabbitMQ tratan de manejar
ambos problemas. pro- ductores utilizan una API para publicar un evento para el
corredor. El agente se encarga de suscripciones, lo que permite a los consumidores a
ser informados cuando llega un evento. Estos corredores pueden incluso manejar el
estado de los consumidores, por ejemplo, ayudando a mantener un registro de qué
mensajes
56| Capítulo 4: Integración
que han visto antes. Estos sistemas están diseñados normalmente para ser escalable y
resil- ient, pero eso no viene de forma gratuita. Se puede añadir complejidad al
proceso de desarrollo, ya que es otro sistema puede que tenga que ejecutar para
desarrollar y probar sus servicios. máquinas y conocimientos adicionales también
pueden ser necesarios para mantener esta infraestructura en funcionamiento. Pero una
vez que lo hace, puede ser una manera muy eficaz para implementar arquitecturas
orientadas a eventos de forma flexible. En general, yo soy un fan.
No tener cuidado, sin embargo, sobre el mundo del middleware, de los cuales el
intermediario de mensajes es sólo una pequeña parte. Colas en sí mismas son útiles,
cosas perfectamente razonables. Sin embargo, los vendedores tienden a querer
empaquetar un montón de software con ellos, que pueden conducir a más y más
inteligencia siendo empujados hacia el middleware, como se evidencia por cosas
como el bus de servicios empresariales. Asegúrese de saber lo que está recibiendo:
mantener su middleware mudo, y mantener la inteligencia en los puntos finales.
Otro enfoque es tratar de utilizar HTTP como una forma de propagar eventos.
ATOM es una especificación REST-compatible que define la semántica (entre otras
cosas) para los piensos Lishing pu- de recursos. Existen muchas bibliotecas de cliente
que nos permitirá crear y consumen por estas fuentes. Por lo que nuestro servicio al
cliente sólo podría publicar un evento para tal alimentación cuando nuestros cambios
en el servicio al cliente. Nuestros consumidores simplemente sondean la
alimentación, en busca de cambios. Por un lado, el hecho de que podemos reutilizar
la especificación ATOM existente y las librerías asociadas es útil, y sabemos que
maneja HTTP escalar muy bien. Sin embargo, HTTP no es bueno a baja latencia
(donde algunos intermediarios de mensajes Excel), y todavía tenemos que lidiar con
el hecho de que los consumidores necesitan para realizar un seguimiento de lo que
los mensajes que han visto y gestionar su propio programa de sondeo.
He visto personas pasan la implementación de una edad cada vez más de los
comportamientos que se obtienen fuera de la caja con un intermediario de mensajes
adecuada para hacer el trabajo ATOM para algunos casos de uso. Por ejemplo, el
patrón del Consumidor Competir describe un método por el que abrir varias
instancias del trabajador para competir por los mensajes, que funciona bien para la
ampliación del número de trabajadores de manejar una lista de trabajos
independientes. Sin embargo, queremos evitar el caso de que dos o más trabajadores
ven el mismo men- saje, como vamos a terminar haciendo la misma tarea más de lo
que necesitamos. Con un intermediario de mensajes, una cola estándar se encargará
de esto. Con ATOM, ahora tenemos que gestionar nuestro propio estado compartida
entre todos los trabajadores para tratar de reducir las posibilidades de reproducción
de esfuerzo.
Si ya tiene una buena, intermediario de mensajes resistentes disponibles para usted,
considere usarlo para manejar la publicación y la suscripción a los eventos. Pero si
usted no tiene ya uno, dar ATOM un vistazo, pero estar al tanto de la falacia costo
hundido. Si usted se encuentra con ganas de más y más del apoyo que un
La implementación asíncrona colaboración basado en
eventos | 57
intermediario de mensajes le da, en cierto punto es posible que desee cambiar su
enfoque.
En términos de lo que en realidad enviar a través de estos protocolos asíncronos, las
mismas consideraciones se aplican al igual que con la comunicación sincrónica. Si
actualmente se encuentra feliz con las peticiones y las respuestas de codificación
utilizando JSON, palo con ella.
58| Capítulo 4: Integración
Complejidades de asincrónicos Arquitecturas
Algunas de estas cosas asíncrono parece divertido, ¿verdad? arquitecturas
controladas por eventos parecen conducir a sistemas significativamente más
desacoplados y escalables. Y que pueden. Pero estos estilos programa- ción conducen
a un aumento de la complejidad. Esto no es sólo la complejidad requerida para
gestionar la publicación y la suscripción a los mensajes que acabamos de discutir,
sino también en los otros problemas que podría enfrentar. Por ejemplo, cuando se
considera a largo corriendo petición asincrónico / respuesta, tenemos que pensar en
qué hacer cuando llega la respuesta. ¿Viene de nuevo al mismo nodo que inició la
solicitud? Si es así, ¿y si ese nodo está inactivo? Si no es así, ¿necesito para
almacenar información en algún lugar para que pueda actuar en consecuencia?
asíncrono de corta duración puede ser más fácil de manejar si usted tiene las API
adecuadas, pero aún así,
Hora para una advertencia. Ya en 2006, yo estaba trabajando en la construcción de un
sistema de fijación de precios para un banco. Miraríamos eventos del mercado, y
calcular con qué elementos en una cartera necesitaba ser repriced. Una vez que se
determinó la lista de cosas para trabajar a través, ponemos todos éstos en una cola de
mensajes. Estábamos haciendo uso de una rejilla para crear un grupo de trabajadores
de precios, lo que nos permite escalar hacia arriba y abajo de la granja de precios
bajo petición. Estos trabajadores utilizan el patrón de consumo que compiten, cada
uno engullendo mensajes tan rápido como sea posible hasta que no quedaba nada
para procesar.
El sistema estaba en funcionamiento, y que se sentía bastante presumida. Un día, sin
embargo, justo después de que empujó a cabo un comunicado, llegamos a un
problema desagradable. Nuestros trabajadores mantienen morir. Y muriendo. Y
muriendo.
Con el tiempo, nos ubicaron el problema. Un error en el que se había introducido un
cierto tipo de solicitud de fijación de precios haría que un trabajador se bloquee.
Estábamos usando una cola de transacción: como murió el trabajador, su cerradura de
la solicitud ha caducado, y la solicitud de fijación de precios se volvió a poner en la
cola sólo por otro trabajador para recogerlo y morir. Este fue un ejemplo clásico de lo
que Martin Fowler llama unaconmutación por error catastrófico.
Aparte del propio insecto, que había fallado para especificar un límite máximo de
reintentos para el trabajo en la cola. Hemos corregido el error en sí, y también
configurado un máximo de reintentos. Pero también nos dimos cuenta que
necesitábamos una manera de ver, y potencialmente jugar de nuevo, estos malos
mensajes. Terminamos tener que implementar un hospital mensaje (o cola de
mensajes), donde jes sabios fue expulsado si fallaban. También hemos creado una
interfaz de usuario para acceder a esos mensajes y vuelva a intentar si es necesario.
Este tipo de problemas no son inmediatamente obvias si sólo está familiarizado con
la comunicación sincrónica de punto a punto.
La implementación asíncrona colaboración basado en
eventos | 59
La complejidad asociados con las arquitecturas orientadas a eventos y programación asíncrona, en general, me lleva a creer que usted debe tener cuidado en la
forma de empezar con impaciencia la adopción de estas ideas. Asegúrese de que
tiene un buen seguimiento en su lugar, y considerar seriamente el uso de
identificadores de correlación, que le permite rastrear solicitudes a través de los
límites del proceso, ya que vamos a cubrir en profundidad enCapítulo 8.
60| Capítulo 4: Integración
También recomiendo encarecidamente patrones de integración empresarial (AddisonWesley), que contiene muchos más detalles sobre los diferentes patrones de
programación que puede que tenga que tener en cuenta en este espacio.
Servicios como Máquinas de Estado
Ya sea que elija para convertirse en un ninja REST, o un palo con un mecanismo
basado en RPC como el jabón, el concepto básico del servicio como una máquina de
estados es de gran alcance. Hemos hablado antes (probablemente hasta la saciedad
por este punto) sobre nuestros servicios siendo fash- ioned alrededor delimitada
contextos. Nuestra microService cliente posee toda la lógica asociada con el
comportamiento en este contexto.
Cuando un consumidor quiere cambiar un cliente, envía una solicitud apropiada para
el servicio al cliente. El servicio al cliente, sobre la base de su lógica, puede decidir si
acepta esa solicitud o no. Nuestro servicio al cliente controla todos los eventos del
ciclo de vida asociados con el propio cliente. Queremos evitar que los servicios
mudos, anémicos que son poco más que envoltorios CRUD. Si la decisión sobre lo
que se permite cambios a realizar a una fuga de clientes de la propia atención al
cliente, estamos perdiendo la cohesión.
Tener el ciclo de vida de los conceptos clave de dominio modelados de forma
explícita como este es muy poderoso. No sólo tenemos un lugar para hacer frente a
las colisiones de estado (por ejemplo, alguien que intenta actualizar un cliente que ya
ha sido eliminado), pero también tenemos un lugar para fijar el comportamiento
basado en los cambios de estado.
Todavía pienso que descansan sobre HTTP hace que para una integración mucho
más sensato tecnologıa que muchos otros, pero lo que sea que elija, mantener esta
idea en mente.
Extensiones reactivas
extensiones reactivas, A menudo abreviado como Rx, son un mecanismo para
componer los resultados de múltiples llamadas entre sí y ejecutar operaciones sobre
ellos. Las llamadas a sí mismos podrían estar bloqueando o sin bloqueo de llamadas.
En el fondo, Rx invierte flujos tradicionales. En lugar de pedir algunos datos, a
continuación, realizar operaciones en él, se observa el resultado de una operación (o
conjunto de operaciones) y reaccionar cuando algo cambia. Algunas
implementaciones de Rx le permiten realizar funciones de estos observables, tales
como RxJava, lo que permite que las funciones tradicionales como mapa o un filtro
para usarse.
Las diversas implementaciones Rx han encontrado un hogar muy feliz en siste- mas
distribuidos. Ellos nos permiten abstraer los detalles de cómo se hacen las llamadas,
y la razón de las cosas más fácilmente. Observo el resultado de una llamada a un
servicio de aguas abajo. No me importa si era una llamada de bloqueo o sin bloqueo,
La implementación asíncrona colaboración basado en
eventos | 61
sólo tiene que esperar por la respuesta y de reacción. La belleza es que puedo
componer varias llamadas en conjunto, por lo que el manejo de llamadas simultáneas
a los servicios de aguas abajo mucho más fácil.
62| Capítulo 4: Integración
A medida que se encuentra haciendo más llamadas de servicio, especailly al realizar
varias llamadas para realizar una sola operación, echar un vistazo a las extensiones
de reactivos para su pila tecnología elegida. Usted se sorprenderá de lo mucho más
simple su vida puede llegar a ser.
Seco y los peligros de la reutilización de código en un
mundo Microservice
Uno de los acrónimos nosotros los desarrolladores oye mucho es seco: No te repitas.
A pesar de su definición a veces se simplifica como tratando de evitar la duplicación
de código, DRY significa más precisión que queremos evitar la duplicación de
nuestro comportamiento del sistema y El conocimiento. Este es un consejo muy
sensible en general. Tener una gran cantidad de líneas de código que hacen lo mismo
que hace que su código base más grande de lo necesario, y por lo tanto más difícil de
razonar acerca. Cuando desee cambiar el comportamiento, y que el comportamiento
se repite en muchas partes de su sistema, es fácil olvidar todas partes que necesita
para hacer un cambio, que puede conducir a errores. Así, utilizando seco como un
mantra, en general, tiene sentido.
DRY es lo que nos lleva a crear código que puede ser reutilizado. Tiramos código
duplicado en abstracciones que entonces podemos llamar desde múltiples lugares.
Tal vez vamos tan lejos como MAK- ing una biblioteca compartida que se puede
utilizar en todas partes! Este enfoque, sin embargo, puede ser engañosamente
peligrosa en una arquitectura microService.
Una de las cosas que queremos evitar a toda costa es un acoplamiento excesivamente
microService y los consumidores de manera que cualquier pequeño cambio en la
propia microService puede causar cambios innecesarios para el consumidor. A veces,
sin embargo, el uso de código compartido puede crear este mismo acoplamiento. Por
ejemplo, a un cliente que tenía una biblioteca de objetos de dominio común que
representaban las entidades centrales en uso en nuestro sistema. Esta biblioteca fue
utilizada por todos los servicios que teníamos. Pero cuando se hizo un cambio a uno
de ellos, todos los servicios tenían que ser actualizado. Nuestro sistema comunica a
través de colas de mensajes, que también tenían que ser drenado de su contenido
ahora no válidas, y pobre del que si se le olvidó.
Si el uso de código compartido siempre se escapa fuera de su límite de servicio, que
ha introducido unas una forma potencial de acoplamiento. El uso de código común
como bibliotecas madereras está muy bien, ya que son conceptos internos que son
invisibles para el mundo exterior. RealEstate.com.au hace uso de una plantilla de
servicio a medida para ayudar a bootstrap creación de nuevos servicios. En lugar de
hacer este código compartido, la empresa lo copia para cada nuevo servicio para
asegurar que el acoplamiento no se escapa en.
Mi regla general: no violan DRY dentro de un microService, pero estar relajado en
violar seco a través de todos los servicios. Los males del exceso de acoplamiento
entre servi- cios son mucho peores que los problemas causados por la duplicación de
código. Hay un caso de uso específico vale la pena explorar más lejos, sin embargo.
bibliotecas de cliente
He hablado con más de un equipo que ha insistido en que la creación de bibliotecas
de cliente para sus servicios es una parte esencial de la creación de servicios en el
primer lugar. El argumento
Seco y los peligros de la reutilización de código en un mundo Microservice |
59
64| Capítulo 4: Integración
es que esto hace que sea fácil de usar su servicio, y evita la duplicación de código
necesario para consumir el servicio en sí.
El problema, por supuesto, es que si las mismas personas crean tanto la API de
servidor y el cliente API, existe el peligro de que la lógica que debe existir en el
servidor comienza a escaparse en el cliente. Que debo saber: He hecho esto por mí
mismo. La más lógica que se arrastra en la biblioteca de cliente, los más arranques de
cohesión a descomponer, y usted se encuentra ING hav- cambiar varios clientes a
desplegar correcciones a su servidor. También limitar las opciones tec- nología,
especialmente si el mandato de que la biblioteca cliente tiene que ser utilizado.
Un modelo para las bibliotecas de cliente que me gusta es el de Amazon Web
Services (AWS). El jabón o REST llamadas de servicio web subyacentes se pueden
hacer directamente, pero todos terminan usando sólo uno de los diversos kits de
desarrollo de software (SDK) que existen, que proporcionan abstracciones más de la
API subyacente. Estos SDK, sin embargo, son escritos por la comunidad o pueblo
AWS distintos de los que trabajan en la misma API. Este grado de separación parece
funcionar, y evita algunos de los problemas de las bibliotecas de cliente. Parte de la
razón por la que esto funciona tan bien es que el cliente tiene a su cargo cuando las
plumas HAP actualización. Si vas por el camino de Bibliotecas de cliente usted
mismo, asegúrese de que este es el caso.
Netflix en particular, pone especial énfasis en la biblioteca de cliente, pero me
preocupa que la gente ve que simplemente a través de la lente de evitar la duplicación
de código. De hecho, las bibliotecas ent CLI- utilizados por Netflix son tanto (si no
más) trata de garantizar la fiabilidad y escalabilidad de sus sistemas. Las bibliotecas
de cliente de Netflix manejan descubrimiento de servicios, modos de perecer; ure,
registro y otros aspectos que no son realmente acerca de la naturaleza del servicio en
sí. Sin estos clientes compartidos, sería difícil asegurar que cada pieza de
comunicaciones cliente / servidor se comportó bien en la escala masiva en la que ates
Netflix oper-. Su uso en Netflix sin duda ha hecho que sea fácil de poner en marcha y
una mayor productividad garantizando al mismo tiempo el sistema se comporta bien.
Sin embargo, accord- ing a por lo menos una persona en Netflix,
Si el enfoque de biblioteca cliente es algo que está pensando, puede ser importante
separar el código del cliente para manejar el protocolo de transporte subyacente, que
puede hacer frente a cosas como el descubrimiento de servicios y el fracaso, de lo
relacionado con el servicio de su destino en sí . Decidir si o no se va a insistir en la
biblioteca de cliente que se utiliza, o si lo permiten las personas que utilizan la
tecnología de pilas diferentes para realizar llamadas a la API subyacente. Y, por
último, nos aseguramos de que los clientes están a cargo de cuándo actualizar sus
bibliotecas de cliente: tenemos que asegurarnos de que mantenemos la capacidad de
liberar nuestros servicios de forma independiente el uno del otro!
El acceso de Referencia
60| Capítulo 4: Integración
Una consideración que quiero mencionar es cómo se pasa alrededor de la
información acerca de nuestras entidades de dominio. Necesitamos abrazar la idea de
que un microService abarcará el
ciclo de vida de nuestras entidades de dominio principales, como el Cliente. Ya
hemos hablado de la importancia de la lógica asociada con el cambio de
esteCliente que se celebra en el servicio al cliente, y que si queremos cambiar
lo que tenemos que emitir una solicitud al servicio al cliente. Pero también se
deduce que debemos tener en cuenta el servicio al cliente como la fuente de
la verdad paraClientes.
Cuando recuperamos un determinado Cliente recurso de la atención al cliente,
vamos a ver lo que parecía recursos cuando hicimos la petición. Es posible que
después de que habíamos pedido queCliente de recursos, algo más ha cambiado.
Lo que tenemos enefecto es un recuerdo de lo que el Cliente de recursos una
vez que parecía. Cuanto más tiempo nos aferramos a esta memoria, mayor
será la probabilidad de que esta memoria será falsa. Por supuesto, si evitamos
la solicitud de datos más que necesitamos, nuestros sistemas pueden llegar a
ser mucho más eficiente.
A veces esta memoria es lo suficientemente bueno. Otras veces lo que
necesita saber si ha cambiado. Así que si usted decide pasar alrededor de un
recuerdo de lo que una vez que una entidad parecía, asegúrese de que
también incluyen una referencia al recurso original, de modo que el nuevo
estado puede ser recuperada.
Vamos considere el ejemplo donde pedimos el servicio de correo electrónico para
enviar un correo electrónico cuando un pedido ha sido enviado. Ahora
podríamos enviar la solicitud al servicio de correo electrónico con los detalles
dirección de correo electrónico, el nombre y el pedido del cliente. Sin embargo, si
el servicio de correo electrónico esen realidad haciendo cola estas solicitudes, o
tirando de ellos de una cola, las cosas podrían cambiar en el ínterin. Podría
tener más sentido, envíanos un URI para elCliente y Orden recursos, y dejar
que el servidor de correo electrónico ir mirar hacia arriba cuando es el
momento de enviar el correo electrónico.
Una gran contrapunto a esto surge cuando consideramos la colaboración basada
en eventos. Con eventos, estamos diciendo que esto sucediera, pero necesitamos
saber lo que pasó. Si estamos recibiendo actualizaciones debido a unaCliente
cambio de recursos, por ejemplo, podría ser Val- uable para nosotros saber lo que
el Cliente que parecía que se produjo el evento. En tantocomo también obtener
una referencia a la propia entidad para que podamos mirar hacia arriba su
estado actual, entonces podemos obtener lo mejor de ambos mundos.
Hay otras soluciones de compromiso que se hizo aquí, por supuesto, cuando
estamos accediendo por referen- cia. Si siempre nos vamos a la atención al cliente
para mirar la información asociadacon un dado Cliente, La carga en el servicio
al cliente puede ser demasiado grande. Si nos pro- vide información
adicional cuando se recupere el recurso, que nos deja saber en qué momento
el recurso estaba en el estado dado y tal vez cuánto tiempo podemos
considerar
esta información para ser fresco, entonces podemos hacer mucho
62| Capítulo 4: Integración
con el almacenamiento en caché para reducir la carga . HTTP nosotros gran
parte de este apoyo da fuera de la caja con una amplia variedad de controles
de caché, algunos de los cuales hablaremos con más detalle enCapítulo 11.
Otro problema es que algunos de nuestros servicios que no necesite saber
sobre el conjunto Cliente recursos, y al insistir en que van búsquelo somos
potencialmente
El acceso de Referencia | 61
el aumento de acoplamiento. Se podría argumentar, por ejemplo, que nuestro servicio
de correo electrónico debe ser más tonto, y que sólo debe enviar la dirección de
correo electrónico y el nombre del al cliente central. No hay una regla dura y rápida
aquí, pero ser muy cuidadosos de que pasa alrededor de los datos en las solicitudes
cuando no conoce su frescura.
de versiones
En cada charla que he hecho sobre microservicios, me pregunta ¿cómo se hace de
versiones? La gente tiene la preocupación legítima de que, finalmente, van a tener
que realizar un cambio en la interfaz de un servicio, y quieren entender cómo
manejar eso. Vamos a romper el problema un poco y mirar a las diversas medidas
que podemos tomar para manejarlo.
Aplazar durante tanto tiempo como sea posible
La mejor manera de reducir el impacto de hacer cambios de última hora es evitar
hacerlas en el primer lugar. Se puede lograr mucho de esto tomando la tecnología de
integración de la derecha, como hemos discutido en este capítulo. la integración de
bases de datos es un gran ejemplo de tecnología que puede hacer que sea muy difícil
de evitar cambios de ruptura. REST, por el contrario, ayuda porque los cambios en
los detalles de implementación interna es menos probable que resulte en un cambio
en la interfaz de servicio.
Otra clave para el aplazamiento de un cambio importante es fomentar el buen
comportamiento de sus clientes y evitar dichas prácticas con demasiada fuerza
vinculante a sus servicios en el primer lugar. Vamos a considerar nuestro servicio de
correo electrónico, cuyo trabajo consiste en enviar correos electrónicos a nuestros
clientes de vez en cuando. Se pone pidió que enviara una orden de correo electrónico
enviado a los clientes con el ID 1234. Se apaga y recupera al cliente con ese ID, y
vuelve algo así como la respuesta se muestra en laEjemplo 4-3.
Ejemplo 4-3. Ejemplo de respuesta desde el servicio al cliente
<Cliente>
<Nombre>Sam</ Apellido>
<Apellido>Hombre nuevo</ Apellido>
<Correo electrónico>[email protected]</ Email>
<TelephoneNumber>555-1234-5678</ TelephoneNumber>
</ Cliente>
Ahora para enviar el correo electrónico, necesitamos sólo el nombre, apellido y
campos de correo electrónico. No necesitamos saber la telephoneNumber. Queremos
sacar simplemente aquellos campos que nos interesan, e ignorar el resto. Algunas
tecnologías de unión, especialmente la utilizada por idiomas inflexible, se puede
tratar de obligar a todos los campos si el consumidor los quiere o no. ¿Qué pasa si
nos damos cuenta de que nadie está utilizando el telephoneNumber y decidimos
62| Capítulo 4: Integración
quitarlo? Esto podría hacer que los consumidores se rompan innecesariamente.
de versiones | 63
Del mismo modo, lo que si queríamos para reestructurar nuestro objeto de atención al
cliente para que admita más detalles, tal vez añadiendo alguna otra estructura como
en Ejemplo 4-4? Los datos de nuestro servicio de correo electrónico que quiere es
todavía allí, y aún con el mismo nombre, pero si nuestro código hace suposiciones
muy explícitos en cuanto a donde se almacenarán el apellido y campos Apellidos,
entonces podría romper de nuevo. En este caso, se podría utilizar en su lugar XPath
para extraer los campos que nos interesan, que nos permite ser ambivalente acerca de
donde los campos son, siempre y cuando los podemos encontrar. Este patrón de la
implementación de un lector capaz de ignorar los cambios que no se preocupan por
lo que es-Martin Fowler llama unaLector tolerantes.
Ejemplo 4-4. Un recurso al cliente reestructurado: los datos están todavía allí, pero
nuestros consumidores puede encontrarlo?
<Cliente>
<Naming>
<Nombre>Sam</ Apellido>
<Apellido>Hombre nuevo</ Apellido>
<Apodo>Magpiebrain</ Apodo>
<Nombre completo>Sam "Magpiebrain" Newman</ Nombre completo>
</ Nombrando>
<Correo electrónico>[email protected]</ Email>
</ Cliente>
El ejemplo de un cliente tratando de ser lo más flexible posible en el consumo de un
servicio demuestra Postel de Ley (También conocido como el principio de robustez),
que establece: “Sea conservador en lo que hace, ser liberal en lo que acepta de otros”
El contexto inal orig- para esta pieza de sabiduría era la interacción de dispositivos a
través de redes, donde debe esperar todo tipo de cosas extrañas sucedan. En el
contexto de nuestra interacción petición / respuesta, nos puede llevar a hacer todo lo
posible para que el servicio que se consumen a cambios sin que nos obliga a cambiar.
Coger Breaking cambios tempranos
Sus crucial para asegurarse de que recoger los cambios que rompan los consumidores
tan pronto como sea posible, porque incluso si elegimos la mejor tecnología posible,
se rompe aún pueden ocurrir. Estoy muy a favor de la utilización de contratos
orientados al consumidor, lo que vamos a cubrir enCap- 7 ter, para ayudar a detectar
estos problemas desde el principio. Si usted está apoyando varias bibliotecas ent CLIdiferentes, la ejecución de pruebas utilizando cada biblioteca se apoya contra el
último Service es otra técnica que puede ayudar. Una vez que se da cuenta que se va
a romper un consumidor, usted tiene la opción de o bien tratar de evitar la ruptura por
completo o bien abrazarlo y comenzar a tener las conversaciones correctas con las
personas que cuidan de los servicios que consumen.
64| Capítulo 4: Integración
Uso semántico de versiones
no lo haría sería grande si como cliente usted podría mirar justo en el número de
versión de un ser- vicio y saber si se puede integrar con ella? semántica de versiones
es una especificación que permite precisamente eso. Con versiones semántica, cada
número de versión es en forma MAJOR.MINOR.PATCH. Cuando aumenta el
número MAJOR, significa que se han hecho cambios incompatibles atrasadas.
Cuando incrementos menores, nueva funcionalidad se ha añadido que debe ser
compatible con versiones anteriores. Por último, un cambio al parche de estados que
correcciones de errores han hecho a la funcionalidad existente.
A ver lo útil que puede ser de versiones semántica, vamos a ver un simple caso de
uso. Nuestra aplicación de servicio de asistencia está diseñado para trabajar en contra
de la versión 1.2.0 del servicio al cliente. Si se añade una nueva característica,
haciendo que el servicio al cliente para cambiar a 1.3.0, nuestra solicitud de
asistencia debe ver ningún cambio en el comportamiento y no se debe esperar para
hacer cualquier cambio. No podríamos garantizar que podríamos trabajar en contra
de la versión 1.1.0 del servicio al cliente central, sin embargo, como podemos
depender de mayor funcionalidad en la versión 1.2.0. También se puede esperar a
tener que realizar cambios en nuestra aplicación si una nueva 2.0.0 liberación de la
atención al cliente salga.
Usted puede decidir tener una versión semántica para el servicio, o incluso de un
punto final individual en un servicio si ellos coexisten como se detalla en la siguiente
sección.
Este esquema de versiones nos permite empacar una gran cantidad de información y
expectativas en tan sólo tres campos. La especificación completa describe en
términos muy sencillos los clientes pueden tener expectativas de cambios a estos
números, y pueden simplificar el proceso de com- carse sobre si los cambios deben
afectar a los consumidores. Por desgracia, no he ver este enfoque utilizado lo
suficiente en el contexto de los sistemas distribuidos.
Coexistir diferentes criterios de valoración
Si hemos hecho todo lo posible para evitar la introducción de un cambio en la
interfaz de ruptura, nuestra siguiente tarea es la de limitar el impacto. Lo que
queremos evitar está obligando a los consumidores a actualizar en el bloqueo de paso
con nosotros, ya que siempre queremos mantener la capacidad de liberar ces
microservi- de forma independiente el uno del otro. Uno de los enfoques que se han
utilizado con éxito para manejar esta situación es que coexistan ambas las viejas y
nuevas interfaces en el mismo servicio en ejecución. Así que si queremos conocer un
cambio importante, hacemos uso de una nueva versión del servicio que expone tanto
las viejas y nuevas versiones del punto final.
Esto nos permite obtener la nueva microService a cabo tan pronto como sea posible,
junto con la nueva interfaz, pero dar tiempo para que los consumidores se mueven
de versiones | 65
sobre. Una vez que todos los consumidores ya no están usando el viejo punto final,
puede eliminarlo junto con cualquier código asociado, como se muestra enFigura 4-5.
66| Capítulo 4: Integración
La Figura 4-5. Coexistencia diferentes versiones de punto final permite a los consumidores para
migrar gradualmente
La última vez que utiliza este enfoque, habíamos conseguido nosotros mismos en un
poco de un desastre con el número de consumidores que teníamos y el número de
cambios de última hora que habíamos hecho. Esto significaba que en realidad
estábamos coexistiendo tres versiones diferentes del punto final. Esto no es algo que
recomiendo! Manteniendo todo el código por todas partes y las pruebas, que se
requieren para asegurar que todo funcionaba era absolutamente una carga adicional.
Para que esto sea más manejable, que la transforman todas las peticiones al punto
final V1 a una solicitud V2, V2 y luego solicitudes a la variable V3. Esto significa
que podía delimitar claramente qué código iba a ser retirado cuando el viejo criterio
de valoración (s) murió.
Esta es, en efecto, un ejemplo del patrón de expandirse y contraerse, lo que permite a
la fase de romper los cambios en. Estamos ampliando las capacidades que ofrecemos,
el apoyo a las antiguas y nuevas formas de hacer algo. Una vez que los viejos
consumidores hacen las cosas en la nueva forma, contratamos nuestra API, la
eliminación de la funcionalidad de edad.
Si va a coexistir puntos finales, necesita una forma para que las personas que llaman
a sus peticiones de ruta en consecuencia. Para los sistemas que hacen uso de HTTP,
he visto este hecho con los dos números de versión en los encabezados de solicitud y
también en el mismo, por ejemplo, / v1 / cliente / o / v2 / cliente / URI. Estoy
dividida en cuanto a cuál es el enfoque que tiene más sentido. Por un lado, me gusta
URI siendo opaco para disuadir a los clientes de las plantillas hardcoding URI, pero
por otro lado, este enfoque no hacer las cosas muy evidente y puede simplificar la
solicitud de enrutamiento.
Para RPC, las cosas pueden ser un poco más complicado. He manejado esto con
de versiones | 67
tampones protocolo poniendo mis métodos en los diferentes espacios de nombres,
por ejemplo, v1.createCustomer y v2.createCustomer, pero cuando usted está
tratando de soportar diferentes versiones de los mismos tipos que se envían por la
red, esto puede llegar a ser muy doloroso .
68| Capítulo 4: Integración
El uso de múltiples versiones de servicio concurrentes
Otra solución de versiones a menudo citado es tener diferentes versiones del servicio
en vivo a la vez, y para los consumidores de más edad a la ruta su tráfico a la versión
anterior, con las nuevas versiones viendo la nueva, como se muestra en Figura 4-6.
Este es el enfoque utilizado de forma moderada, por Netflix en situaciones donde el
costo de cambiar consumidores de mayor edad es demasiado alto, especialmente en
los casos excepcionales en los dispositivos heredados todavía están vinculados a las
versiones anteriores de la API. Personalmente, no soy un fan de esta idea, y entiendo
por qué Netflix utiliza raramente. En primer lugar, si necesito para corregir un error
interno en mi servicio, ahora tengo que corregir y desplegar dos conjuntos diferentes de servicios. Esto probablemente significa que tenga que ramificar el código
base para mi servicio, y esto siempre es problemático. En segundo lugar, significa
que necesito inteligencia para manejar dirigir a los consumidores a la microService
derecha. Este comportamiento es inevitable que se sen- tado en algún lugar
intermedio o un montón de guiones nginx, haciendo más difícil a reason sobre el
comportamiento del sistema. Por último, considerar cualquier estado persistente de
nuestro servicio puede gestionar. Los clientes creados por cualquiera de las versiones
del servicio necesitan ser almacenados y se hace visible a todos los servicios,
independientemente de la versión utilizada para crear los datos en el primer lugar.
Esto puede ser una fuente adicional de complejidad.
Figura 4-6. La ejecución de varias versiones de un mismo servicio de apoyo a los puntos finales
de edad
La coexistencia de versiones concurrentes de servicios para un corto período de
tiempo puede hacer mucho sentido, sobre todo cuando estás haciendo las cosas como
las implementaciones azul / verde o lanzamientos de Canarias (vamos a estar
de versiones | 69
discutiendo estos patrones más en Capítulo 7). En estas situaciones, podemos estar
coexistiendo versiones sólo para unos pocos minutos o tal vez horas, y normalmente
sólo habrá dos versiones diferentes del servicio presentes al mismo tiempo. Cuanto
más tiempo se necesita para que usted obtenga los consumidores actualizado a la
versión más reciente y liberados,
70| Capítulo 4: Integración
cuanto más se debe buscar coexistir diferentes criterios de valoración de la misma
microService en lugar de coexistir versiones completamente distintas. Sigo sin estar
convencido de que este trabajo es la pena que el promedio de los proyectos.
Interfaces de usuario
Hasta ahora, no hemos tocado en el mundo de la interfaz de usuario. Algunos de
ustedes por ahí sólo podría ser proporcionar una API de frío, duro, clínica a sus
clientes, pero muchos de nosotros nos encontramos con ganas de crear interfaces de
usuario bellos y funcionales que harán las delicias de nuestros clientes. Pero
realmente necesitamos pensar en ellos en el contexto de la integración. La interfaz de
usuario, después de todo, es donde vamos a estar tirando todos estos ces microservijuntos en algo que tenga sentido para nuestros clientes.
En el pasado, cuando empecé la computación, que eran en su mayoría hablando de
grandes entos, CLI- grasa que se ejecutaban en nuestros escritorios. He pasado
muchas horas con motivo y luego salta tratando de hacer mi software tan agradable
de usar como sea posible. A menudo, estos sistemas eran sólo para la creación y
manipulación de archivos locales, pero muchos de ellos tenían un compo- nente del
lado del servidor. Mi primer trabajo en ThoughtWorks preveía la creación de un
sistema electrónico de punto-a base de oscilación de venta que era sólo una parte de
un gran número de piezas móviles, la mayoría de los cuales estaban en el servidor.
Luego vino la Web. Empezamos a pensar de nuestras interfaces de usuario como ser
delgado en vez, con más lógica en el lado del servidor. En el principio, nuestros
programas de servidor procesa la página entera y la enviaron al navegador del
cliente, lo que hizo muy poco. Cualquier interacciones fueron manejados en el lado
del servidor, a través de GET y POST desencadenados por el usuario haga clic en
enlaces o rellenar formularios. Con el tiempo, JavaScript convirtió en una opción
más popular para añadir comportamiento dinámico a la interfaz de usuario basada en
navegador, y algunas aplicaciones ahora podría argumentar que ser tan gordo como
los antiguos clientes de escritorio.
hacia digital
Durante el último par de años, las organizaciones han comenzado a moverse
lejos de pensar que web o móviles deben ser tratados de manera diferente; que
están pensando en su lugar tal DIGI- más integral. ¿Cuál es la mejor manera para
nuestros clientes a utilizar los servicios que ofrecemos? Y lo que hace eso a
nuestra arquitectura de sistema? El entendimiento de que no podemos predecir
exactamente cómo un cliente podría terminar interactuar con nuestra empresa ha
impulsado la adopción de las API más granulares, como los entregados por
microservicios. Al combinar las capacidades de nuestros servicios exponen en
diferentes formas, podemos comisariar diferentes experiencias para nuestros
clientes en su aplicación de escritorio, dispositivos móviles, weara- dispositivo
ble, o incluso en forma física si visitan nuestra tienda de ladrillo y mortero.
Interfaces de usuario |
67
Así que pensar en las interfaces de usuario como de composición capas lugares en los
que se entrelazan los distintos aspectos de las capacidades que ofrecemos. Así que
con eso en mente, ¿cómo podemos reunir todos estos aspectos juntos?
68| Capítulo 4: Integración
restricciones
Las restricciones son las diferentes formas en las que nuestros usuarios interactúan
con nuestro sistema. En una aplicación web de escritorio, por ejemplo, tenemos en
cuenta las limitaciones tales como lo que los visitantes del navegador están usando, o
su resolución. Pero móvil ha traído toda una serie de nuevas restricciones. La forma
en nuestras aplicaciones móviles se comunican con el servidor puede tener un
impacto. No se trata sólo de problemas de ancho de banda puros, donde las
limitaciones de las redes móviles pueden jugar un papel. Diferentes tipos de
interacciones pueden drenar vida de la batería, lo que lleva a algunos clientes
cruzadas.
La naturaleza de las interacciones cambia, también. No puedo fácilmente haga clic
derecho en una tableta. En un teléfono móvil, es posible que quiera diseñar mi
interfaz que se utiliza sobre todo con una sola mano, con la mayoría de las
operaciones están controladas por un pulgar. En otros lugares, podría permitir que las
personas interactúan con los servicios a través de SMS en lugares donde el ancho de
banda es un bien escaso, el uso de SMS como una interfaz es muy importante en los
países del sur, por ejemplo.
Entonces, A pesar de nuestros servicios de nuestra oferta básica-núcleo podría ser el
mismo, necesitamos una manera de adaptarlos a las diferentes limitaciones que
existen para cada tipo de interfaz. Cuando nos fijamos en los diferentes estilos de
composición interfaz de usuario, tenemos que asegurar que abordan este reto.
Veamos unos pocos modelos de interfaces de usuario para ver cómo esto podría
lograrse.
Composición API
Suponiendo que nuestros servicios ya hablan XML o JSON entre sí a través de
HTTP, una opción obvia disponible para nosotros es tener nuestra interfaz de usuario
interactúan directamente con estas API, como en Figura 4-7. Una interfaz de usuario
basada en la web podría usar JavaScript peticiones GET para recuperar datos, o las
peticiones POST para cambiarlo. Incluso para aplicaciones móviles nativas, iniciando
las comunicaciones HTTP es bastante sencillo. La interfaz de usuario necesitaría
entonces para crear los distintos componentes que conforman la interfaz, el manejo
de la sincronización de estado y similares con el servidor. Si estábamos usando un
protocolo binario para la comunicación de servicio a servicio, esto sería más difícil
para los clientes basados en la web, pero podría estar bien para dispositivos móviles
nativas.
Hay un par de inconvenientes con este enfoque. En primer lugar, tenemos poca
capacidad de ajustar el equilibrio respuestas para diferentes tipos de dispositivos. Por
ejemplo, cuando yo recuperar un registro al cliente central, qué tengo que tirar de
todos los mismos datos para una tienda de teléfonos móviles como hago para una
aplicación de servicio de ayuda? Una solución a este enfoque es que los
Interfaces de usuario |
69
consumidores puedan especificar qué campos de retirarse cuando lo soliciten, pero
esto supone que cada servicio es compatible con esta forma de interacción.
Otra cuestión clave: ¿quién crea la interfaz de usuario? Las personas que se ocupan
de los servicios se eliminan de la forma en que sus servicios son surgieron a los
usuarios, por ejemplo, si otro equipo está creando la interfaz de usuario, que podría
ser la deriva de nuevo en los viejos tiempos de
70| Capítulo 4: Integración
arquitectura en capas, donde haciendo que incluso pequeños cambios requiere
solicitudes de cambio a varios equipos.
La Figura 4-7. El uso de múltiples APIs para presentar una interfaz de usuario
Esta comunicación también podría ser bastante hablador. La apertura de un montón
de llamadas directamente a servi- cios puede ser bastante intensa para los
dispositivos móviles, y podría ser un uso muy ineficiente del plan de telefonía móvil
de un cliente! Tener una puerta de enlace API puede ayudar aquí, ya que podría
exponer a las llamadas que agregan múltiples llamadas subyacentes, a pesar de que
en sí mismo puede tener algunos inconvenientes que vamos a explorar en breve.
Composición UI Fragmento
En lugar de tener nuestra interfaz de usuario hacer llamadas a la API y mapa todo de
nuevo a controles de IU, podríamos tener nuestros servicios de partes de la interfaz
de usuario directamente, y luego simplemente tirar de estos fragmentos para crear
una interfaz de usuario, como en Figura 4-8. Imagínese, por ejemplo, que el servicio
de recomendación proporciona un widget recomendación que se combina con otros
controles o fragmentos de interfaz de usuario para crear una interfaz de usuario en
general. Puede ser que consiga mostrada como un cuadro en una página web, junto
con otros contenidos.
Una variación de este enfoque que puede trabajar bien es ensamblar una serie de
piezas de grano coarser- de una interfaz de usuario. Así que en lugar de crear
pequeños widgets, que está ensamblando paneles enteros de una aplicación de cliente
pesado, o tal vez un conjunto de páginas de un sitio web.
Estos fragmentos de grano más grueso se sirven de las aplicaciones de servidor que a
Interfaces de usuario |
71
su vez están haciendo las llamadas a la API apropiadas. Este modelo funciona mejor
cuando los fragmentos se alinean bien al equipo propiedad. Por ejemplo, tal vez el
equipo que se ocupa de la gestión de pedidos en la tienda de música sirve todas las
páginas asociadas a la gestión de pedidos.
72| Capítulo 4: Integración
La Figura 4-8. Los servicios directamente sirviendo componentes de interfaz de montaje
Todavía es necesario algún tipo de capa de ensamblaje para tirar de estas piezas
juntas. Esto podría ser tan simple como algunos de plantillas del lado del servidor, o,
en cada conjunto de páginas proviene de una aplicación diferente, tal vez usted va a
necesitar algo de enrutamiento inteligente URI.
Una de las principales ventajas de este enfoque es que el mismo equipo que realiza
cambios en los servicios también puede ser el encargado de realizar cambios en
aquellas partes de la interfaz de usuario. Esto nos permite obtener cambios más
rápidamente. Sin embargo, hay algunos problemas con este enfoque.
En primer lugar, garantizar la coherencia de la experiencia del usuario es algo que
tenemos que hacer frente. Los usuarios quieren tener una experiencia transparente, no
sentir que las diferentes partes de la obra interfase de diferentes maneras, o presentar
un lenguaje de diseño diferente. Hay ques técnicamente para evitar este problema, sin
embargo, como guías de estilo de vida, donde los activos como componentes HTML,
CSS y las imágenes se pueden compartir para ayudar a dar un cierto nivel de
consistencia.
Otro problema tomando es más difícil de tratar. ¿Qué ocurre con las aplicaciones
nativas o clientes pesados? No podemos servir a los componentes de interfaz de
usuario. Podríamos utilizar un enfoque híbrido y el uso de aplicaciones nativas para
servir a los componentes HTML, pero este enfoque ha demostrado una y otra vez a
tener inconvenientes. Así que si usted necesita una experiencia nativa, vamos a tener
que recurrir a un enfoque en la aplicación frontend hace llamadas a la API y se ocupa
de la propia interfaz de usuario. Pero incluso si tenemos en cuenta únicamente las
interfaces de usuario web, todavía puede querer muy diferentes tratamientos para
Interfaces de usuario |
73
diferentes tipos de dispositivos. La construcción de los componentes sensibles puede
ayudar, por supuesto.
74| Capítulo 4: Integración
Hay un problema fundamental con este enfoque que no estoy seguro puede ser
resuelto. Algunas veces las capacidades ofrecidas por un servicio no encajan
perfectamente en un widget o una página. Claro, yo podría querer recomendaciones
en un rectángulo en una página en nuestro sitio web, pero lo que si quiero tejer en las
recomendaciones dinámicos en otras partes de la superficie? Cuando busco, quiero
que el tipo delante para disparar automáticamente recomendaciones frescos, por
ejemplo. Cuanto más transversales de una forma de interacción es, menos probable
este modelo se ajusta y lo más probable es que vamos a caer de nuevo a sólo hacer
llamadas a la API.
Backends para Frontends
Una solución común al problema de interfaces hablador con servicios de backend, o
la necesidad de variar el contenido para diferentes tipos de dispositivos, es tener un
punto final de la agregación del lado del servidor, o puerta de enlace API. Esto puede
reunir varias llamadas de back-end, variar y agregación de contenido puerta si es
necesario para diferentes dispositivos, y servir para arriba, como vemos enFigura 4-9.
He visto este enfoque conduce a un desastre cuando estos criterios de valoración del
lado del servidor se convierten en capas gruesas con demasiada comportamiento.
Ellos terminan siendo gestionados por equipos independientes, y siendo otro lugar
donde la lógica tiene que cambiar cada vez que algunos cambios de funcionalidad.
Figura 4-9. El uso de una única pasarela monolítico para manejar las llamadas a / desde las
interfaces de usuario
Interfaces de usuario |
75
El problema que puede ocurrir es que normalmente tendremos una capa gigante para
todos nuestros servicios. Esto lleva a que todo ser lanzado en conjunto, y de repente
empezamos a perder el aislamiento de nuestras diversas interfaces de usuario, lo que
limita nuestra capacidad para liberarlos de forma independiente. Un modelo prefiero
y que yo he visto bien el trabajo es para restringir el uso de estos backends a una
interfaz de usuario o aplicación específica, como vemos enFigura 4-10.
Figura 4-10. Que utilizan terminales dedicados para interfaces
Este patrón se refiere a veces como backends para interfaces (BFFs). Permite que el
equipo se centra en cualquier interfaz de usuario dado para manejar también sus
propios componentes del lado del servidor. Se puede ver estos backends como partes
de la interfaz de usuario que le pasan a ser incorporados en el servidor. Algunos tipos
de interfaz de usuario pueden necesitar una huella mínima del lado del servidor,
mientras que otros pueden necesitar mucho más. Si necesita una capa de
autenticación y autorización de la API, esto puede sentarse entre nuestros mejores
amigos y nuestros interfaces de usuario. Vamos a explorar esto más enCapítulo 9.
El peligro de este enfoque es el mismo que con cualquier capa de agregación; se
puede tomar en la lógica no debería. La lógica de negocio para las diversas
capacidades de estos backends uso debe permanecer en los propios servicios. Estos
mejores amigos sólo deben contener CIFIC comportamiento espe- a ofrecer una
experiencia de usuario en particular.
76| Capítulo 4: Integración
Un enfoque híbrido
Muchos de las opciones antes mencionadas no tienen que ser de una talla única para
todos. Pude ver una organización adoptar el enfoque de reunión basada en
fragmentos para crear un sitio web, pero utilizando un enfoque backends fines de
interfaces cuando se trata de su aplicación móvil. El punto clave es que tenemos que
mantener la cohesión de las capacidades subyacentes que ofrecemos a nuestros
usuarios. Tenemos que asegurarnos de que la lógica asociada con el pedido de la
música o el cambio de los datos del cliente vidas dentro de los servicios que se
ocupan de esas operaciones, y no mancharse en todo nuestro sistema. Evitar la
trampa de poner demasiado el comportamiento en cualquier capa intermedia es un
acto de equilibrio delicado.
La integración con software de terceros
hemos mirado enfoques para romper los sistemas existentes, aparte de que están bajo
nuestro control, pero ¿qué pasa cuando no podemos cambiar las cosas que hablamos?
Por muchas razones válidas, las organizaciones para las que trabajamos compra de
software comercial off-the-shelf (COTS) o hacer uso de software como servicio
(SaaS) sobre los que tenemos poco control. Entonces, ¿cómo se integran con
sensatez?
Si usted está leyendo este libro, es probable que trabaja en una organización que
escribe el código. Es posible escribir software para sus propios fines internos o para
un cliente externo, o ambos. Sin embargo, incluso si usted es una organización con la
capacidad de crear una cantidad no puede signifi- de software a medida, podrás
seguir utilizando los productos de software que aporten las partes exter- nos, ya sea
comercial o de código abierto. ¿Por qué es esto?
En primer lugar, su organización es casi seguro que tiene una mayor demanda de
software que puede ser satisfecho internamente. Piense en todos los productos que
usa, desde herramientas de productividad de oficina como Excel de los sistemas
operativos a los sistemas de nómina. La creación de todos aquellos para su propio
uso sería una tarea gigantesca. En segundo lugar, y más importante, no sería rentable!
El costo para que usted construya su propio sistema de correo electrónico, por
ejemplo, es probable que empequeñecer el costo de utilizar una combinación
existente de servidor de correo y el cliente, incluso si vas para las opciones
comerciales.
Mi Los clientes a menudo luchan con la pregunta “¿Debo construir, o debería
comprar?” En ge- neral, el consejo que doy a mis colegas y al tener esta conversación
con la organización de la empresa promedios de edad se reduce a “Construir si es
aplicable sólo a lo que haces, y puede ser considerado un activo estratégico; comprar
si el uso de la herramienta no es tan especial “.
Por ejemplo, la organización promedio no consideraría su sistema de nómina para ser
un activo estratégico. La gente, en su conjunto se les paga el mismo en todo el
La integración con software de terceros | 73
mundo. Del mismo modo, la mayoría de las organizaciones tienden a comprar los
sistemas de gestión de contenidos (CMS de más) fuera de la plataforma, ya que su
uso de una herramienta de este tipo no se considera algo que es clave para su
negocio. Por otra parte, yo estaba involucrado desde el principio en la reconstrucción
de la página web de The Guardian, y me hicieron allí la decisión de construir un
sistema de gestión de contenidos a medida, ya que era central para el negocio del
periódico.
74| Capítulo 4: Integración
Así que la idea de que vamos a encontrar ocasionalmente comercial, software de
terceros es sensible, y para ser bienvenida. Sin embargo, muchos de nosotros
terminamos maldiciendo algunos de estos siste- mas. ¿Porqué es eso?
Falta de control
Uno de los retos asociados con la integración y que se extienden las capacidades de
los productos COTS como herramientas CMS o SaaS es que por lo general muchas
de las técnicas siones terio se han hecho para usted. ¿Cómo integra con la
herramienta? Esa es una decisión vendedor. ¿Qué lenguaje de programación se puede
utilizar para extender la herramienta? Hasta el vendedor. Se puede almacenar la
configuración para la herramienta de control de versiones, y reconstruir desde cero,
con el fin de permitir la integración continua de las personalizaciones? Depende de
las opciones del vendedor hace.
Si tiene suerte, lo fácil, o con problemas que es trabajar con la herramienta desde el
punto de vista del desarrollo ha sido considerado como parte del proceso de selección
de la herramienta. Pero incluso entonces, que están cediendo efectivamente cierto
nivel de control a un interlocutor externo. El truco es llevar la integración y
personalización de trabajo de nuevo en sus términos.
personalización
Muchos herramientas que las organizaciones empresariales compran venderse a sí
mismos en su capacidad de ser muy personalizada sólo para usted. ¡Tener cuidado! A
menudo, debido a la naturaleza de la cadena de herramientas tiene acceso a, el costo
de personalización puede ser más caro que construir algo desde cero a medida! Si
usted ha decidido comprar un producto, sino las capacidades particu- lar que ofrece
no es tan especial para usted, podría tener más sentido para cambiar el
funcionamiento de su organización en lugar de embarcarse en la personalización
compleja.
gestores de contenidos son un gran ejemplo de este peligro. He trabajado con varios
sistemas CMS que por su diseño no son compatibles con la integración continua, que
tienen torios API bles, y para el que incluso una actualización menor de punto en la
herramienta subyacente puede romper cualquier personalización que haya realizado.
Salesforce es especialmente problemático en este sentido. Durante muchos años se ha
llevado a su plataforma Force.com, que requiere el uso de un lenguaje de
programación, Apex, que sólo existe dentro del ecosistema Force.com!
La integración de los espaguetis
Otro desafío es cómo se integran con la herramienta. Como hemos comentado
anteriormente, promueva su cuidado acerca de cómo se integran entre los servicios es
importante, y lo ideal es que quieren estandarizar en un pequeño número de tipos de
integración. Pero si un producto decide utilizar un protocolo propietario binaria, otro
La integración con software de terceros | 75
poco de sabor de SOAP y XML-RPC otra, ¿qué queda? Peor aún son las
herramientas que le permiten
76| Capítulo 4: Integración
llegar a la derecha dentro de sus almacenes de datos subyacentes, lo que lleva a todos
los mismos problemas de acoplamiento que discutimos anteriormente.
En sus propios términos
COTS y productos SAAS absolutamente tienen su lugar, y no es factible (o Sensible) para la mayoría de nosotros para construir todo desde cero. Entonces, ¿cómo
resolver estos desafíos? La clave es mover las cosas de nuevo en sus propios
términos.
La idea central aquí es para hacer cualquier personalización en una plataforma a
controlar y limitar el número de consumidores diferentes de la propia herramienta.
Para explorar esta idea en detalle, vamos a ver un par de ejemplos.
Ejemplo: CMS como un servicio
En mi experiencia, el CMS es uno de los productos más utilizados que debe ser
personalizado o integrado con. La razón de esto es que a menos que desee un sitio
estático básico, la organización medio de las empresas quiere enriquecer la
funcionalidad de su sitio web con contenido dinámico, como registros de clientes o
de las últimas ofertas de productos. La fuente de este contenido dinámico es
típicamente otros servicios dentro de la organización, que en realidad se puede
mismo ha construido.
La tentación, y con frecuencia el punto de venta de la CMS-es que se puede
personalizar el CMS para tirar en todo este contenido especial y mostrarlo al mundo
exterior. SIN EMBARGO, el entorno de desarrollo para el promedio de la CMS es
terrible.
Vamos mirar lo que el promedio de CMS se especializa en, y lo que es probable
que lo compró por: creación de contenidos y la gestión de contenidos. La
mayoría de los sistemas CMS son bastante malos, incluso a hacer diseño de
página, generalmente proporcionando herramientas de arrastrar y soltar que no
cortan la mostaza. E incluso entonces, se termina la necesidad de tener a alguien
que entiende HTML y CSS para ajustar las plantillas CMS. Tienden a ser
terribles plataformas sobre las cuales construir un código personalizado.
¿La respuesta? Frente al CMS con su propio servicio que ofrece la página web con el
mundo exterior, como se muestra enFigura 4-11. El tratamiento de la CMS como un
servicio cuya función es permitir la creación y recuperación de contenido. En su
propio servicio, se escribe el código y la integración con los servicios de la forma que
desee. Usted tiene control sobre la ampliación del sitio web (muchos sistemas CMS
comerciales proporcionan sus propios patentados complementos para manejar la
carga), y se puede escoger el sistema de plantillas que tenga sentido.
La mayoría de los sistemas CMS también proporcionan API para permitir la creación
de contenidos, por lo que también tiene la capacidad de frente que con su propia
fachada servicio. Para algunas situaciones, incluso hemos utilizado una fachada tales
La integración con software de terceros | 77
abstraer a cabo las API para recuperar el contenido.
78| Capítulo 4: Integración
Figura 4-11. Ocultación de un CMS con su propio servicio
hemos se utiliza este patrón varias veces a través de ThoughtWorks en los últimos
años, y lo he hecho más de una vez a mí mismo. Un ejemplo notable fue un cliente
que estaba buscando para empujar a cabo un nuevo sitio web para sus productos.
Inicialmente, se quería construir toda la solución en el CMS, pero aún tenía que
elegir uno. En su lugar sugirió este enfoque, y comenzó el desarrollo de la página
web al frente. A la espera de la herramienta CMS para ser seleccionado, que fingí por
tener un servicio web que simplemente surgió contenido estático. Terminamos yendo
en vivo con el sitio del pozo antes de que el CMS fue seleccionado mediante el uso
de nuestro servicio de contenido falso en la producción a la superficie de contenido
para el sitio activo. Más tarde, hemos sido capaces de dejar caer simplemente en la
herramienta seleccionada finalmente sin ningún cambio en la aplicación al frente.
Usando este enfoque, mantenemos el alcance de lo que el CMS hace a un mínimo y
nos movemos personalizaciones en nuestra propia tecnología de pila.
Ejemplo: El sistema de CRM multirole
La relación de CRM o cliente Gestión-herramienta es una bestia a menudo
encontrados, que puede infundir miedo en el corazón de incluso el arquitecto más
resistentes. Este sector, como se tipifica por los vendedores como Salesforce o SAP,
está plagada de ejemplos de herramientas que tratan de hacer todo por ti. Esto puede
conducir a la propia herramienta convertirse en un punto único de fallo, y un nudo
enmarañado de dependencias. Muchas implementaciones de herramientas de CRM
que he visto son algunos de los mejores ejemplos de adhesivo (en oposición a
cohesivos) servicios.
El alcance de una herramienta de este tipo normalmente empieza pequeño, pero con
el tiempo se convierte en una parte cada vez más importantes de cómo funciona su
organización. El problema es que la direc- ción y se tomen decisiones en torno a este
sistema ahora vitales se hacen a menudo por el propio proveedor de herramientas, no
por usted.
La integración con software de terceros | 79
Yo estaba involucrado recientemente en un ejercicio para tratar de arrebatar algún
control posterior. La organiza- ción estaba trabajando con cuenta de que a pesar de
que estaba usando la herramienta de CRM para muchos
80| Capítulo 4: Integración
de las cosas, que no estaba recibiendo el valor de los crecientes costos asociados con
la plata- forma. Al mismo tiempo, múltiples sistemas internos estaban usando las API
de menos que ideales CRM para la integración. Queríamos mover la arquitectura del
sistema hacia un lugar donde tuvimos servicios que modelan nuestro dominio las
empresas, así como sentar las bases para una migración potencial.
Lo primero que hicimos fue identificar los conceptos básicos a nuestro dominio que
el sistema CRM actualmente propiedad. Uno de ellos fue el concepto de un proyecto,
es decir, algo a lo que se podría asignar un miembro del personal. Varios otros
sistemas necesitan la información del proyecto. Lo que hicimos fue crear un servicio
en lugar del proyecto. Este servicio de proyectos como los recursos REST expuesto,
y los sistemas externos se podía mover sus puntos de integración al nuevo, fácil-atrabajar-con el servicio. Internamente, el servicio del proyecto era sólo una fachada,
ocultando los detalles de la integración subyacente. Esto se puede ver enFigura 4-12.
Figura 4-12. El uso de servicios de fachada para enmascarar el CRM subyacente
La obra, que en el momento de escribir estas líneas aún estaba en curso, fue
identificar otros conceptos de dominio que el CRM se manejo, y crear más fachadas
para ellos. Cuando llegue el momento de la migración lejos de la CRM subyacente,
podríamos buscar en cada fachada a su vez para decidir si una solución de software
interno o algo fuera de la plataforma podrían ajustarse a la ley.
El patrón de estrangulador
Cuando se trata de legado o incluso plataformas COTS que no están totalmente bajo
nuestras posibilidades de control, también tenemos que hacer frente a lo que sucede
cuando queremos eliminarlos o al menos alejarse de ellos. Un modelo útil en este
caso es laDibujo Aplicación estrangulador. Al igual que con nuestro ejemplo de
frente al sistema de CMS con nuestro propio código, con un estrangulador permite
capturar y interceptar las llamadas al sistema antiguo. Esto le permite decidir si
enruta las llamadas a estos existente, el código heredado, o dirigirlos a nuevo código
que puede
La integración con software de terceros | 81
haber escritó. Esto le permite reemplazar la funcionalidad con el tiempo sin
necesidad de una gran reescritura explosión.
Cuando se trata de microservicios, en lugar de tener una sola aplicación monolítica
interceptar todas las llamadas al sistema heredado existente, es posible que en lugar
de utilizar una serie de microservicios para llevar a cabo esta intercepción. Capturar y
desviar las llamadas originales, pueden llegar a ser más compleja en esta situación, y
puede requerir el uso de un proxy para hacer esto para usted.
Resumen
hemos Miré a un número de diferentes opciones en la integración, y que he
compartido mis ideas sobre qué opciones tienen más probabilidades de asegurar que
nuestros microservicios permanecen como desacoplado como sea posible de sus
otros colaboradores:
• Evitar la integración de bases de datos a toda costa.
• Entender las ventajas y desventajas entre REST y RPC, pero considerar
seriamente RESTO como un buen punto de partida para la integración de
solicitud / respuesta.
• Prefiero coreografía sobre la orquestación.
• Evitar rompiendo los cambios y la necesidad de versión mediante la comprensión
de la ley de Postel y el uso de lectores tolerantes.
• Piense de interfaces de usuario como capas de composición.
Hemos cubierto mucho aquí, y no pudimos entrar en profundidad sobre todos estos
temas. No obstante, esto debería ser una buena base para que te vas y te orientará en
la dirección correcta si desea obtener más información.
Nosotros también pasó algún tiempo a la forma de trabajar con sistemas que no están
completamente bajo nuestro control en forma de productos COTS. Resulta que esta
descripción se puede aplicar con la misma facilidad con el software que escribimos!
Algunos de los enfoques descritos aquí se aplican igualmente bien al software
heredado, pero lo que si queremos hacer frente a la tarea a menudo-monumental de
llevar estos sistemas más antiguos hasta el talón y descomponerlos en partes más
usables? Discutiremos eso en detalle en el siguiente capítulo.
82| Capítulo 4: Integración
CAPÍTULO 5
La división de la Monolith
hemos discute lo que un buen servicio se parece, y por qué servidores más pequeños
puede ser mejor para nosotros. También hemos discutido anteriormente la
importancia de ser capaz de evolucionar el diseño de nuestros sistemas. Pero, ¿cómo
manejamos el hecho de que puede que ya tenga un gran nú- mero de bases de código
mentir acerca de que no siguen estos patrones? ¿Cómo hacemos para descomponer
estas aplicaciones monolíticas sin tener que embarcarse en una gran explosión
reescribir?
El monolito crece con el tiempo. Se adquiere nuevas funciones y líneas de código a
un ritmo alarmante. En poco tiempo se convierte en una gran presencia, miedo
gigante en nuestra organización que la gente tiene miedo de tocar o cambiar. ¡Pero no
todo está perdido! Con las herramientas adecuadas a nuestra disposición, podemos
matar a esta bestia.
Sus Todo sobre costuras
Nosotros discutido en Capítulo 3 que queremos que nuestros servicios sean altamente
cohesivo y débilmente acoplado. El problema con el monolito es que demasiado a
menudo es lo contrario de ambos. En lugar de tender hacia la cohesión, y mantener
las cosas juntas que tienden a cambiar juntos, adquirimos y mantenemos juntos todo
tipo de código no relacionado. Del mismo modo, la articulación flexible no existe
realmente: si quiero hacer un cambio a una línea de código, que puede ser capaz de
hacer eso con bastante facilidad, pero no se puede implementar ese cambio sin
afectar potencialmente gran parte del resto del monolito, y sin duda va a tener que
volver a implementar todo el sistema.
En su libro de trabajo efectivo con el código heredado (Prentice-Hall), Michael
plumas define el concepto de una costura, es decir, una parte del código que puede
ser tratado de forma aislada y trabajó en sin afectar al resto de la base de código.
También queremos identificar las costuras. Pero en lugar de la búsqueda de ellos con
79
el propósito de limpiar nuestra base de código-, queremos identificar las costuras que
pueden convertirse en los límites del servicio.
80| Capítulo 5: La división de la
Monolith
Entonces, ¿qué hace que una buena costura? Bueno, como hemos comentado
anteriormente, delimitada contextos son excelentes costuras, ya que, por definición,
que representan los límites de cohesión y, sin embargo débilmente acoplados en una
organización. Así que el primer paso es empezar a identificar estos límites en nuestro
código.
La mayoría de los lenguajes de programación proporcionan conceptos de espacio de
nombres que nos permiten agrupar código similar juntos. concepto de paquete de
Java es un ejemplo bastante débil, pero nos da mucho más de lo que necesitamos.
Todos los otros lenguajes de programación convencionales tienen conceptos
similares incorporados, con JavaScript siendo muy posiblemente una excepción.
Rompiendo Aparte MusicCorp
Imaginemos que tenemos un gran servicio monolítica back-end que representa una
cantidad sustancial del comportamiento de los sistemas en línea de MusicCorp. Para
empezar, hay que identificar el alto nivel acotado contextos que creemos que existen
en nuestra organización, ya que dis- cussed enCapítulo 3. A continuación, queremos
tratar de entender lo que limita los mapas contextos monolito a. Imaginemos que en
un principio identificamos cuatro contextos creemos que nuestra backend monolítica
cubre:
Catalogar
Todo lo relacionado con los metadatos de los artículos que ofrecemos a la venta
Financiar
Los informes de cuentas, pagos, devoluciones, etc.
Almacén
El envío y la devolución de pedidos de los clientes, la gestión de los niveles de inventario,
etc.
Recomendación
Nuestra patente pendiente, sistema de recomendación revolucionaria, que es el
código de gran complejidad escrita por un equipo con más doctores que el
laboratorio de la ciencia media
Lo primero que debe hacer es crear paquetes que representan estos contextos, y luego
pasar el código existente en ellos. Con entornos de desarrollo modernos, el
movimiento de código se puede hacer automática- mente a través de
refactorizaciones, y se puede hacer de forma incremental, mientras estamos haciendo
otras cosas. No obstante, deberá pruebas para detectar cualquier roturas hechas
moviendo el código, sin embargo, especialmente si está usando un lenguaje de tipos
dinámicos, donde los entornos de desarrollo tienen un tiempo más difícil de llevar a
cabo la refactorización. Con el tiempo, comenzamos a ver lo que el código quede
bien, y lo que queda de código una y realmente no encaja en cualquier lugar. Este
código restante a menudo identificar contextos acotados se pueden haber omitido!
81
Durante este proceso, podemos utilizar código para analizar las dependencias entre
estas edades PACK- también. Nuestro código debe representar a nuestra
organización, por lo que nuestros paquetes que representan los contextos acotadas en
nuestra organización deben interactuar de la misma manera los grupos de
organización de la vida real en nuestra interactúan dominio. Por ejemplo,
herramientas como la estructura 101 nos permiten ver las dependencias entre los
paquetes de forma gráfica. Si detectamos que las cosas
82| Capítulo 5: La división de la
Monolith
mira mal, por ejemplo, el paquete de almacén depende de código en el paquete de
financiación cuando no existe tal dependencia en la organización real, entonces
podemos investigar este problema y tratar de resolverlo.
Este proceso podría tomar una tarde en una pequeña base de código, o de varias
semanas o meses cuando se está tratando con millones de líneas de código. Puede
que no necesite para ordenar todo el código en paquetes orientado a dominio antes de
separarse a cabo su primer servicio, y de hecho puede ser más valioso para
concentrar sus esfuerzos en un solo lugar. No hay necesidad de que se trata de un
enfoque de la gran explosión. Es algo que se puede hacer poco a poco, día a día, y
tenemos una gran cantidad de herramientas a nuestra disposición para seguir nuestro
progreso.
Así que ahora que tenemos nuestro código base organizada en torno a estas costuras, ¿qué sigue?
Las razones para dividir el monolito
La decisión de que desea un servicio o aplicación monolítica a ser más pequeño es un
buen comienzo. Pero te recomiendo muchísimo a hacer mella a estos sistemas. Un
enfoque gradual le ayudará a aprender acerca microservicios a medida que avanza, y
también limitará el impacto de conseguir algo mal (y obtendrá cosas mal!). Pensar en
nuestro monolito como un bloque de mármol. Pudiéramos hacer volar todo el asunto,
pero que rara vez termina bien. Tiene mucho más sentido para simplemente hacer
mella en él de forma incremental.
Así que si vamos a romper el monolito una pieza a la vez, donde debemos empezar?
Tenemos nuestras costuras ahora, pero ¿cuál deberíamos sacar primero? Lo mejor es
pensar dónde va a obtener el mayor beneficio de alguna parte de su base de códigoser separados, en lugar de sólo cosas para dividir el bien de ella. Vamos a considerar
algunos conductores que podrían ayudar a guiar nuestro cincel.
Ritmo del cambio
Tal vez sabemos que tenemos una carga de cambios va a ser pronto en la forma de
gestionar el inventario. Si dividimos la costura de almacén como un servicio ahora,
podríamos cambiar que un servicio más rápido, ya que es una unidad autónoma
independiente.
Estructura de equipo
MusicCorp de equipo de entrega es en realidad dividida en dos regiones geográficas.
Un equipo está en Londres, y el otro en Hawai (algunas personas lo tienen fácil!).
Sería muy bueno si pudiéramos dividir el código que el equipo de Hawai trabaja en la
mayoría, por lo que puede tener la plena propiedad. Vamos a explorar esta idea aún
más enCapítulo 10.
Las razones para dividir el monolito | 81
Seguridad
MusicCorp ha tenido una auditoría de seguridad, y ha decidido reforzar su protección
de la información sensible. En la actualidad, todo esto es manejado por el código
relacionado con las finanzas. Si
82| Capítulo 5: La división de la
Monolith
Dividimos a cabo este servicio, podemos proporcionar protecciones adicionales a
este servicio individual en términos de vigilancia, protección de los datos en
tránsito, y la protección de datos en reposo ideas vamos a ver con más detalle en
Capítulo 9.
Tecnología
El equipo de cuidado de nuestro sistema de recomendación se ha Rematar algunos de
los nuevos algoritmos utilizando una biblioteca de programación lógica en el Clojure
lenguaje. El equipo piensa que esto podría beneficiar a nuestros clientes mediante la
mejora de lo que les ofrecemos. Si pudiéramos dividir el código de recomendación
en un servicio independiente, sería fácil de con- Sider la construcción de una
implementación alternativa que hemos podido probar en contra.
Enredado dependencias
El otro punto a tener en cuenta cuando se haya identificado un par de costuras para
separar es la forma enredada que el código es con el resto del sistema. Queremos
sacar la costura que está menos dependía de si podemos. Si puede ver las diferentes
costuras que ha encontrado como un grafo acíclico dirigido de dependencias (algo
que el paquete de herramientas de modelado que he mencionado anteriormente son
muy buenos), esto puede ayudar a detectar las costuras que probablemente van a ser
más difíciles de desenredar.
Esto nos lleva a lo que suele ser la madre de todas las dependencias enredadas: la base de datos.
La base de datos
Ya hemos discutido en detalle los retos de la utilización de bases de datos como
método de integración de múltiples servicios. Como ya he hecho bastante claro antes,
yo no soy un fan! Esto significa que tenemos que encontrar las costuras en nuestras
bases de datos también, así que podemos dividir a cabo limpiamente. Bases de datos,
sin embargo, son bestias difíciles.
Tener el control de la Problema
El primer paso es tomar un vistazo al código sí mismo y ver qué partes de ella leen y
escriben a partir de la base de datos. Una práctica común es tener una capa de
repositorio, respaldado por algún tipo de marco como Hibernate, para vincular a su
código a la base de datos, lo que facilita el mapa objetos o estructuras de datos hacia
y desde la base de datos. Si ha sido siguien- tes a lo largo hasta el momento, se le han
agrupado nuestro código en paquetes que representan nuestros contextos delimitadas;
queremos hacer lo mismo para nuestra base de datos de código de acceso. Esto puede
requerir la división hasta la capa de depósito en varias partes, como se muestra
enFigura 5-1.
Las razones para dividir el monolito | 83
La Figura 5-1. La división de nuestras capas de repositorio
Tener el código base de datos de mapeo colocated dentro del código para un
determinado contexto puede ayudarnos a comprender qué partes de la base de datos
son utilizados por qué bits de código. Hiber- nate, por ejemplo, puede hacer esto muy
claro si está utilizando algo así como un archivo de asignación por contexto acotado.
Esto no nos da toda la historia, sin embargo. Por ejemplo, podemos ser capaces de
decir que el código de finanzas utiliza la tabla del libro mayor, y que el código de
catálogo utiliza la tabla de partidas individuales, pero puede que no sea evidente que
la base de datos impone una relación de clave externa de la tabla de registro en que la
línea tabla de elementos. Para ver estas restricciones a nivel de base de datos, que
pueden ser un obstáculo, tenemos que utilizar otra herramienta para visualizar los
datos. Un gran lugar para comenzar es utilizar una herramienta como la libre
disposiciónSchemaSpy, Que puede generaciones representaciones gráficas erate de
las relaciones entre las tablas.
Todo esto ayuda a entender el acoplamiento entre las tablas que puede abarcar lo que
eventualmente se convertirá en los límites del servicio. Pero, ¿cómo cortar esos
lazos? Y ¿qué pasa con los casos en que se utilizan las mismas tablas de múltiples
contextos diferentes acotados? El manejo de problemas como estos no es fácil, y hay
muchas respuestas, pero es factible.
Volviendo a algunos ejemplos concretos, vamos a considerar nuestra tienda de
música de nuevo. Hemos identificado cuatro contextos acotados, y quiere seguir
adelante con haciéndolos cuatro, servicios que colaboran distintas. Vamos a mirar
algunos ejemplos concretos de los problemas que podría enfrentar, y sus posibles
soluciones. Y mientras que algunos de estos ejemplos hablar específicamente de los
problemas encontrados en ses databa- relacionales estándar, se encuentran problemas
similares en otras tiendas NoSQL alternativa.
Tener el control de la Problema | 83
Ejemplo: Rompiendo clave Exteriores Relaciones
En este ejemplo, nuestro código de catálogo utiliza una tabla de partidas individuales
genérico para almacenar información sobre un álbum. Nuestro código de finanzas
utiliza una tabla de libro de contabilidad para rastrear las transacciones financieras.
Al final de cada mes tenemos que generar informes de varias personas en la
organiza- ción para que puedan ver cómo lo estamos haciendo. Queremos hacer que
los informes agradable y fácil de leer, por lo que en lugar de decir, “Hemos vendido
400 copias de SKU 12345 e hicimos $ 1.300” nos gustaría añadir más información
acerca de lo que se vendió (es decir, “Hemos vendido 400 copias de los golpes más
grandes de Bruce Springsteen y el hecho $ 1.300” ). Para ello, nuestro código de
transmisión en el paquete de financiación llegará a la tabla de partidas individuales
para sacar el título para el SKU. También puede tener una restricción de clave
externa de la contabilidad a la tabla de partidas individuales, como vemos enFigura
5-2.
La Figura 5-2. relación de clave externa
Entonces, ¿cómo arreglar las cosas aquí? Bueno, tenemos que hacer un cambio
en dos lugares. En primer lugar, tenemos que dejar el código de finanzas de
alcanzar en la tabla de partidas individuales, como esta mesa pertenece realmente
al código de catálogo, y no queremos que la integración de bases de datos ocurre
una vez catalogar y las finanzas son los servicios en sus propios derechos. La
forma más rápida para hacer frente a esto es en lugar de tener el código en
finanzas llegar a la tabla de partidas individuales, vamos a exponer los datos a
través de una llamada a la API en el paquete de catálogo que el código de
finanzas puede llamar. Esta llamada a la API será el precursor de una llamada
haremos sobre el alambre, como vemos enFigura 5-3.
84| Capítulo 5: La división de la
Monolith
La Figura 5-3. la eliminación de puestos de la relación de clave externa
En este punto se hace evidente que bien podemos llegar a tener que hacer dos bases
de datos llama para generar el informe. Esto es correcto. Y lo mismo sucederá si se
trata de dos servicios por separado. Típicamente preocupaciones en torno a
rendimiento están levantadas. Tengo una respuesta bastante fácil de aquellos: ¿a qué
velocidad el sistema necesita ser? Y qué tan rápido está ahora? Si usted puede probar
su funcionamiento actual y saber qué buen rendimiento parece, entonces usted debe
tener confianza en hacer un cambio. A veces hacer una cosa más lenta, a cambio de
otras cosas es lo que hay que hacer, espe- cialmente si es más lenta todavía
perfectamente aceptable.
Pero ¿qué pasa con la relación de clave externa? Así, perdemos esta completo. Esto
se convierte en un obstáculo que necesitamos para gestionar ahora en nuestros
servicios resultantes en lugar de en el nivel de base de datos. Esto puede significar
que tenemos que aplicar nuestra propia verificación de consistencia a través de los
servicios, o bien activar acciones para limpiar los datos relacionados. Sea o no esto es
necesario a menudo no es la elección de un técnico para hacer. Por ejemplo, si
nuestro servicio de pedidos contiene una lista de ID para artículos del catálogo, lo
que sucede si se elimina un elemento de catálogo y una orden se refiere ahora a un
catálogo ID no válido? Debemos permitirlo? Si lo hacemos, entonces ¿cómo se
representa en el orden cuando se muestra? Si no lo hacemos, entonces ¿cómo
podemos comprobar que esto no es violada? Estas son preguntas que usted necesita
para obtener respuesta por las personas que definen cómo debe comportarse el
sistema para sus usuarios.
Ejemplo: compartido de datos estáticos
He visto quizás como muchos códigos de país almacenados en bases de datos (que se
muestra en Figura 5-4) Como he escrito StringUtils clases Java para proyectos
internos. Esto parece implicar que estamos pensando en cambiar los países de nuestro
sistema admite manera más frecuencia que desplegaremos nuevo código, pero
cualquiera que sea la verdadera razón, estos ejemplos de datos estáticos compartidos
se almacenan en bases de datos vienen un montón. Entonces, ¿qué es lo que hacemos
Ejemplo: compartido de datos
estáticos | 85
en nuestra tienda de música si todos nuestros servicios potenciales leen de la misma
tabla como ésta?
86| Capítulo 5: La división de la
Monolith
La Figura 5-4. Los códigos de país en la base de datos
Bueno, tenemos algunas opciones. Una de ellas es duplicar esta tabla para cada uno
de nuestros paquetes, con la visión a largo plazo que se duplicará dentro de cada
servicio también. Esto lleva a un desafío potencial consistencia, por supuesto: ¿qué
ocurre si actualizo una tabla para reflejar la creación de Newmantopia frente a la
costa este de Australia, pero no en otro?
Una segunda opción es tratar a este lugar, los datos estáticos compartidos como
código. Tal vez podría estar en un fichero propiedad desplegado como parte del
servicio, o tal vez sólo como una enumeración. Los problemas en torno a la
consistencia de los datos se mantienen, aunque la experiencia ha demostrado que es
mucho más fácil de empujar a cabo cambios a los archivos de configuración de
alterar tablas de bases de datos en vivo. Esto es a menudo un enfoque muy sensible.
Una tercera opción, que bien puede ser extrema, es empujar estos datos estáticos en
un servicio de su propio derecho. En un par de situaciones que he encontrado, el
volumen, la complejidad y las reglas asociadas con los datos de referencia estáticos
fueron suficientes que se justifica este enfoque, pero es algo excesivo si estamos
hablando de códigos de país!
Personalmente, en la mayoría de situaciones que iba a tratar de empujar para
mantener estos datos en los archivos de configuración o directamente en el código,
ya que es la opción simple para la mayoría de los casos.
Ejemplo: datos compartidos
Ahora vamos a bucear en un ejemplo más complejo, pero que puede ser un problema
común cuando se está tratando de separar los sistemas: compartían los datos
mutables. Nuestro código de seguimiento de las finanzas pagos realizados por los
clientes por sus órdenes, y también realiza un seguimiento reembolsos dados a ellos
cuando regresan artículos. Mientras tanto, el código de almacén actualiza los
registros para mostrar que los pedidos de los clientes se han enviado o recibido. Toda
esta información se visualiza en un lugar conveniente en el sitio web para que los
Ejemplo: compartido de datos
estáticos | 87
clientes puedan ver lo que está pasando con su cuenta. Para simplificar las cosas,
hemos almacenado toda esta informa- ción en una tabla de registro de cliente
bastante genérica, como se muestra enFigura 5-5.
88| Capítulo 5: La división de la
Monolith
Figura 5-5. Acceso a los datos del cliente: nos estamos perdiendo algo?
Por lo tanto la financiación y el código de almacén están escribiendo a, y,
probablemente, de vez en cuando la lectura de la misma mesa. ¿Cómo podemos
burlan de esto aparte? Lo que en realidad tenemos aquí es algo que se verá a menudo
un concepto de dominio que no se modela en el código, y de hecho es implícitamente
modelado en la base de datos. En este caso, el concepto de dominio que falta es el de
cliente.
Nosotros que tenga que hacer el concepto abstracto actual del hormigón cliente. Como
paso ent transición, creamos un nuevo paquete llamado de atención al cliente.
entonces podemos utilizar una API para exponer Código de cliente a otros paquetes,
como las finanzas o almacén. Rodando esto todo el camino a seguir, podemos ahora
terminar con un servicio al cliente distinta (Figura 5-6).
Figura 5-6. Reconocer el contexto acotado del cliente
Ejemplo: compartido Tablas
Figura 5-7 muestra nuestro último ejemplo. Nuestro catálogo tiene que almacenar el
nombre y el precio de los registros que vendemos, y el almacén tiene que mantener
un registro electrónico de inven- tario. Decidimos mantener estas dos cosas en el
mismo lugar en una tabla de partidas individuales genérico. Antes, con todo el código
se fusionaron en conjunto, no estaba claro que somos en realidad
Ejemplo: Tablas compartido | 87
90| Capítulo 5: La división de la
Monolith
conflating preocupaciones, pero ahora podemos ver que, de hecho, tenemos dos
conceptos diferentes que podrían ser almacenados de manera diferente.
La Figura 5-7. Mesas se comparten entre los diferentes contextos
La respuesta en este caso es la de dividir la tabla en dos, como tenemos en Figura 58, Tal vez la creación de una tabla de lista de acciones para el almacén, y una mesa de
entrada de catálogo para los detalles del catálogo.
Figura 5-8. Separando la mesa compartida
Bases de datos de refactorización
Lo que hemos cubierto en los ejemplos anteriores son unos refactorizaciones base de
datos que pueden ayudar a separar sus esquemas. Para una discusión más detallada
del tema, es posible que desee echar un vistazo a las bases de datos de refactoración
por Scott J. Ambler y Pramod
J. Sadalage (Addison-Wesley).
88| Capítulo 5: La división de la
Monolith
Puesta en escena de las vacaciones
Por lo que hemos encontrado en nuestra costuras código de la aplicación,
agrupándola contextos alrededor acotadas. Hemos utilizado este para identificar las
costuras en la base de datos, y lo hemos hecho todo lo posible para dividirlos uno.
¿Qué sigue? ¿Haces un comunicado de la gran explosión, yendo de un ser- vicio
monolítica con un único esquema a dos servicios, cada uno con su propio esquema?
De hecho, me recomienda dividir a cabo el esquema, pero mantener el servicio juntos
antes de split-ting el código de aplicación a cabo en microservicios separados, como
se muestra enFigura 5-9.
Figura 5-9. La organización de un servicio de separación
Con un esquema separado, estaremos aumentando potencialmente el número de bases
de datos llama a realizar una sola acción. Donde antes podríamos haber sido capaces
de tener todos los datos que queríamos en una sola instrucción SELECT, ahora es
posible que tenga que tirar de los datos de nuevo desde dos lugares y participar en la
memoria. Además, terminamos rompiendo la integridad transaccional cuando nos
movemos a dos esquemas, que podrían tener un impacto significativo en nuestras
aplica- ciones; vamos a estar discutiendo este lado. Al dividir los esquemas a cabo,
pero manteniendo el código de aplica- ción juntos, nos damos la posibilidad de
volver a nuestros cambios o continuar a modificar las cosas sin afectar a cualquier
consumidor de nuestro servicio. Una vez que estamos convencidos de que la
separación DB tiene sentido, entonces podemos pensar en dividir el código de aplicación en dos servicios.
Los límites transaccionales
Las transacciones son cosas útiles. Ellos nos permiten decir estos eventos ocurren o
bien todos juntos, o ninguno de ellos ocurren. Son muy útiles cuando estamos
insertar datos en una base de datos; nos dejaron actualizar varias mesas a la vez,
sabiendo que si algo falla, todo se deshace, lo que garantiza que nuestros datos no
Los límites transaccionales | 89
entrar en un estado incoherente. En pocas palabras, una transacción nos permite
agrupar múltiples actividades diferentes que
90| Capítulo 5: La división de la
Monolith
tomar nuestro sistema de un estado consistente a otro, todo funciona, o nada cambia.
Las transacciones no sólo se aplican a las bases de datos, a pesar de que más a
menudo los usamos en ese contexto. intermediarios de mensajes, por ejemplo, han
permitido por mucho tiempo le permite enviar y recibir mensajes dentro de las
transacciones también.
Con un esquema monolítico, todo nuestro crean o actualizaciones probablemente se
realizan dentro de un único límite transaccional. Cuando nos separamos nuestras
bases de datos, se pierde la seguridad que nos brinda por tener una sola transacción.
Consideremos un ejemplo simple en el contexto MusicCorp. Al crear una orden,
quiero actualizar la tabla de orden que indica que un pedido del cliente ha sido
creado, y también poner una entrada en una tabla para el equipo del almacén por lo
que sabe que hay un orden que tiene que ser recogido para su envío. Hemos llegado
tan lejos como la agrupación de nuestro código de la aplicación en paquetes
separados, y también hemos separado las partes del cliente y del almacén del
esquema lo suficientemente bien que estamos listos para ponerlos en sus propios
esquemas antes de separar el código de la aplicación.
En una sola transacción en nuestro esquema existente monolítica, la creación de la
orden e insertando el récord para el equipo del almacén se lleva a cabo en una sola
transacción, como se muestra en Figura 5-10.
Figura 5-10. Actualizar dos tablas en una sola transacción
Pero si hemos tirado aparte del esquema en dos esquemas distintos, uno para los
datos relacionados con el cliente, incluyendo nuestra tabla de orden, y otro para el
almacén, hemos perdido esta seguridad transaccional. El proceso de poner orden
ahora se extiende por dos límites cionales transac- separadas, como vemos enFigura
5-11. Si nuestra inserción en la tabla para falla, podemos detener claramente todo,
dejándonos en un estado coherente. ¿Pero qué sucede cuando la inserción en la tabla
fin funciona, pero la inserción en la tabla recogida de falla?
Los límites transaccionales | 91
Figura 5-11. Abarcando límites transaccionales para una sola operación
Inténtelo más tarde
El hecho de que la orden fue capturado y colocado podría ser suficiente para
nosotros, y podrá decidir que se vuelva a intentar la inserción en mesa de recogida
del almacén en una fecha posterior. Podríamos cola esta parte de la operación en una
cola o archivo de registro, y vuelve a intentarlo más tarde. Para algunos tipos de
operaciones de esto tiene sentido, pero tenemos que asumir que un reintento lo
arreglaría.
En muchos sentidos, esta es otra forma de lo que se llama consistencia eventual. En
lugar de utilizar un límite transaccional para asegurar que el sistema está en un estado
consistente cuando se complete la transacción, en vez aceptamos que el sistema
obtendrá sí mismo en un estado coherente en algún momento en el futuro. Este
enfoque es especialmente útil con las operaciones Ness Busi- que podrían ser de
larga duración. Vamos a discutir esta idea con mayor profundidad enCapítulo 11
cuando cubrimos los patrones de escala.
Abortar la operación entera
Otra opción es rechazar toda la operación. En este caso, tenemos que poner el sistema de nuevo en un estado coherente. La mesa de recogida es fácil, ya que la
inserción no, pero tenemos una transacción comprometida en la tabla de orden.
Necesitamos descansar esto. Lo que tenemos que hacer es emitir una transacción de
compensación, dando inicio a una nueva transacción, para cerrar de nuevo lo que
acaba de ocurrir. Para nosotros, eso podría ser algo tan simple como la emisión de
una instrucción DELETE para eliminar el orden de la base de datos. Entonces
también tendríamos que informar a través de la interfaz de usuario que ha fallado la
operación. Nuestra aplicación puede manejar ambos aspectos dentro de un sistema
monolítico, sino que había que tener en cuenta lo que podríamos hacer cuando nos
92| Capítulo 5: La división de la
Monolith
separamos el código de la aplicación. ¿La lógica para manejar la transac- ción de
compensación en vivo en el servicio al cliente, el servicio de orden, o en otro lugar?
Los límites transaccionales | 93
Pero, ¿qué ocurre si falla nuestra transacción de compensación? Es ciertamente
posible. Entonces tendríamos una orden en la tabla de orden con ninguna instrucción
de selección correspondiente. En esta situa- ción, que te sea necesario para volver a
intentar la operación de compensación, o permitir algún proceso en segundo plano
para limpiar la inconsistencia más adelante. Esto podría ser algo tan simple como una
pantalla de mantenimiento que el personal de administración tenía acceso a, o un
proceso automatizado.
Ahora piensa en lo que sucede si no tenemos uno o dos operaciones que queremos
ser coherentes, sino tres, cuatro, o cinco. Manejo de transacciones de compensación
para cada modo fail Ure se hace muy difícil de comprender, y mucho menos poner en
práctica.
Las transacciones distribuidas
Una alternativa a orquestando manualmente compensar transacciones es utilizar una
transacción buido dis-. Las transacciones distribuidas intentan abarcar varias
transacciones dentro de ellos con algún proceso general de gobierno llamado un
administrador de transacciones de orquestación dencia las diversas transacciones que
se realizan por los sistemas subyacentes. Al igual que con una operación normal, una
transacción distribuida intenta que todo permanece en un estado Consistente, sólo en
este caso se trata de hacerlo a través de múltiples sistemas diferentes Run-Ning en
diferentes procesos, a menudo la comunicación entre redes.
El algoritmo más común para el manejo de transacciones distribuidas, especialmente
a corto transacciones vivió, como en el caso del manejo de nuestros clientes de
pedidos es el uso de cometer un dos fases. Con una confirmación en dos fases,
primero viene la fase de votación. Aquí es donde cada participante (también llamado
una cohorte en este contexto) en la transacción distribuida dice el administrador de
transacciones si se piensa que su transacción local puede seguir adelante. Si el
administrador de transacciones consigue un voto a favor de todos los participantes,
entonces se dice que todos ellos van por delante y llevar a cabo sus confirmaciones.
Una sola sin voto es suficiente para que el administrador de transacciones para enviar
una reversión a todas las partes.
Este enfoque se basa en todas las partes que paran hasta que el proceso de
coordinación central les dice proceder. Esto significa que somos vulnerables a las
interrupciones. Si el administrador de transacciones disminuye, las transacciones
pendientes nunca es completa. Si una cohorte no responde de votación ing Du-, todo
lo bloquea. Y también está el caso de lo que sucede si una confirmación falla después
de votar. No es una suposición implícita en este algoritmo que esto no puede suceder:
si una cohorte dice sí durante el período de votación, entonces tenemos que asumir
que va a cometer. Cohortes necesitan una manera de hacer esta confirmación trabajo
en algún momento. Esto significa que este algoritmo no es infalible, sino que
simplemente trata de atrapar la mayoría de los casos de fracaso.
Este proceso de coordinación también significa cerraduras; es decir, las transacciones
pendientes pueden mantener bloqueos en los recursos. Cerraduras de recursos pueden
94| Capítulo 5: La división de la
Monolith
conducir a la contención, por lo que los sistemas de escala mucho más difícil,
especialmente en el contexto de los sistemas distribuidos.
Las transacciones distribuidas se han implementado para pilas de tecnología
específicos, como la API de transacciones de Java, permitiendo recursos dispares
como una base de datos y una cola de men- saje a todos participar en la misma
transacción, general. Los diversos algo-
Los límites transaccionales | 95
ritmos son difíciles de conseguir la derecha, por lo que te sugiero que evitar tratar de
crear su propia cuenta. En su lugar, hacer un montón de investigación sobre este
tema, si esto parece la ruta que desea tomar, y ver si se puede utilizar una
implementación existente.
¿Entonces lo que hay que hacer?
Todas estas soluciones añaden complejidad. Como se puede ver, las transacciones
distribuidas son difíciles de conseguir la derecha, y realmente puede inhibir la escala.
Los sistemas que finalmente convergen a través compensar la lógica de reintento
puede ser más difícil de razonar acerca, y es posible que otros comportamientos de
compensación para arreglar las inconsistencias en los datos.
Cuando se encuentre con las operaciones comerciales que existen actualmente en una
sola ción transac-, pregúntese si realmente necesitan. Pueden ocurrir en diferentes
transac- ciones locales, y se basan en el concepto de consistencia eventual? Estos
sistemas son mucho más fáciles de construir y la escala (discutiremos esto más
enCapítulo 11).
Si encuentra que el estado realmente quiere que se le mantenga constante, hacer todo
lo posible para evitar su división en el primer lugar. Tratar muy duro. Si realmente
necesita para seguir adelante con la separación, pensar en pasar de una visión
puramente técnica del pro- ceso (por ejemplo, una transacción de base de datos) y, de
hecho crear un concepto concreto para representar a la propia transacción. Esto le da
un mango o un gancho, en el que ejecutar otras aciones oper- como transacciones de
compensación, y una manera de controlar y gestionar estos conceptos más complejos
en su sistema. Por ejemplo, puede crear la idea de un “in- proceso del pedido” que le
da un lugar natural para centrar toda la lógica alrededor de procesar el pedido de
extremo a extremo (y tratar con excepciones).
informes
Como ya hemos visto, en la división de un servicio en partes más pequeñas,
necesitamos también potencial- mente dividido cómo y dónde se almacenan los
datos. Esto crea un problema, sin embargo, cuando se trata de un caso importante y
de uso común: la presentación de informes.
Un cambio en la arquitectura tan fundamental como la adopción de una arquitectura
microservicios hará que una gran cantidad de trastornos, pero no significa que
tengamos que abandonar todo lo que hacemos. La audiencia de nuestros sistemas de
información son usuarios como cualquier otra, y tenemos que tener en cuenta sus
necesidades. Sería arrogante para cambiar fundamentalmente nuestra arquitectura y
sólo pide que adaptarse. Aunque no estoy sugiriendo que el espacio de la
información no está maduro para la interrupción-sin duda es-hay valor en la
determinación de cómo trabajar con los procesos existentes en primer lugar. A veces
tenemos que escoger nuestras batallas.
informes | 93
La base de datos de informes
Informes normalmente necesita para agrupar los datos de juntas en varias partes de
nuestra organización con el fin de generar una salida útil. Por ejemplo, puede ser que
deseemos
94| Capítulo 5: La división de la
Monolith
enriquecer los datos de nuestro libro mayor con las descripciones de lo que se vendió,
que obtenemos de un catálogo. O es posible que desee ver en el comportamiento de
compra de los clientes específicos, de alto valor, lo que podría requerir información
de su historial de compras y su perfil de cliente.
En una arquitectura de servicio estándar, monolítico, todos nuestros datos se
almacenan en una Base de datos se grande. Esto significa que todos los datos están
en un solo lugar, por lo que la presentación de informes a través de toda la
información es en realidad bastante fácil, como se puede simplemente unirse a través
de los datos a través de consultas SQL o similares. Normalmente no vamos a ejecutar
estos informes en la base de datos principal, por temor a la carga gene- ado por
nuestras consultas que afectan el rendimiento del sistema principal, por lo que a
menudo estos sistemas de información colgar en una réplica de lectura como se
muestra enFigura 5-12.
Figura 5-12. la replicación de lectura estándar
Con este enfoque tenemos una boca que considerable todos los datos ya está en un
solo lugar, por lo que podemos utilizar herramientas bastante sencillas para consultar
la misma. Pero también hay un par de inconvenientes con este enfoque. En primer
lugar, el esquema de la base de datos es ahora efectivamente una API compartida
entre las que se ejecutan los servicios monolíticos y cualquier sistema de
información. Por lo que un cambio en el esquema tiene que ser cuidadosamente
administrado. En realidad, este es otro impedimento que reduce las posibilidades de
que cualquiera que desee asumir la tarea de hacer y coordinación NATing tal cambio.
En segundo lugar, hemos limitado las opciones en cuanto a cómo la base de datos
puede ser optimizado para el uso ya sea de casos y el respaldo del sistema en vivo o
el sistema de información. Algunas bases de datos nos permiten hacer optimizaciones
sobre réplicas de lectura para permitir más rápido, más eficiente de informes; por
ejemplo, MySQL nos permitiría correr un motor diferente que no tiene la sobrecarga
de gestión de transacciones. Sin embargo, no podemos estructurar los datos de
manera diferente a la notificación sea más rápido si ese cambio en la estructura de
datos tiene un impacto negativo en el sistema en funcionamiento. Lo que suele
ocurrir es que el esquema sea termina siendo grande para un caso de uso y pésimo
para el otro, o de lo contrario se convierte en el denominador común más bajo, ideal
informes | 95
para ni propósito.
Por último, las opciones de base de datos disponibles nos han explotado
recientemente. Mientras que las bases de datos relacionales estándar exponen
interfaces de consulta SQL que trabajan con muchas herramientas de información,
que no siempre son la mejor opción para el almacenamiento de datos para nuestros
servicios en ejecución.
96| Capítulo 5: La división de la
Monolith
¿Qué pasaría si nuestros datos de aplicación es mejor modelar como un gráfico,
como en Neo4j? ¿O si preferimos utilizar un almacén de documentos como
MongoDB? Del mismo modo, si lo que queríamos explorar el uso de una base de
datos orientada a columnas como Cassandra para nuestro sistema de información, lo
que hace que sea mucho más fácil de escalar para volúmenes mayores? Verse
limitados en la necesidad de tener una base de datos para ambos propósitos
resultados en nosotros a menudo no ser capaz de tomar estas decisiones y explorar
nuevas opciones.
Así que no es perfecto, pero funciona (en su mayoría). Ahora bien, si nuestra
información es almacenada en varios sistemas diferentes, ¿qué hacemos? ¿Hay una
manera de traer todos los datos juntos para hacer funcionar nuestros informes? Y
podríamos también, potencialmente, encontrar una manera de eliminar algunos de los
inconvenientes asociados con el modelo de base de datos de informes estándar?
Resulta que tenemos una serie de alternativas viables a este enfoque. ¿Qué solución
tiene más sentido para usted dependerá de varios factores, pero vamos a explorar
algunas opciones diferentes que he visto en la práctica.
Recuperación de datos a través de llamadas de servicio
Hay muchas variantes de este modelo, pero todos se basan en tirar los datos
necesarios de los sistemas de origen a través de llamadas a la API. Para un sistema de
información muy simple, como un tablero de salpicadero que es posible que quieran
mostrar el número de pedidos realizados en los últimos 15 minutos, esto podría estar
bien. Para informar a través de los datos de dos o más sistemas, es necesario realizar
varias llamadas para ensamblar estos datos.
Este enfoque se degrada rápidamente con los casos de uso que requieren grandes
volúmenes de datos, sin embargo. Imaginemos un caso de uso donde queremos
informar sobre el comportamiento de compra de los clientes de nuestra tienda de
música en los últimos 24 meses, mirando a diversas tendencias en el comportamiento
del cliente y cómo esto ha impactado en los ingresos. Tenemos que tirar de grandes
volúmenes de datos de los sistemas, al menos, del cliente y de finanzas. Mantener
una copia local de estos datos en el sistema de información es peligroso, ya que
puede que no sepamos si ha cambiado (datos tóricas incluso his- se pueden cambiar
después de los hechos), de modo de generar un informe preciso que necesitamos toda
la financiación y registros de clientes por los últimos dos años. Con aún modestos
fibras mero de clientes, se puede ver que esto rápidamente se convertirá en una
operación muy lenta.
Informando sistemas también a menudo confían en las herramientas de terceros que
se esperan para recuperar datos de una determinada manera, y aquí proporciona una
interfaz SQL es la forma más rápida de garantizar su cadena de herramienta de
informes es tan fácil de integrar con posible. Todavía podríamos utilizar este método
para extraer datos periódicamente en una base de datos SQL, por supuesto, pero esto
Recuperación de datos a través de las
llamadas al servicio | 95
todavía nos presenta algunos retos.
Uno de los retos principales es que las API expuestas por los diferentes
microservicios pueden no estar diseñados también para informar de casos de uso. Por
ejemplo, un servicio de atención al cliente puede permitir que encontremos un cliente
mediante un ID, o buscar un cliente por varios campos, pero no necesariamente
exponer una API para recuperar todos los clientes. Esto podría dar lugar a muchas
llamadas que se están realizando para recuperar todos los datos, por ejemplo, tener
que recorrer una lista
96| Capítulo 5: La división de la
Monolith
de todos los clientes, hacer una llamada por separado para cada uno. Esto no sólo
podría ser ineficiente para el sistema de información, que podría generar carga para
el servicio en cuestión también.
A pesar de que podría acelerar algunos de los recuperación de datos mediante la
adición de cabeceras de caché de los recursos expuestos por nuestro servicio, y tienen
estos datos en caché en algo así como un proxy inverso, la naturaleza de la
información es a menudo que se accede a la larga cola de datos. Esto significa que
muy bien podemos solicitar recursos que nadie ha solicitado otra cosa antes (o al
menos no por un tiempo suficientemente largo), lo que resulta en una pérdida de
caché potencialmente costosa.
Tú podría resolver este mediante la exposición de las API de lotes para la notificación
sea más fácil. Por ejemplo, nuestro servicio al cliente podría permitir que usted pase
una lista de los ID de cliente a ella para recuperarlos en lotes, o incluso puede
exponer una interfaz que le permite desplazarse por todos los clientes. Una versión
más extrema de este es el modelo de la solicitud por lotes como un recurso por
derecho propio. Por ejemplo, el servicio al cliente podría exponer algo así como un
criterio de valoración de recursos BatchCustomerExport. El sistema de llamada
podría publicar un BatchRequest, tal vez pasando en un lugar donde un archivo se
puede colocar con todos los datos. El servicio al cliente devolverá un código de
respuesta HTTP 202, lo que indica que la solicitud fue aceptada, pero aún no se ha
procesado. El sistema de llamada a continuación, podría sondear el recurso de espera
hasta que se recupera un estado 201 Creado, lo que indica que la solicitud se ha
cumplido, y luego el sistema de llamada podría ir a buscar los datos. Esto permitiría
potencialmente grandes archivos de datos a ser exportados sin el añadido de ser
enviado a través de HTTP; en cambio, el sistema podría simplemente guardar un
archivo CSV en una ubicación compartida.
He visto el enfoque anterior utilizado para la inserción lote de datos, en los que
funcionaba bien. Estoy menos a favor de ella para informar de sistemas, sin embargo,
ya que siento que hay otras soluciones, potencialmente más simples que pueden
escalar de manera más efectiva cuando estás oferta- ing con las necesidades de
información tradicionales.
Bombas de datos
En lugar de que el sistema de información tirar de los datos, en lugar podríamos tener
los datos llevados al sistema de información. Una de las desventajas de la
recuperación de los datos por Stan- dard HTTP llama es la sobrecarga de HTTP
cuando estamos haciendo un gran número de llamadas, junto con la sobrecarga de
tener que crear APIs que puedan existir sólo para fines informativos. Una opción
alternativa es tener un programa independiente que se accede directamente a la base
de datos del servicio que es la fuente de los datos, y la bombea a una base de datos de
informes, como se muestra enFigura 5-13.
Recuperación de datos a través de las
llamadas al servicio | 97
Figura 5-13. Utilizando una bomba de datos para empujar periódicamente datos a una base de
datos central de informes
A este punto se le dice, “Pero Sam, dijo que tener un montón de programas que
integran en la misma base de datos es una mala idea!” Al menos espero que se le dice
que, dada la firmeza con la que he señalado antes! Este enfoque, si se aplica
correctamente, es una notable excepción, donde las desventajas del acoplamiento
están más que mitigado haciendo que la presentación de informes más fácil.
A empezar, el bombeo de datos debe ser construido y gestionado por el mismo
equipo que gestiona el servicio. Esto puede ser algo tan simple como un programa de
línea de comandos activado a través de Cron. Este programa tiene que tener un
profundo conocimiento tanto de la base de datos final inter para el servicio, y
también el esquema de presentación de informes. El trabajo de la bomba es mapear
una de la otra. Tratamos de reducir los problemas de acoplamiento para el esquema
del servicio por tener el mismo equipo que gestiona el servicio también gestionar la
bomba. Yo sugeriría que, de hecho, que la versión de control de estos juntos, y tienen
construye de la bomba de datos creada como un artefacto adicional como parte de la
construcción del propio servicio, con la suposición de que cada vez que se
implementa una de ellas, se implementa los dos. Como hemos manifestado
explícitamente que hacemos uso de estos juntos,
El acoplamiento en el propio esquema de informes que queda, pero hay que tratarlo
como un API cado pu- que es difícil de cambiar. Algunas bases de datos nos dan
técnicas donde se puede mitigar aún más este costo.Figura 5-14 muestra un ejemplo
de esto para ses databa- relacionales, donde podríamos tener un esquema en la base
de datos de informes para cada servicio, utilizando cosas como vistas materializadas
para crear la vista agregada. De esa manera, exponer sólo el esquema de informes
para los datos de los clientes a la bomba de datos de clientes. Si esto es algo que se
puede hacer de una manera performante, sin embargo, dependerá de las capacidades
de la base de datos que eligió para la presentación de informes.
Las bombas de
datos | 97
Figura 5-14. La utilización de vistas materializadas para formar un solo esquema de informes
monolítica
Aquí, por supuesto, la complejidad de la integración es empujado más
profundamente en el esquema, y se apoyará en las capacidades de la base de datos
para hacer una configuración tal performant. Aunque creo que los datos de las
bombas en general son una sugerencia sensata y viable, estoy convencido de menos
confirma que la complejidad de un esquema segmentado es que vale la pena,
especialmente teniendo en cuenta los desafíos en la gestión del cambio en la base de
datos.
destinos alternativos
En un proyecto que estaba involucrada, se utilizó una serie de bombas de datos para
poblar archivos JSON en AWS S3, la utilización eficaz de S3 para hacerse pasar por
un mercado de datos gigante! Este enfoque ha funcionado muy bien hasta que
tuvimos que escalar nuestra solución, y en el momento de la escritura estamos
buscando para cambiar estas bombas para llenar su lugar un cubo que puede ser
integrado con herramientas de informes estándar como Excel y Tableau.
Bomba de datos de eventos
En Capítulo 4, Hemos tocado en la idea de microservicios emisores de eventos
basados en el cambio de estado de las entidades que gestionan. Por ejemplo, nuestro
servicio al cliente puede emitir un evento cuando se crea un cliente dado, o actualiza
o suprime. Para aquellos que exponen microservicios alimenta tal caso, tenemos la
opción de escribir nuestro propio suscriptor de eventos que bombea datos en la base
98| Capítulo 5: La división de la
Monolith
de datos de informes, como se muestra enFigura 5-15.
Las bombas de
datos | 99
Figura 5-15. Un conjunto de datos de eventos de la bomba con los eventos de cambio
de estado para poblar una base de datos de informes
El acoplamiento en la base de datos subyacente de la microService fuente está ahora
evitado. En su lugar, sólo estamos unión a los eventos emitidos por el servicio, que
están diseñados para ser expuesto a los consumidores externos. Dado que los eventos
son temporales en la naturaleza, sino que también hace que sea más fácil para
nosotros ser más inteligentes en lo que los datos que enviamos a nuestro almacén
central de informes; podemos enviar datos al sistema de información como vemos un
evento, lo que permite que los datos fluyan más rápidamente a nuestro sistema de
información, en lugar de confiar en un horario regular al igual que con la bomba de
datos.
Además, si almacenamos los eventos que ya han sido procesados, sólo podemos
procesar los nuevos eventos a medida que llegan, asumiendo las citas antiguas que ya
han sido asignadas en el sistema de información. Esto significa que nuestra inserción
será más eficiente, ya que sólo necesitamos enviar los deltas. Podemos hacer cosas
similares con una bomba de datos, pero tenemos que manejar esto por nosotros
mismos, mientras que la naturaleza fundamentalmente temporal de la corriente de
eventos (bolígrafos x HAP en fecha y hora y) nos ayuda en gran medida.
A medida que nuestra bomba de datos de eventos es menos acoplada a la parte
interna del servicio, sino que también es más fácil considerar esta siendo manejado
por un grupo separado del equipo de cuidado de la propia microService. Mientras la
naturaleza de nuestro flujo de sucesos no abonados excesivamente par a los cambios
en el servicio, este asignador de evento puede evolucionar de forma independiente
del servicio que se haya suscrito.
Las principales desventajas de este método son que toda la información requerida
debe ser transmitido como eventos, y no puede escalar, así como una bomba de datos
para grandes volúmenes de datos que tiene la ventaja de operar directamente en el
nivel de base de datos. No obstante, el acoplamiento flojo y datos más frescos
disponibles a través de un enfoque de este tipo hace que sea muy vale la pena
considerar si ya está exponiendo a los eventos apropiados.
Bomba de los datos de copia de seguridad
Esta opción se basa en un enfoque utilizado en Netflix, que se aprovecha de las
soluciones de copia de seguridad existen- tes y también resuelve algunos problemas
de escala que Netflix tiene que tratar. En cierto modo, se puede considerar esto como
un
dedeuna
bomba de datos, pero que pareció una solución muy
100| caso
Capítuloespecial
5: La división
la
interesante que merece la inclusión.
Monolith
Netflix ha decidido estandarizar Cassandra como el almacén de respaldo de sus
servicios, de los cuales hay muchos. Netflix ha invertido mucho tiempo en la
construcción de herramientas para
Bomba de los datos de copia de seguridad | 99
Cassandra hacer fácil trabajar con él, gran parte del cual la compañía ha compartido
con el resto del mundo a través de numerosos proyectos de código abierto.
Obviamente, es muy importante que las tiendas de Netflix datos se copian
correctamente. Para realizar una copia de seguridad de datos Cassandra, el enfoque
estándar es hacer una copia de los archivos de datos que respaldan y guardarlo en un
lugar seguro. tiendas de Netflix estos archivos, conocidos como SSTables, en el
almacén de objetos S3 de Amazon, que ofrece importantes garantías de durabilidad
de datos.
Netflix tiene que informar a través de todos estos datos, pero teniendo en cuenta la
escala involucrada esto es un desafío no trivial. Su enfoque es utilizar Hadoop que
utiliza copia de seguridad SSTable como la fuente de sus puestos de trabajo. Al final,
Netflix terminó la implementación de una tubería capaz de proceso- grandes
cantidades ing de datos utilizando este enfoque, que luego de código abierto como
elproyecto Egisto. Al igual que las bombas de datos, sin embargo, con este patrón
aún tenemos un acoplamiento a la presentación de informes de destino del esquema
(o sistema de destino).
Es concebible que el uso de un enfoque semejante, es decir, el uso de creadores de
mapas que trabajan fuera de las copias de seguridad funcionaría en otros contextos. Y
si usted ya está usando Cassan- dra, Netflix ya ha hecho gran parte del trabajo para
usted!
Hacia Tiempo real
Muchos de los patrones anteriormente descritos son diferentes maneras de conseguir
una gran cantidad de datos de muchos lugares diferentes para un mismo lugar. Pero
lo hace la idea de que todo nuestro será completado de un lugar realmente apilar
hasta más? Tenemos cuadros de mando, alertas, informes financieros, análisis -todos
los usuarios de estos casos de uso tienen diferentes niveles de tolerancia de precisión
y puntualidad, que pueden dar lugar a diferentes opciones técnicas que se apoya. A
medida que detallaremos enCapítulo 8, Nos estamos moviendo cada vez más hacia
los sistemas de concurso completo genéricos capaz de encaminar nuestros datos a
múltiples lugares diferentes dependiendo de la necesidad.
Costo de Cambio
Hay muchas razones por las que, a lo largo del libro, promover la necesidad de hacer
cambios pequeños y graduales, pero uno de los factores clave es comprender el
impacto de cada alteración que hacemos y cambiar de rumbo si es necesario. Esto
nos permite una mejor puerta mitiga el costo de los errores, pero no elimina la
posibilidad de errores en su totalidad. Podemos-y-a cometer errores, y que debemos
abrazar. Lo que también hay que hacer, sin embargo, es entender la mejor manera de
mitigar los costos de esos errores.
Como hemos visto, los costos involucrados en el movimiento de código por todas
100| Capítulo 5: La división de la
Monolith
partes dentro de una base de código es bastante pequeña. Tenemos un montón de
herramientas que nos apoyan, y si hacemos que un problema, la solución es generalmente rápida. Dividir además una base de datos, sin embargo, es mucho más
trabajo, y hacer retroceder un cambio de base de datos es tan compleja. Del mismo
modo, desenredar una inte- gración excesivamente acoplado entre servicios, o tener
que reescribir completamente un API que es utilizado por múltiples consumidores,
puede ser una tarea considerable. La gran coste de cambio significa que éstos
La comprensión de Causas | 101
las operaciones son cada vez más arriesgado. ¿Cómo podemos gestionar este riesgo?
Mi enfoque es tratar de cometer errores, donde el impacto será más bajo.
Que tienden a hacer la mayor parte de mi forma de pensar en el lugar donde el coste
del cambio y el costo de los errores es tan baja como puede ser: la pizarra. Esbozar el
diseño propuesto. Vea lo que sucede cuando se ejecuta casos de uso a través de lo
que usted piensa aries su servicio obligados- serán. Para nuestra tienda de música,
por ejemplo, imaginar lo que sucede cuando una al cliente central busca de un
registro, se registra en el sitio web, o compra un álbum. Lo que se envían las
llamadas? Qué se empiezan a ver las referencias circulares impares? ¿Ves dos
servicios que son demasiado hablador, lo que podría indicar que debería ser una
cosa?
Una gran técnica aquí es adaptar un enfoque más típicamente enseñado para el diseño
de sistemas orientados a objetos: Clase-responsabilidad-colaboración (CRC) tarjetas.
Con las tarjetas CRC, se escribe en una tarjeta de índice el nombre de la clase, lo que
sus responsabilidades son, y que colabora con. Cuando se trabaja a través de un
diseño propuesto, para cada ser- vicio enumero sus responsabilidades en cuanto a las
capacidades que ofrece, con los rators colabo- especificados en el diagrama. A
medida que trabaja a través de más casos de uso, se empieza a tener una idea de si
todo esto va unido correctamente.
Causas comprensión
Hemos hablado de cómo dividir los servicios aparte más grandes en otros más
pequeños, pero ¿por qué estos servicios crecer tanto en el primer lugar? Lo primero
que debe entender es que el crecimiento de un servicio hasta el punto que hay que
dividir es completamente bien. Queremos que la arquitectura de nuestro sistema
cambie con el tiempo en forma incremental. La clave es saber que necesita dividirse
antes de la división se vuelve demasiado caro.
Pero en la práctica muchos de nosotros hemos visto los servicios crecen mucho más
allá del punto de san- dad. A pesar de saber que un conjunto más pequeño de los
servicios sería más fácil de tratar que la enorme monstruosidad que tenemos
actualmente, todavía arar con el crecimiento de la bestia. ¿Por qué?
Parte del problema es saber por dónde empezar, y espero este capítulo tiene ped Hel-.
Sin embargo, otro reto es el costo asociado con la división a cabo los servicios.
Encontrar un lugar para ejecutar el servicio, haciendo girar una nueva pila de
servicio, etc., son tareas no triviales. Entonces, ¿cómo podemos abordar esto? Bueno,
si haciendo algo está bien, pero difícil, debemos esforzamos para facilitar las cosas.
La inversión en las bibliotecas y los marcos de servicios ligeros puede reducir el
costo asociado con la creación del nuevo servicio. Dando perso- PLE acceso a
máquinas virtuales de provisión de autoservicio o incluso hacer una plataforma como
servicio (PaaS) disponible, será más fácil a los sistemas de previsión y probarlos. A
lo largo del resto del libro, vamos a estar discutiendo una serie de maneras de ayudar
102| Capítulo 5: La división de la
Monolith
a mantener este costo.
La comprensión de Causas | 101
Resumen
Descomponemos nuestro sistema mediante la búsqueda de costuras a lo largo de la
cual los límites del servicio pueden surgir, y esto puede ser un enfoque incremental.
Al obtener buenos para encontrar estas costuras y trabajando para reducir el costo de
la división de servicios a cabo, en primer lugar, podemos continuar creciendo y
evolucionando nuestros sistemas para cumplir con lo requisitos vienen en el camino.
Como se puede ver, algunos de estos trabajos puede ser laborioso. Pero el mismo
hecho de que se puede hacer de forma incremental significa que no hay necesidad de
temer a este trabajo.
Así que ahora podemos dividir nuestros servicios, pero hemos introducido algunos
nuevos problemas también. Tenemos muchos más partes móviles que puedan entrar
en producción ahora! Así que la próxima arriba vamos a bucear en el mundo de la
implementación.
104| Capítulo 5: La división de la
Monolith
CAPÍTULO 6
Despliegue
La implementación de una aplicación monolítica es un proceso bastante sencillo.
Microservicios, con su interdependencia, son harina de otro costal por completo. Si
no se acercan a la derecha del despliegue, que es una de esas áreas en las que la
complejidad puede hacer de su vida una miseria. En este capítulo, vamos a ver
algunas técnicas y tecnologıa que nos puede ayudar a la hora de desplegar
microservicios en arquitecturas de grano fino.
Fueron va a comenzar, sin embargo, echando un vistazo a la integración continua
y la entrega continua. Estos conceptos relacionados, pero diferentes ayudarán a
dar forma a los otros las decisiones que va a hacer cuando se piensa en lo que
construir, cómo construirlo, y cómo implementarlo.
Una breve introducción a la integración continua
La integración continua (CI) ha existido durante varios años en este punto. Vale la
pena pasar un poco de tiempo a repasar los conceptos básicos, sin embargo, como
sobre todo cuando pensamos en el mapeo entre microservicios, construye y control
de versiones torios reposi-, hay algunas opciones diferentes a considerar.
Con CI, el objetivo principal es mantener a todos en sincronía con los demás, lo que
logramos, asegurándose de que recientemente revisado en código integra
adecuadamente con el código existente. Para ello, un servidor CI detecta que el
código ha sido cometido, comprueba hacia fuera, y car- Ries fuera algún tipo de
verificación como asegurarse de que el código se compila y que pasa las pruebas.
Como parte de este proceso, a menudo creamos artefacto (s) que se utilizan para su
posterior validación, tales como la implementación de un servicio en ejecución para
ejecutar las pruebas en contra de ella. Lo ideal es que queremos construir estos
artefactos una vez y sólo una vez, y utilizarlos para todas las implementaciones de
esa versión del código. Esto es con el fin de evitar hacer la misma cosa una y otra
vez, y así que podemos confirmar que el artefacto desplegamos es el que hemos
103
probado. Para habilitar estos
104 | Capítulo 6: Despliegue
artefactos para ser reutilizados, les colocamos en un repositorio de algún tipo, ya sea
proporcionado por la herramienta propia CI o en un sistema independiente.
Vamos a estar buscando en qué tipo de artefactos que podemos utilizar para
microservicios poco, y vamos a ver en profundidad en las pruebas de Capítulo 7.
CI tiene una serie de beneficios. Obtenemos un cierto nivel de respuesta rápida en
cuanto a la calidad de nuestro código. Que nos permite automatizar la creación de
nuestros artefactos binarios. Todo el código necesario para construir el artefacto es en
sí mismo el control de versiones, por lo que puede volver a crear el artefacto si es
necesario. También conseguimos un cierto nivel de trazabilidad de un artefacto
desplegado volver al código, y en función de las capacidades de la herramienta
propia CI, podemos ver qué pruebas se realizaron en el código y los artefactos
también. Es por estas razones que CI ha sido tan cessful Suc.
¿Usted está haciendo realmente?
Sospecho que probablemente está utilizando la integración continua en su propia
organización. Si no es así, usted debe comenzar. Es una práctica clave que nos
permite realizar cambios de forma rápida y sencilla, y sin el cual el viaje en
microservicios va a ser doloroso. Dicho esto, he trabajado con muchos equipos que, a
pesar de decir que hacen CI, son en realidad no hacerlo en absoluto. Ellos confunden
el uso de una herramienta de CI con la adopción de la práctica de la IC. La
herramienta es sólo algo que permite el enfoque.
Me gusta mucho Jez de Humble tres preguntas que hace la gente para poner a prueba
si realmente sub soporte lo CI es acerca de:
Cómo se comprueba en la línea principal de una vez al día?
Tú necesita asegurarse de que su código se integra. Si usted no marca su código
junto con los cambios de todos los demás con frecuencia, se termina haciendo
más difícil el futuro inte- gración. Incluso si está utilizando ramas de corta
duración para gestionar los cambios, integrar con tanta frecuencia como sea
posible en una sola rama de la línea principal.
¿Tiene una serie de pruebas para validar los cambios?
Sin pruebas, solo sabemos que sintácticamente nuestra integración ha
funcionado, pero no sabemos si hemos roto el comportamiento del sistema. CI
sin algún cación verificables que nuestro código se comporta como se esperaba,
no es CI.
Cuando la acumulación se rompe, es que la prioridad # 1 del equipo para solucionarlo?
Una acumulación verde que pasa significa que nuestros cambios se han integrado
de manera segura. Una acumulación rojo significa que el último cambio
posiblemente no integró. Tiene que dejar todo más check-ins que no están
involucrados en la fijación de las compilaciones conseguirlo pasa de nuevo. Si
deja que más cambios se acumulan, el tiempo que toma para fijar la acumulación
103
aumentará drásticamente. He trabajado con equipos en los que la acumulación se
ha roto durante días, dando lugar a un importante esfuerzo para obtener
finalmente una acumulación de paso.
104 | Capítulo 6: Despliegue
Mapeo de integración continua a microservicios
Al pensar en microservicios y la integración continua, tenemos que pensar en cómo
nuestra CI construye mapa para microservicios individuales. Como ya he dicho
muchas veces, queremos asegurarnos de que podemos hacer un cambio a un único
servicio y desplegarlo de forma independiente del resto. Con esto en mente, ¿cómo
debemos mapear ces microservi- individuales a CI construye y código fuente?
Si partimos de la opción más sencilla, podríamos agrupar todo en conjunto. Tenemos
un único repositorio, gigante almacenar todo nuestro código, y tienen una sola
estructura, como vemos enFigura 6-1. Los registros de entrada a este repositorio de
código fuente hará que nuestra estructura para desencadenar, donde vamos a ejecutar
todos los pasos de verificación asociados con todos nuestros microservicios, y
producir múltiples artefactos, todo ello vinculado de nuevo a la misma constitución.
La Figura 6-1. El uso de un único repositorio de código fuente y la acumulación de CI para todos
los microservicios
Esto parece mucho más simple en la superficie que otros enfoques: un menor número
de repositorios de qué preocuparse, y una estructura conceptualmente más simple.
Desde el punto de vista del desarrollador, las cosas son bastante sencillo también.
Acabo de comprobar el código. Si tengo que trabajar en varios servi- cios a la vez,
sólo tiene que preocuparse de una confirmación.
Este modelo puede funcionar perfectamente si se compra en la idea de comunicados
de bloqueo de paso, en la que no le importa la implementación de varios servicios a
la vez. En general, se trata de que sea absolutamente un patrón de evitar, pero muy
pronto en un proyecto, especialmente si sólo un equipo está trabajando en todo, esto
podría tener sentido para períodos cortos de tiempo.
Sin embargo, hay algunas desventajas importantes. Si hago un cambio de una línea
para un servicio de GLE pecado ejemplo, cambiar el comportamiento en el servicio
de usuario enFigura 6-1-todos los otros servicios Verifícate y construidos. Esto
podría tomar más tiempo de lo necesario-estoy esperando que las cosas que
probablemente no necesitan ser probados. Esto afecta nuestro tiempo de ciclo, la
velocidad a la que nos podemos mover un solo cambio del desarrollo para vivir. Más
Mapeo de integración continua a microservicios | 105
preocupante, sin embargo, es saber qué artefactos debe o no debe ser desplegada.
¿Busco ahora necesidad de desplegar todos los servicios de construcción para
empujar mi pequeño cambio en la producción? Puede ser difícil saber; tratar de
adivinar qué servicios realmente cambiaron la sola lectura de la
106 | Capítulo 6: Despliegue
los mensajes de confirmación es difícil. Las organizaciones que utilizan este enfoque
a menudo caen de nuevo a sólo distribuir todo junto, lo que realmente queremos
evitar.
Por otra parte, si mi cambio de una línea para el servicio de usuario rompe la
compilación, no hay otros cambios se pueden hacer a los otros servicios hasta que se
rompen es fijo. Y pensar en un escenario en el que tiene varios equipos de todos
compartir esta acumulación gigante. ¿Quién está a cargo?
Una variación de este enfoque es tener un árbol de origen individual con todo el
código en él, con múltiples CI construye mapeo de las partes de este árbol de origen,
como vemos en Figura 6-2. Con una estructura bien definida, se puede asignar
fácilmente las compilaciones a ciertas partes del árbol de fuentes. En general, yo no
soy un fan de este enfoque, ya que este modelo puede ser un arma de doble filo. Por
un lado, mi proceso de registro de entrada / salida puede ser más fácil ya que tengo
sólo un repositorio de qué preocuparse. Por otro lado, se hace muy fácil de conseguir
en el hábito de revisar en el código fuente para varios servicios a la vez, lo que puede
hacer que sea igual de fácil caer en hacer cambios que los servicios pareja juntos. Yo
preferiría en gran medida este enfoque, sin embargo, por tener una única
acumulación de múltiples servicios.
La Figura 6-2. Un repo fuente individual con subdirectorios asignada a independiente construye
Entonces, ¿hay otra alternativa? El enfoque que prefiero es tener una única
acumulación CI por microService, que nos permitirá realizar y validar un cambio
antes de su despliegue en producción rápidamente, como se muestra enFigura 6-3.
Aquí cada microService tiene su propio repositorio de código fuente, asignada a su
propio IC de construcción. Al hacer un cambio, corro solamente la construcción y las
pruebas que necesito. Me sale un solo artefacto de desplegar. La alineación al equipo
propietario-barco es más clara también. Si es el propietario del servicio, es el
propietario del repositorio y la construcción. Hacer cambios a través de los
repositorios pueden ser más difíciles en este mundo, pero me man- tener esto es más
fácil de resolver (por ejemplo, mediante el uso de secuencias de comandos de línea
de comandos) que el lado negativo de la fuente de control monolítico y construir
proceso.
Mapeo de integración continua a microservicios | 105
La Figura 6-3. Utilizando el código fuente de un depósito de acumulación y CI por microService
Las pruebas para un microService determinado deben vivir en el control de código
fuente con el código fuente de la microService también, para garantizar siempre
sabemos qué pruebas se deben ejecutar en contra de un determinado servicio.
Entonces, cada microService vivirá en su propio repositorio de código fuente, y su
propio proceso de acumulación de CI. Vamos a utilizar el proceso de construcción de
CI para crear nuestros artefactos desplegables también de una forma totalmente
automatizada. Ahora vamos a mirar más allá de CI para ver cómo continua la entrega
encaja.
Construir oleoductos y Entrega Continua
Muy desde el principio en el uso de la integración continua, nos dimos cuenta el valor
de veces tener múltiples etapas dentro de una generación. Las pruebas son un caso
muy común donde esto entra en juego. Puede que tenga una gran cantidad de pruebas
rápidas, con ámbito de pequeño, y un pequeño número de a gran con ámbito, las
pruebas lentas. Si corremos todas las pruebas juntas, es posible que no será capaz de
obtener rápidamente las tarifas reguladas atrás cuando nuestras pruebas rápidas fallan
si estamos a la espera de nuestras pruebas lentas-largas con ámbito para terminar
finalmente. Y si las pruebas rápidas fallan, probablemente no hay mucho sentido en
el funcionamiento de las pruebas más lento de todos modos! Una solución a este
problema es tener diferentes etapas de nuestra construcción, creat- ing lo que se
conoce como una tubería de construcción. Una etapa de las pruebas más rápidas, una
de las pruebas más lentas.
Este concepto de tuberías de construcción nos da una buena manera de rastrear el
progreso de nuestro software, ya que borra cada etapa, nos ayuda a dar una idea de la
calidad de nuestro software. Construimos nuestra artefacto, y que el artefacto se
utiliza en toda la tubería. A medida que nuestro artefacto se mueve a través de estas
etapas, nos sentimos cada vez más seguro de que el software funcionará en la
producción.
El suministro continuo (CD) se basa en este concepto, y algo más. Como se indica
en Jez Humble y Dave Farley del libro del mismo nombre, la administración
108 | Capítulo 6: Despliegue
continua es el método mediante el cual obtenemos una retroalimentación constante
sobre la disponibilidad de la producción de todas y cada registro de entrada, y
además tratar todos y cada registro de entrada como una versión candidata.
Construir oleoductos y entrega continua | 107
Para adoptar plenamente este concepto, tenemos que modelar todos los procesos
implicados en conseguir nuestro software desde la llegada hasta la producción, y
saber dónde cualquier versión del software es en términos de ser limpiado para su
liberación. En el CD, lo hacemos mediante la extensión de la idea de la tubería de
acumulación de varias etapas para modelar cada etapa de nuestro software tiene que
ir a través, tanto manuales como automatizados. EnFigura 6-4, Vemos una tubería de
muestra que puede ser familiar.
Figura 6-4. Un proceso estándar de liberación de modelado como una tubería de acumulación
Aquí queremos realmente una herramienta que abarca CD como un concepto de
primera clase. He visto a muchas personas tratan de cortar y extender herramientas
de CI para que lo hagan de CD, resultando a menudo en sistemas com- plejos que son
nada tan fácil de usar como herramientas que se acumulan en el CD de la
COMIENZO Ning. Herramientas que apoyan totalmente CD le permiten definir y
visualizar estas tuberías, modelando todo el camino a la producción para su software.
Como una versión de nuestro código se mueve a través de la tubería, si pasa una de
estas etapas de verificación automatizados que se mueve a la siguiente etapa. Otras
etapas pueden ser manuales. Por ejemplo, si tenemos un proceso de hombre-UAL
pruebas de aceptación del usuario (UAT) que debería ser capaz de utilizar una
herramienta de CD para modelarlo. Puedo ver la próxima construcción disponibles
listo para ser desplegado en nuestro entorno UAT, desplegarlo, y si pasa nuestras
comprobaciones manuales,
Al modelar todo el camino a la producción de nuestro software, mejoramos
enormemente La visibilidad de la calidad de nuestro software, y también puede
reducir en gran medida el tiempo necesario entre los comunicados, ya que tenemos
un lugar a observar nuestro proceso de acumulación y liberación, y una punto focal
evidente para introducir mejoras.
En un mundo microservicios, donde queremos asegurarnos de que podemos liberar
nuestros servicios de forma independiente el uno del otro, se deduce que al igual que
con IC, vamos a querer una tubería por servicio. En nuestras tuberías, es un artefacto
que queremos crear y moverse a través de nuestro camino hacia la producción. Como
siempre, resulta que nuestros artefactos pueden venir en muchos tamaños y formas.
Vamos a ver algunas de las opciones más comunes disponibles para nosotros en un
momento.
Y las excepciones inevitables
Al igual que con todas las buenas reglas, hay excepciones debemos tener en cuenta
también. El enfoque de “un servicio de micro por acumulación” es absolutamente
108 | Capítulo 6: Despliegue
algo que se debe apuntar para, pero hay momentos en los que algo más tiene sentido?
Cuando un equipo está empezando a cabo con un nuevo proyecto, especialmente un
Greenfield aquel en el que están trabajando con una hoja de papel en blanco, es muy
probable que habrá una gran cantidad de rotación en términos de trabajar a cabo en
los límites del servicio se encuentran. Esta es una buena razón, de hecho, para
mantener sus servicios iniciales en el lado más grande hasta su comprensión del
dominio estabiliza.
Construir oleoductos y entrega continua | 107
Durante este tiempo de rotación, cambios a través de los límites del servicio es más
probable, y lo que está o no en un determinado servicio puede cambiar con
frecuencia. Durante este período, tener todos los servicios en una sola estructura para
reducir el coste de los cambios cruzada de servicios puede tener sentido.
Que se sigue, sin embargo, que en este caso es necesario para comprar en la
liberación de todos los servicios como un paquete. También tiene absoluta necesidad
de ser un paso transitorio. Como API del servicio Estabilizante lize, que comenzará a
moverse hacia construye su propia cuenta. Si después de unas semanas (o un número
muy pequeño de meses) que no puede conseguir la estabilidad en los límites del
servicio con el fin de separar adecuadamente, fusionarlos de nuevo en un servicio
más monolítica (aunque conservando la separación modular dentro de los límites) y
dése tiempo para poder familiarizarse con el dominio. Esto refleja las experiencias de
nuestro propio equipo SnapCI, como hemos comentado enCapítulo 3.
Los artefactos Específicos de la Plataforma
La mayoría de las pilas de tecnología tienen algún tipo de artefacto de primera clase,
junto con herramientas para crear y SUP- puerto de instalarlos. Ruby tiene gemas,
Java tiene archivos JAR y los archivos WAR, y Python tiene huevos. Los
desarrolladores con experiencia en una de estas pilas estarán bien versados en el
trabajo con (y es de esperar la creación de) estos artefactos.
Desde el punto de vista de un microService, sin embargo, dependiendo de la
tecnología de pila, este artefacto puede no ser suficiente por sí mismo. Mientras que
un archivo JAR de Java puede ser hecho para ser ejecutable y ejecutar un proceso de
HTTP integrado, para cosas como las aplicaciones Ruby y Python, que se puede
esperar de utilizar un gestor de procesos se ejecuta dentro de Apache o Nginx. Así
que es posible que tengamos alguna forma de instalar y configurar otro software que
necesitamos con el fin de implementar y poner en marcha nuestros artefactos. Aquí
es donde las herramientas automatizadas de gestión de configuración, como la
marioneta y el chef puede ayudar.
Otra pega aquí es que estos artefactos son específicas para un determinado conjunto
de tecnología, lo que puede hacer el despliegue más difícil cuando tenemos una
combinación de tecnologías en el juego. Piense en ello desde el punto de vista de
alguien que trata de implementar varios servicios juntos. Podrían ser un desarrollador
o un probador con ganas de probar algunas funciones, o podría ser alguien
administrar una implementación de producción. Ahora imagina que esos servi- cios
utilizan tres mecanismos de despliegue completamente diferentes. Tal vez tenemos
una gema de rubíes, un archivo JAR, y un paquete nodejs NGP. Iban a darle las
gracias?
La automatización puede recorrer un largo camino para ocultar las diferencias en los
mecanismos de despliegue de los artefactos subyacentes. Cocinero, de marionetas, y
Ansible todo el apoyo múl- tiples diferentes comunes específicos de tecnología de
110 | Capítulo 6: Despliegue
construcción artefactos también. Pero hay diferentes tipos de artefactos que podrían
ser aún más fácil trabajar con ellos.
Específicos de la Plataforma
Artefactos | 109
Los artefactos del sistema operativo
Una forma de evitar los problemas asociados con artefactos específicos de tecnología
consiste en CRE comió artefactos que son nativas del sistema operativo subyacente.
Por ejemplo, para un sistema basado en CentOS o RedHat-, podría construir RPM;
para Ubuntu, podría construir un paquete deb; o para Windows, un MSI.
La ventaja de usar artefactos específicos de OS es que desde el punto de vista de
implementación no nos importa lo que la tecnología subyacente es. Sólo tiene que
utilizar el nativo de herramientas para el sistema operativo para instalar el paquete.
Las herramientas del sistema operativo también nos puede ayudar a desinstalar y
obtener información sobre los paquetes también, e incluso pueden proporcionar
depósitos de paquetes que nuestras herramientas de CI puede empujar a. Gran parte
del trabajo realizado por el gestor de paquetes de sistema operativo también podrá
utilizarse para compensar el trabajo que de otro modo podrían hacer en una
herramienta como la marioneta o cocinero. En todas las plataformas Linux que he
utilizado, por ejemplo, se pueden definir las dependencias de los paquetes a otros
paquetes en las que confía, y las herramientas del sistema operativo se instalará
automáticamente para usted también.
La desventaja puede ser la dificultad en la creación de los paquetes en el primer
lugar. Para Linux, elherramienta de gestor de paquetes FPM da una abstracción más
agradable para la creación de paquetes del sistema operativo Linux, y la conversión
de una implementación basada en archivo comprimido a una implementación basada
en sistema operativo puede ser bastante sencillo. El espacio de Windows es algo más
complicado. El sistema de envasado nativa en forma de instaladores MSI y similares
dejan mucho que desear en comparación con las capacidades en el espacio Linux. El
sistema de paquetes NuGet ha comenzado a ayudar a resolver esto, al menos en
términos de ayudar a gestionar las librerías de desa- rrollo. Más recientemente, se ha
extendido Chocolatey NuGet estas ideas, que proporciona un gestor de paquetes para
Windows diseñado para la implementación de herramientas y servicios, lo cual es
mucho más parecido a los gestores de paquetes en el espacio Linux. Este es sin duda
un paso en la dirección correcta,
Otra desventaja, por supuesto, podría ser si va a implementar en múltiples sistemas
operativos diferentes. La sobrecarga de administración de artefactos para diferentes
sistemas operativos podría ser bastante elevado. Si va a crear software para otras
personas para su instalación, puede que no tenga una opción. Si va a instalar software
en las máquinas que controles, sin embargo, sugeriría nos fijamos en unificadora o al
menos reducir el número de diferentes sistemas operativos que utilice. Se puede
reducir en gran medida las variaciones en el comportamiento de una máquina a la
siguiente, y simplificar las tareas de implementación y mantenimiento.
En general, aquellos equipos que he visto que se han trasladado a la gestión de
paquetes basada en sistema operativo han simplificado su enfoque de
implementación, y tienden a evitar la trampa de grandes com- plejo guiones,
110 | Capítulo 6: Despliegue
despliegue. Especialmente si estás en Linux, esto puede ser una buena manera de
sim- plificar el despliegue de microservicios utilizando pilas de tecnología dispares.
Específicos de la Plataforma
Artefactos | 109
Imágenes personalizadas
Uno de los retos con los sistemas de gestión de la configuración automatizados como
Pup- mascota, cocinero, y Ansible puede ser el tiempo necesario para ejecutar las
secuencias de comandos en una máquina. Vamos a dar un ejemplo simple de un
servidor que se está aprovisionado y configurado para permitir el despliegue de una
aplicación Java. Asumamos que estoy usando AWS para aprovisionar el servidor,
usando la imagen de Ubuntu estándar. Lo primero que tengo que hacer es instalar el
Oracle JVM para ejecutar mi aplicación Java. He visto este sencillo proceso de toma
alrededor de cinco minutos, con un par de minutos tomadas por la máquina que está
siendo aprovisionado, y algunos más para instalar la JVM. Entonces podemos pensar
en tener que poner nuestro software en él.
Esto es en realidad un ejemplo bastante trivial. A menudo nos querremos instalar
otros bits comunes de software. Por ejemplo, es posible que desee utilizar para la
recopilación de estadísticas collectd OS, utilice logstash para la agregación de
registro, y tal vez instalar los bits apropiados de Nagios para monitorear (hablaremos
más sobre este software enCapítulo 8). Con el tiempo, más cosas puede ser que
consiga añadido, lo que lleva a cantidades cada vez más largos de tiempo necesario
para la visión pro de estas dependencias.
Marioneta, Chef, Ansible, y sus semejantes pueden ser inteligentes y evitarán
software que ya está presente la instalación. Esto no significa que la ejecución de las
secuencias de comandos en las máquinas existentes será siempre rápida, por
desgracia, como ejecutar todos los controles lleva tiempo. También queremos evitar
mantener nuestras máquinas existido por mucho tiempo, ya que no queremos para
permitir demasiada cambios de configuración (que vamos a explorar en mayor
profundidad en breve). Y si estamos usando una plataforma de computación bajo
demanda que podríamos estar constantemente cerrando y girando nuevos casos sobre
una base diaria (o con mayor frecuencia), por lo que la naturaleza declarativa de estas
herramientas de gestión de configuración puede ser de uso limitado.
Con el tiempo, viendo las mismas herramientas se instalan una y otra vez puede
convertirse en una verdadera molestia. Si usted está tratando de hacer esto varias
veces al día, tal vez como parte del desarrollo o CI-esto se convierte en un verdadero
problema en términos de proporcionar retroalimentación rápida. También puede
conducir a un mayor tiempo de inactividad cuando se despliega en la producción si
los sistemas no permiten la implementación sin tiempo de inactividad, ya que usted
está esperando para instalar todos los requisitos previos en sus máquinas, incluso
antes de llegar a la instalación del software. Modelos como el despliegue azul / verde
(que discutiremos enCapítulo 7) Pueden ayudar a mitigar esto, ya que nos permiten
desplegar una nueva versión de nuestro servicio sin tomar el viejo fuera de línea.
Un enfoque para reducir este tiempo spin-up es crear una imagen de máquina virtual
que hornea en algunas de las dependencias comunes que usamos, como se muestra en
Figura 6-5. Todas las plataformas lización virtualmente que he usado le permiten
Imágenes personalizadas
| 111
construir sus propias imágenes, y las herramientas para hacerlo son mucho más
avanzados de lo que eran hace unos años. Esto cambia las cosas un poco. Ahora
podríamos hornear las herramientas comunes en nuestra propia imagen. Cuando
nosotros
112| Capítulo 6: Despliegue
desee implementar nuestro software, hacemos girar una instancia de esta imagen
personalizada, y todo lo que tenemos que hacer es instalar la versión más reciente de
nuestro servicio.
Figura 6-5. La creación de una imagen de máquina virtual personalizada
Por supuesto, porque se genera la imagen sólo una vez, cuando se inicie
posteriormente copias de esta imagen que no es necesario pasar el tiempo la
instalación de sus dependencias, ya que ya están allí. Esto puede resultar en un
ahorro significativo de tiempo. Si sus dependencias centrales no cambian, las nuevas
versiones de su servicio pueden continuar utilizando la misma imagen base.
Hay algunos inconvenientes con este enfoque, sin embargo. Construyendo las
imágenes pueden tardar mucho tiempo. Esto significa que para los desarrolladores es
posible que desee apoyar otras formas de implementación de servicios para
asegurarse de que no tienen que esperar media hora sólo para crear una expansión
binaria. En segundo lugar, algunas de las imágenes resultantes pueden ser grandes.
Esto podría ser un problema real si va a crear sus propias imágenes de VMWare, por
ejemplo, como una imagen de 20 GB en torno a una red móvil no es siempre una
actividad sencilla. Vamos a estar buscando en la tecnología tainer con- poco, y en
concreto del estibador, que puede evitar algunos de estos inconvenientes.
Históricamente, uno de los retos es que la cadena de herramientas necesario para
construir una imagen tan variada de plataforma en plataforma. La construcción de
una imagen de VMWare es diferente de la construcción de una imagen de una
imagen Rackspace un vagabundo AWS IAM, o. Esto puede no haber sido un
problema si tuviera la misma plataforma todas partes, pero no todas las
organizaciones fueron tan afortunados. E incluso si lo fueran, las herramientas de
este espacio eran a menudo difíciles de trabajar con ellos, y se llevan bien con otras
herramientas que podría estar usando para la configuración de la máquina.
Envasador es una herramienta diseñada para hacer de la creación de imágenes mucho
Imágenes personalizadas
| 113
más fácil. El uso de scripts de configuración de su elección (Chef, Ansible, de
marionetas, y más son compatibles), que nos permite
114| Capítulo 6: Despliegue
crear imágenes para diferentes plataformas de la misma configuración. En el
momento de la escritura, que tiene soporte para VMware, AWS, Rackspace Cloud,
Océano Digital, y vagabundo, y he visto equipos lo utilizan con éxito para la creación
de imágenes de Linux y Windows. Esto significa que podría crear una imagen para la
implementación en su entorno de producción de AWS y una imagen Vagrant a juego
para el desarrollo local y la prueba, todos de la misma configuración.
Imágenes como artefactos
Así podemos crear imágenes de máquinas virtuales que cocer en las dependencias de
acelerar Feed- atrás, pero ¿por qué detenerse ahí? Podríamos ir más lejos, hornear
nuestro servicio en la propia imagen, y adoptar el modelo de ser nuestro artefacto
servicio de una imagen. Ahora, cuando lancemos nuestra imagen, nuestro servicio
está allí listo para funcionar. Esta vez muy rápido spin-up es la razón por la que
Netflix ha adoptado el modelo de hornear sus propios servicios como AWS IAM.
Al igual que con los paquetes específicos de OS, estas imágenes de VM se convierten
en una buena manera de abstraer las diferencias en las pilas de tecnología utilizados
para crear los servicios. ¿Nos importa si el servicio que se ejecuta en la imagen está
escrito en Ruby o Java, y utiliza un archivo JAR joya? Todo lo que importa es que
funciona. Nos podemos centrar nuestros esfuerzos, a continuación, en la
automatización de la creación y despliegue de estas imágenes. Esto también se
convierte en una forma muy bien para poner en práctica otro concepto de despliegue,
el servidor inmutable.
Servidores inmutables
Al almacenar toda nuestra configuración de control de código fuente, que estamos
tratando de asegurar que podemos reproducir automáticamente los servicios y
entornos de esperar enteras a voluntad. Pero una vez que corremos nuestro proceso
de despliegue, lo que pasa si alguien viene, se registra en la caja, y cambia las cosas,
independientemente de lo que está en control de código fuente? Este problema se
llama a menudo deriva de configuración: el código de control de código fuente ya no
refleja la configuración del host que ejecuta.
Para evitar esto, podemos asegurar que no se realizan cambios nunca a un servidor
que ejecuta. En cambio, cualquier cambio, por pequeño que sea, tiene que ir a través
de una tubería de construcción con el fin de crear una nueva máquina. Puede
implementar este patrón sin necesidad de utilizar las implementaciones basadas en
imágenes, sino que también es una extensión lógica de la utilización de imágenes
como artefactos. Durante nuestra creación de la imagen, por ejemplo, que podríamos
desactivar SSH, asegurando que nadie podía siquiera iniciar sesión en el cuadro para
hacer un cambio!
Las mismas advertencias que hemos discutido sobre el tiempo de ciclo se siguen
aplicando, por supuesto. Y también tenemos que garantizar que todos los datos que
nos importa que se almacena en el cuadro se almacena en otro lugar. Estas
Imágenes personalizadas
| 115
complejidades un lado, he visto la adopción de este patrón de plomo a los
despliegues mucho más sencillo y más fácil de la razón, sobre los entornos. Y como
ya he dicho, todo lo que podemos hacer para simplificar las cosas debe llevarse a
cabo!
116| Capítulo 6: Despliegue
entornos
A medida que nuestro software se mueve a través de nuestras etapas de canalización
de CD, también se desplegará en diferentes tipos de entornos. Si pensamos en el
ejemplo construir oleoducto enFigura 6-4, Es probable que considerar al menos
cuatro ambientes distintos: uno entorno en el que manejamos nuestras pruebas lentas,
otra para la UAT, otra para el rendimiento, y una última para la producción. Nuestra
microService debe ser el mismo en todas partes, pero el ambiente será diferente. Por
lo menos, van a estar ciones recogida diferenciada de residuos, distintos de
configuración y anfitriones. Pero a menudo pueden variar mucho más que eso. Por
ejemplo, nuestro entorno de producción para nuestro servicio podría consistir en
varios hosts equilibradas carga-repartidos en dos centros de datos, mientras que
nuestro entorno de prueba sólo podría tener todo lo que se ejecuta en un único host.
Estas diferencias en los entornos pueden introducir algunos problemas.
Me picaron por esto hace personalmente muchos años. Nos despliegue de un servicio
web Java en un contenedor de aplicaciones WebLogic agrupado en la producción.
Este cluster WebLogic replicado estado de sesión entre múltiples nodos, que nos da
un cierto nivel de capacidad de recuperación si un solo nodo que ha fallado. Sin
embargo, las licencias WebLogic eran caros, al igual que las máquinas de nuestro
software se desplegó en. Esto significaba que en nuestro entorno de prueba, nuestro
software se implementa en una sola máquina, en una configuración no agrupado.
Esto nos herido gravemente durante un lanzamiento. Para WebLogic para poder
copiar el estado de sesión entre nodos, los datos de sesión tiene que ser
adecuadamente serializable. Por desgracia, una de nuestras confirmaciones
rompieron esto, así que cuando nos implementarse en producción de nuestra ción
replicativa sesión fallida. Terminamos la resolución de esta empujando duro para
replicar una configuración agrupada en nuestro entorno de prueba.
El servicio que desea implementar es el mismo en todos estos entornos diferentes,
pero cada uno de los ambientes tiene un propósito diferente. En mi portátil
desarrollador Quiero desplegar rápidamente el servicio, potencialmente contra
colaboradores tropezados, para ejecutar pruebas o llevar a cabo algún validación
manual de comportamiento, mientras que cuando puedo implementar en un entorno
de pro- ducción es posible que quiera instalar múltiples copias de mi servicio en de
manera equilibrada load-, quizás divide en uno o más centros de datos por razones de
durabilidad.
A medida que avanza desde su ordenador portátil para construir servidor al entorno
UAT todo el camino a la producción, tendrá que asegurarse de que sus entornos son
cada vez más la producción como para atrapar cualquier problema asociado con estas
diferencias ambientales más pronto. Este será un equilibrio constante. A veces, el
tiempo y el coste de repro- entornos de producción como Duce pueden ser
prohibitivos, por lo que tiene que hacer concesiones. Además, a veces utilizando un
entorno de producción-como puede ralentizar bucles de retroalimentación; a la espera
Imágenes personalizadas
| 117
de 25 máquinas para instalar el software en AWS podría ser mucho más lento que el
simple despliegue de su servicio en una instancia de Vagrant local, por ejemplo.
118| Capítulo 6: Despliegue
Este equilibrio entre los entornos de producción similar y respuesta rápida, no será
estática. Mantenga un ojo en el error que encuentre más abajo y sus tiempos de
retroalimentación, y ajustar este equilibrio tan necesario.
Gestión de entornos de sistemas monolíticos de un solo Artfact puede ser un reto,
especialmente si usted no tiene acceso a los sistemas que son fácilmente
automatizables. Cuando se piensa en múltiples entornos por microService, esto puede
ser aún más desalentador. Vamos a ver en breve en algunas plataformas de
despliegue diferentes que pueden hacer esto mucho más fácil para nosotros.
Configuración de servicio
Nuestros servicios tienen alguna configuración. Idealmente, esto debería ser una
cantidad pequeña, y solamente en aquellas características que cambian de un entorno
a otro, tal como lo nombre de usuario y contraseña debo utilizar para conectar a mi
base de datos? Configuración que cambia de un entorno a otro debe mantenerse a un
mínimo absoluto. Cuanto más su configuración cambia el comportamiento de
servicio fundamental, y cuanto más que la configuración varía de un entorno a otro,
más se va a encontrar problemas sólo en ciertos ambientes, lo cual es doloroso en
extremo.
Así que si tenemos alguna configuración para nuestro servicio que cambiar de una a
otra ENTORNO, ¿cómo debemos manejar esto como parte de nuestro proceso de
implementación? Una opción es construir un artefacto por el medio ambiente, con la
configuración interior del propio artefacto. Inicialmente esto parece sensato. La
configuración está construido justo en; simplemente desplegarlo y todo debería
funcionar bien, ¿verdad? Esto es problemático. Recuerde que el concepto de la
entrega continua. Queremos crear un artefacto que representa la fecha nuestro
comunicado candi-, y moverlo a través de nuestra línea, confirmando que es lo
suficientemente bueno para entrar en producción. Imaginemos construyo un cliente
por servicio de Prueba y artefactos Prod Service- el cliente. Si mi artefacto cliente
por servicio de prueba pasa las pruebas, pero es el artefacto cliente-servicio-Prod que
en realidad implementar,
Hay otros retos. En primer lugar, está el tiempo adicional necesario para construir
estos artefactos. A continuación, el hecho de que lo que necesita saber en tiempo de
compilación lo que existen ambientes. Y, ¿cómo manejar los datos de configuración
sensibles? No quiero que la información acerca de las contraseñas de producción
registramos con mi código fuente, pero si es necesario en tiempo de compilación para
crear todos esos artefactos, esto es a menudo difícil de evitar.
Un mejor enfoque es crear un solo artefacto, y administrar la configuración por
separado. Esto podría ser un archivo de propiedades que existe para cada entorno o
diferentes parámetros pasados a un proceso de instalación. Otra opción popular,
especialmente cuando se trata de un número mayor de microservicios, es utilizar un
sistema dedicado para la configuración Viding pro, que vamos a explorar más
Configuración del servicio |
115
enCapítulo 11.
116| Capítulo 6: Despliegue
Servicio-a-Host Mapping
Una de las preguntas que surge muy pronto en la discusión en torno microser- vicios
es “¿Cómo muchos servicios por máquina?” Antes de continuar, debemos escoger un
término mejor que la máquina, o incluso la caja más genérico que he utilizado
anteriormente . En esta era de tualization vir-, la asignación entre un único host que
ejecuta un sistema operativo y la infraestructura física subyacente puede variar en
gran medida. Por lo tanto, tiendo a hablar de los ejércitos, usándolos como una
unidad genérica de aislamiento, a saber, un sistema operativo en el que puedo instalar
y ejecutar mis servicios. Si va a implementar directamente en máquinas físicas, a
continuación, un servidor físico se asigna a un host (que tal vez no se comterminología totalmente correctas en este contexto, pero en ausencia de mejores
condiciones puede tener que ser suficiente). Si está utilizando la virtualización,
Así que cuando se piensa en diferentes modelos de implementación, hablaremos de
los ejércitos. Así, pues, el número de servicios por host deberíamos tener?
Tengo una visión clara en cuanto a qué modelo es preferible, pero hay una serie de
fac- tores a considerar cuando se trabaja con el modelo que será el adecuado para
usted. También es impor- tante entender que algunas decisiones que tomamos en este
sentido limitarán algunas de las opciones de implementación disponibles para
nosotros.
Servicios Múltiples por host
Tener varios servicios por host, como se muestra en Figura 6-6, Es atractivo por
varias razones. En primer lugar, sólo a partir de un punto de administración de
acogida de vista, es más simple. En un mundo en el que un equipo gestiona la
infraestructura y otro equipo gestiona el software, la carga de trabajo del equipo de
infraestructura es a menudo una función del número de hosts que tiene que gestionar.
Si más servicios se empaquetan en un único host, éste hombre-carga de trabajo
agement no aumenta el número de servicios aumenta. En segundo lugar es el costo.
Incluso si usted tiene acceso a una plataforma de virtualización que le permite
cambiar el tamaño de prestación y los hosts virtuales, la virtualización puede añadir
una sobrecarga que reduce los recursos disponibles subyacentes a sus servicios. En
mi opinión, estos dos problemas se pueden abordar con nuevas prácticas de trabajo y
la tecnología, y vamos a explorar que en breve.
Este modelo también es familiar para aquellos que desplegar en alguna forma de un
con- tainer aplicación. En cierto modo, el uso de un contenedor de aplicaciones es un
caso especial del modelo de múltiples servicios-por-anfitrión, por lo que tendremos
que mirar en forma separada. Este modelo también puede simplificar la vida del
desarrollador. La implementación de servicios múltiples a un solo host en la
producción es sinónimo de desplegar múltiples servicios a un dev ción estaciones de
trabajo local o portátil. Si queremos mirar a un modelo alternativo, queremos
encontrar una manera de mantener esta conceptualmente simple para los
desarrolladores.
Configuración del servicio |
117
Figura 6-6. Múltiples microservicios por host
Hay algunos problemas con este modelo, sin embargo. En primer lugar, puede hacer
seguimiento a más difícil. Por ejemplo, cuando el seguimiento de la CPU, lo que
necesito para hacer un seguimiento de la CPU de un servicio independiente de los
demás? ¿O es que se preocupan por la CPU de la caja en su conjunto? Los efectos
secundarios también pueden ser difíciles de evitar. Si un servicio está bajo carga
significativa, que puede terminar reduciendo los recursos disponibles para otras
partes del sistema. Dorada, cuando scal- ing a cabo el número de servicios que corría,
golpear a este problema. Inicialmente coexistido muchos servicios en una sola caja,
pero la carga desigual en uno de los servicios tendría un impacto negativo en todo lo
demás que se ejecutan en ese anfitrión. Esto hace que el análisis del impacto de
errores de host más compleja, así la asunción de un único host fuera de servicio,
puede tener un efecto dominó.
El despliegue de servicios puede ser algo más compleja también, como asegurar un
des- pliegue no afecta a otro conduce a dolores de cabeza adicionales. Por ejemplo, si
uso Pup- mascota para preparar una gran cantidad, pero cada servicio tiene diferentes
(y potencialmente contradictorias) dependencias, ¿cómo puedo hacer eso? En el peor
de los casos, he visto per- sonas atan múltiples implementaciones de servicios en
conjunto, el despliegue de múltiples servicios diferentes a un único host en un solo
paso, para tratar de simplificar el despliegue de múltiples servicios a un host. En mi
opinión, el pequeño revés en la mejora de la simplicidad es más de OUT- ponderado
por el hecho de que hemos renunciado a una de las principales ventajas de
microservicios: La lucha por la liberación independiente de nuestro software. Si
adopta el modelo de servicios múltiple-per-anfitrión,
Este modelo también puede inhibir la autonomía de los equipos. Si los servicios para
los diferentes equipos se instalan en el mismo host remate para configurar el host por
sus servicios? Con toda probabilidad, esto termina siendo manejado por un equipo
centralizado, lo que significa que se necesita una mayor coordinación para obtener
los servicios desplegados.
Otra cuestión es que esta opción puede limitar nuestras opciones de despliegue de
artefactos. implementaciones basadas Image- están fuera, al igual que los servidores
inmutables menos que se ata múltiples servicios diferentes en un solo artefacto, lo
que realmente queremos evitar.
Servicio-a-Host Mapping | 117
El hecho de tener múltiples servicios en un único host significa que los esfuerzos se
dirigen a escala para el servicio con mayor necesidad de que puede ser complicado.
Del mismo modo, si uno
118| Capítulo 6: Despliegue
microService maneja los datos y operaciones que son especialmente sensibles, lo que
se quiere configurar el host subyacente de manera diferente, o tal vez incluso colocar
el anfitrión en un segmento de red Separando. Tener todo en un host significa que
podría terminar hav- ing para el tratamiento de todos los servicios de la misma
manera, incluso si sus necesidades son diferentes.
Como mi colega Neal Ford pone, muchas de nuestras prácticas de trabajo alrededor
de des- pliegue y la gestión de acogida son un intento de optimizar la escasez de
recursos. En el pasado, la única opción si queríamos otra anfitrión era para comprar o
alquilar otra máquina físi- cas. A menudo, esto tuvo un gran tiempo de espera a la
misma y dio lugar a un largo plazo finan- compromiso oficial. No era raro que los
clientes que he trabajado realiza la provisión de nuevos servidores sólo cada dos o
tres años, y tratando de conseguir máquinas adicionales OUT- lado de estas líneas de
tiempo era difícil. Pero bajo demanda plataformas de computación han drásticamente reducido los costos de los recursos informáticos, y mejoras en la tecnología
de virtualización significar incluso para internamente infraestructura alojada hay más
flexibilidad.
contenedores de aplicaciones
Si está familiarizado con el despliegue de aplicaciones .NET detrás de las
aplicaciones de IIS o Java en un contenedor de servlets, usted estará bien
familiarizado con el modelo en el que múltiples servicios o aplicaciones distintas
sientan dentro de un único contenedor de aplicaciones, que a su vez se encuentra en
un solo host, como vemos en Figura 6-7. La idea es que el contenedor de
aplicaciones sus servicios en vivo en le da beneficios en términos de mejora de
gestión, como el soporte de clustering para manejar la agrupación de varias instancias
juntos, herramientas de monitorización, y similares.
Figura 6-7. Múltiples microservicios por host
Esta configuración también puede producir beneficios en términos de reducir los
gastos generales de los tiempos de lenguaje de ejecución. Considere correr cinco
servicios Java en un único contenedor de servlets Java. Sólo tengo la sobrecarga de
una única JVM. Compare esto con el funcionamiento de cinco JVM independientes
en el mismo host al utilizar contenedores enterrados. Dicho esto, todavía me siento
Servicio-a-Host Mapping | 119
que estos contenedores de aplicaciones tienen bastantes desventajas que usted debe
desafiar auto tu- para ver si son realmente necesarios.
120| Capítulo 6: Despliegue
El primer lugar entre las desventajas es que inevitablemente limitan la elección de la
tecnología. Usted tiene que comprar en una pila de tecnología. Esto puede limitar no
sólo las opciones tecnológicas para la implementación del servicio en sí, sino
también las opciones que tiene en términos de automatización y gestión de sus
sistemas. Como veremos en breve, una de las maneras en que podemos hacer frente a
la sobrecarga de la gestión de múltiples hosts es de alrededor de automatización, y así
limitar nuestras opciones para resolver este bien puede ser doblemente perjudicial.
También me gustaría cuestionar algunos de los valores de las características del
envase. Muchos de ellos tout la capacidad de gestionar grupos de apoyo compartido
estado de sesión en la memoria, algo que queremos evitar absolutamente en cualquier
caso, debido a las dificultades que esto crea al escalar nuestros servicios. Y la
capacidad de vigilancia que proporcionan no será suficiente si tenemos en cuenta el
tipo de monitoreo se unió a punto que queremos hacer en un mundo microservicios,
como veremos enCapítulo 8. Muchos de ellos también tienen tiempos muy lentos
volver a acelerarse, lo que afecta los ciclos de retroalimentación desarrollador.
Hay otros tipos de problemas también. El intento de hacer la gestión del ciclo de vida
adecuado de las aplicaciones en la parte superior de las plataformas como la JVM
puede ser problemático, y más com- plejo que simplemente reiniciar una JVM. El
análisis de uso de recursos y las discusiones también es mucho más compleja, ya que
tiene varias aplicaciones que comparten el mismo proceso. Y recuerde, incluso si lo
hace obtener el valor de un contenedor específico de la tecnología, que no son libres.
Aparte del hecho de que muchos de ellos son comerciales y así tener un catión
implica- costo, añaden una sobrecarga de recursos en sí mismos.
En última instancia, este enfoque es de nuevo un intento de optimizar la escasez de
recursos que simplemente no puede albergar hasta más. Tanto si decide tener
múltiples servicios al huésped como un modelo de implementación, sugeriría
fuertemente mirando microservicios desplegables autónomos como artefactos. Para
.NET, esto es posible con cosas como Nancy, y Java ha apoyado este modelo desde
hace años. Por ejemplo, el recipiente embarcadero incrustado venerable hace para un
servidor HTTP autónomo muy ligero, que es el núcleo de la pila Dropwizard. Google
ha sido conocido por usar felizmente contenedores Jetty incrustados para servir
contenido estático directamente, por lo que sabemos estas cosas pueden funcionar a
escala.
Servicio individual por sistema
Con un modelo de un solo servicio-per-anfitrión se muestra en la Figura 6-8,
Evitamos los efectos secundarios de varios hosts que viven en una misma máquina,
haciendo el seguimiento y la recuperación mucho más simple. Hemos reducido
potencialmente nuestros puntos únicos de fallo. Un corte de luz a un host debe
impactar un solo servicio, a pesar de que no siempre es clara cuando se está
utilizando una plataforma virtualizada. Vamos a cubrir el diseño de la escala y el
fracaso más enCap- 11 ter. También podemos escalar más fácilmente un servicio
Servicio-a-Host Mapping | 121
independiente de los demás, y hacer frente a los problemas de seguridad más
fácilmente enfocando nuestra atención sólo en el servicio y el anfitrión que lo
requiera.
122| Capítulo 6: Despliegue
Figura 6-8. Un único microService por host
Igual de importante es que hemos abierto la posibilidad de utilizar técnicas de despliegue alternativos tales como despliegues basados en imágenes o el patrón del
servidor inmutable, que hemos comentado anteriormente.
hemos añadido una gran complejidad en la adopción de una arquitectura
microService. La última cosa que queremos hacer es ir en busca de más fuentes de
complejidad. En mi opinión, si usted no tiene un PaaS viables disponibles, a
continuación, este modelo hace un muy buen trabajo de reducción ing complejidad
global de un sistema. Tener un modelo de un solo servicio-per-host es
significativamente más fácil de razonar acerca y puede ayudar a reducir la
complejidad. Si no puede abrazar a este modelo, sin embargo, no voy a decir
microservicios no son para usted. Pero yo sugeriría que se mira a avanzar hacia este
modelo con el tiempo como una forma de reducir la complejidad que una
arquitectura microService puede traer.
Tener un mayor número de hosts tiene desventajas potenciales, sin embargo.
Tenemos más servidores para gestionar, y también puede haber una implicación
costo de funcionamiento de los ejércitos más dis- tinct. A pesar de estos problemas,
este sigue siendo el modelo prefiero para arquitecturas MICROSERVICE. Y
hablaremos de algunas cosas que podemos hacer para reducir la sobrecarga de
manejar grandes cantidades de hosts en breve.
Plataforma como servicio
Cuando se utiliza una plataforma como servicio (PaaS), que está trabajando en una
abstracción de nivel más alto que en un solo host. La mayoría de estas plataformas se
basan en la consideración de un artefacto específico de la tecnología, como por
ejemplo un archivo Java guerra o gema Ruby, y automáticamente aprovisionamiento
y ejecutarlo para usted. Algunas de estas plataformas se forma transparente intentar
manejar scal- ing el sistema de arriba a abajo para que, a pesar de una forma (menos
propenso a errores y en mi expe- riencia) más común que permitirá cierto control
sobre el número de nodos podría ejecutar su servicio en adelante, pero se encarga del
resto.
automatización | 121
A el momento de la escritura, la mayor parte de las mejores soluciones PaaS más
pulidas están alojados. Heroku viene a la mente como siendo probablemente la clase
de oro de PaaS. No se encarga solamente de funcionamiento de su servicio, que
también es compatible con servicios como bases de datos de una manera muy simple.
120 | Capítulo 6: Despliegue
soluciones de auto-organizada existen en este espacio, aunque son más inmaduro que
las soluciones alojadas.
Cuando las soluciones PaaS funcionan bien, trabajan muy bien. Sin embargo, cuando
no llegan a trabajar para usted, que a menudo no tiene mucho control en términos de
conseguir bajo el capó para arreglar las cosas. Esto es parte de la compensación que
realice. Yo diría que en mi experiencia, la más inteligente de las soluciones PaaS
tratar de ser, más que ir mal. He usado más de un PaaS que intenta AutoScale basado
en el uso de aplicaciones, pero lo hace mal. Invariablemente, la heurística que
impulsan estos inteligencia tienden a ser adaptado para la aplicación edad promedios
en lugar de su caso de uso específico. Cuanto más estándar que su aplica- ción, lo
más probable es que no podría jugar muy bien con una PaaS.
Como las buenas soluciones PaaS manejan tanto por ti, pueden ser una excelente
manera de manejar la mayor sobrecarga que obtenemos con tener muchas más piezas
móviles. Dicho esto, todavía no estoy seguro de que tenemos todos los modelos de la
derecha en este espacio todavía, y el LIMITA- TED opciones de auto-organizada
significan que este enfoque podría no funcionar para usted. En la década ing comaunque espero que estaremos apuntando PaaS para el despliegue de más de tener que
autogestionar anfitriones y las implementaciones de servicios individuales.
Automatización
La respuesta a tantos problemas que hemos planteado hasta ahora se reduce a la
automatización. Con un pequeño número de máquinas, es posible gestionar todo
manualmente. Solía hacer esto. Recuerdo la ejecución de un pequeño conjunto de
máquinas de producción, y me recopilar registros, implementar el software, y
comprobar los procesos ingresando manualmente en la caja. Mi productividad
parecía estar limitada por el número de ventanas de terminal que pudiera tener
abiertos a la vez, un segundo monitor fue un gran paso adelante. Esto se descompone
muy rápido, sin embargo.
Una de las expulsiones en contra de la instalación de un solo servicio-per-host es la
percepción de que la cantidad de sobrecarga para gestionar estos anfitriones se
incrementarán. Esto es especialmente cierto si usted está haciendo todo
manualmente. El doble de los servidores, el doble de trabajo! Pero si nos automatizar
el control de nuestros anfitriones, y el despliegue de los servicios, entonces no hay
razón por la rea- hijo añadiendo más hosts deben aumentar nuestra carga de trabajo
de una forma lineal.
Pero incluso si mantenemos el número de hosts pequeña, todavía vamos a tener un
montón de servi- cios. Eso significa que múltiples implementaciones de manejar,
servicios para monitorear, troncos para recoger. La automatización es esencial.
La automatización es también cómo podemos asegurarnos de que nuestros
desarrolladores todavía permanecen tivo productividad. Dándoles la capacidad de
auto-servicio de provisión de servicios individuales o grupos de servicios es clave
automatización | 121
para hacer más fácil la vida de los desarrolladores. Idealmente, los desarrolladores
deben tener acceso a exactamente la misma cadena de herramientas que se utiliza
para el despliegue de nuestros servicios de producción a fin de garantizar que
podemos detectar problemas a tiempo. Vamos a estar buscando en una gran cantidad
de tecnología en este capítulo que abarca este punto de vista.
120 | Capítulo 6: Despliegue
Recogiendo tecnología que permite la automatización es muy importante. Esto
comienza con las herramientas utilizadas para administrar hosts. Se puede escribir
una línea de código para poner en marcha una máquina virtual, o apagar uno abajo?
Se puede implementar el software que ha escrito de forma automática? Se puede
implementar cambios de bases de datos sin intervención manual? Adoptar una
cultura de la automatización es clave si desea mantener la complejidad de las
arquitecturas MICROSERVICE bajo control.
Dos estudios de casos sobre el poder de la automatización
Es probable que sea útil para darle un par de ejemplos concretos que explican el
poder del bien automatización. Uno de nuestros clientes en Australia es
RealEstate.com.au (REA). Entre otras cosas, la empresa ofrece listados de bienes
raíces para clientes minoristas y comerciales en Australia y en la región de Asia y el
Pacífico en otros lugares. Durante varios años, se ha estado moviendo su plataforma
hacia un diseño distribuido, microservicios. Cuando se inició en este viaje que tuvo
que pasar mucho tiempo para llegar al ing herramienta- en torno a los servicios sólo
haga lo que facilita a los desarrolladores a máquinas de provisión, para desplegar su
código, o supervisarlos. Esto causó una carga frontal del trabajo tome la iniciativa.
En los tres primeros meses de este ejercicio, REA fue capaz de mover sólo dos
nuevos servicios de micro en la producción, con el equipo de desarrollo de una
responsabilidad plena en toda la construcción, implementación y apoyo de los
servicios. En los próximos tres meses, entre 10-15 se pusieron en marcha los
servicios de una manera similar. Al final del período de 18 meses, REA tenía más de
60-70 servicios.
Este tipo de patrón también se ve confirmado por las experiencias de Dorado, Un
minorista en línea de la manera que se inició en 2007. aplicación Rails monolítica de
la cerda joven estaba empezando a llegar a ser difícil de escalar, y la compañía
decidió en 2009 iniciar la descomposición del sistema en microservicios.
automatización de nuevo, sobre todo herramientas para ayudar a los desarrolladores,
se dio como una razón clave para impulsar la explosión de la cerda joven en el uso de
microservicios. Un año más tarde, dorado tenía alrededor de 10 microservicios viven;
para el año 2012, más de 100; y en 2014, más de 450 microservicios por propia
cuenta, en otras palabras, alrededor de tres servicios de Gilt para todos los
desarrolladores en dorado.
De físico a virtual
Una de las herramientas clave disponibles para nosotros en la gestión de un gran
número de hosts es encontrar formas de fragmentación de seguridad de máquinas
físicas existentes en partes más pequeñas. lización virtualmente tradicional como
VMWare o la utilizada por AWS ha dado enormes beneficios en la reducción de los
gastos generales de gestión de acogida. Sin embargo, ha habido algunos nuevos
avances en este espacio que merece la pena explorar, ya que pueden abrirse aún más
122| Capítulo 6: Despliegue
interesantes posibili- dades para hacer frente a nuestra arquitectura microService.
De físico a virtual | 123
La virtualización tradicional
¿Por qué tener un montón de anfitriones caro? Bueno, si usted necesita un servidor
físico por host, la respuesta es bastante obvia. Si este es el mundo se está operando
en, entonces el modelo múltiple de servicios-per-host es probablemente adecuado
para usted, a pesar de que no se sorprenda si esto se convierte en una restricción cada
vez más desafiante. Sospecho, sin embargo, que la mayoría de ustedes están
utilizando la virtualización de algún tipo. La virtualización permite que rebanemos
un servidor físico en hosts separados, cada uno de los cuales se pueden ejecutar
diferentes cosas. Así que si queremos un servicio por host, no podemos simplemente
el tramo hasta nuestra infraestructura física en trozos cada vez más pequeños?
Bien, para algunas personas, se puede. Sin embargo, cortando la máquina cada vez
mayor en las máquinas virtuales no es libre. Pensar en nuestra máquina física como
un cajón de los calcetines. Si ponemos un montón de separadores de madera en
nuestro cajón, podemos almacenar más calcetines o menos? La respuesta es menos:
los divisores propios ocupan espacio también! Nuestro cajón podría ser más fácil de
tratar y organizar, y tal vez nos podría decidir poner camisetas en uno de los espacios
ahora en lugar de sólo calcetines, pero más divisores significa menos espacio en
general.
En el mundo de la virtualización, tenemos una cabeza similar a nuestros divisores
calcetín cajón. Para entender de dónde proviene de esta sobrecarga, vamos a ver
cómo se realiza la mayoría de virtualización.Figura 6-9 muestra una comparación de
dos tipos de virtualización. A la izquierda, vemos las distintas capas que participan
en lo que se llama el tipo 2 de virtualización, que es el tipo aplicado por AWS,
VMware, vSphere, Xen y KVM. (Tipo 1 virtualización se refiere a la tecnología,
donde las máquinas virtuales se ejecutan directamente en el hardware, no encima de
otro sistema operativo.) En nuestra infraestructura física tenemos un sistema
operativo anfitrión. En este sistema operativo se corre algo que se llama un
hipervisor, que tiene dos puestos clave. En primer lugar, los mapas de recursos como
CPU y la memoria de la máquina virtual en el host físico. Segundo, que actúa como
una capa de control, lo que nos permite manipular las máquinas virtuales mismos.
124| Capítulo 6: Despliegue
Figura 6-9. Una comparación de estándar Tipo 2 virtualización y envases ligeros
De físico a virtual | 125
Dentro de las máquinas virtuales, obtenemos lo que parece ser completamente
diferentes hosts. Pueden ejecutar sus propios sistemas operativos, con sus propios
núcleos. Pueden considerarse máquinas casi ella- metically sellados, mantienen
aislado del host físico subyacente y las otras máquinas virtuales por el hipervisor.
El problema es que el hipervisor aquí tiene que reservar recursos para hacer su
trabajo. Esto quita CPU, I / O, y la memoria que podría ser utilizado en otro lugar.
Los más hosts gestiona el hipervisor, más recursos que necesita. En un momento
determinado, esta sobrecarga se convierte en una restricción de corte de su
infraestructura física más allá. En la práctica, esto significa que a menudo hay
rendimientos decrecientes en corte de una caja física en partes cada vez más
pequeñas, ya que proporcionalmente cada vez más recursos van a la cabeza del
hipervisor.
Vagabundo
Vagabundo es una plataforma de despliegue de gran utilidad, que normalmente se
utiliza para el dev y prueba en lugar de la producción. Vagabundo le proporciona una
nube virtual en su computadora portátil. Debajo, se utiliza un sistema de
virtualización estándar (típicamente VirtualBox, aunque puede utilizar otras
plataformas). Se le permite definir un conjunto de máquinas virtuales en un archivo
de texto, junto con la forma de las máquinas virtuales están conectados en red entre sí
y que las imágenes de las máquinas virtuales debe basarse en. Este archivo de texto
se puede comprobar en y compartida entre los miembros del equipo.
Esto hace que sea más fácil para usted para crear entornos de producción como en su
máquina local. Puede girar múltiples máquinas virtuales a la vez, cierra los
individuales para probar los modos de fallo, y tienen las máquinas virtuales asignada
a través de los directorios locales para que pueda hacer cambios y verlos reflejados
inmediatamente. Incluso para los equipos que utilizan plataformas en la nube bajo
demanda como AWS, la respuesta más rápido de utilizar vagabundo puede ser de
gran ayuda para los equipos de desarrollo.
Una de las desventajas, sin embargo, es que una gran cantidad de máquinas virtuales
que se ejecutan pueden gravar la máquina de desa- rrollo de la media. Si tenemos un
servicio a una máquina virtual, puede que no sea capaz de llevar seguridad de todo el
sistema en su máquina local. Esto puede resultar en la necesidad de apagar algunas
dependencias de hacer las cosas manejables, que es una cosa más que tendrá que
manejar para asegurar que la experiencia de desarrollo y prueba es una buena.
Linux Contenedores
Para los usuarios de Linux, hay una alternativa a la virtualización. En lugar de tener
una visera hiper para segmentar y control de máquinas virtuales separados, los
contenedores de Linux en vez crean un espacio separado proceso en el que viven
otros procesos.
126| Capítulo 6: Despliegue
En Linux, el proceso se ejecute por un usuario dado, y tienen ciertas capacidades en
función de cómo se establecen los permisos. Los procesos pueden generar otros
procesos. Por ejemplo, si pongo en marcha un proceso en un terminal, que el proceso
hijo se considera generalmente un hijo del proceso terminal. El trabajo del núcleo de
Linux es el mantenimiento de este árbol de procesos.
De físico a virtual | 127
contenedores Linux extienden esta idea. Cada contenedor es efectivamente un subárbol del árbol del proceso global del sistema. Estos contenedores pueden tener
recursos físicos asignados a ellos, algo que el kernel maneja para nosotros. Este
enfoque general ha existido en muchas formas, tales como las zonas y OpenVZ
Solaris, pero es LXC que se ha convertido lar más pobla-. LXC ya está disponible
fuera de la caja en cualquier moderna núcleo de Linux.
Si nos fijamos en un diagrama de pila para un host que ejecuta en LXC Figura 6-9,
Vemos unas cuantas diferencias. En primer lugar, no necesitamos un hipervisor. En
segundo lugar, aunque cada contenedor puede ejecutar su propia distribución del
sistema operativo, tiene que compartir el mismo núcleo (porque el núcleo es donde
vive el árbol de procesos). Esto significa que nuestro sistema operativo anfitrión
podría ejecutar Ubuntu, y nuestros contenedores de CentOS, siempre y cuando
ambos podrían compartir el mismo núcleo.
Nosotros no hacemos acaba de beneficiarse de los recursos que se ahorran al no tener
un hipervisor. También ganamos en términos de retroalimentación. contenedores de
Linux son mucho más rápidos a la provisión de máquinas virtuales con toda la grasa.
No es raro que una máquina virtual para tomar muchos minutos para empezar, pero
con los contenedores de Linux, el arranque puede tardar unos segundos. También
tiene un control más preciso sobre los propios contenedores en términos de
asignación de recursos para ellos, lo que hace que sea mucho más fácil de ajustar los
ajustes para obtener el máximo rendimiento del hardware subyacente.
Debido a la naturaleza del ligero-peso de los contenedores, podemos tener muchos
más de ellos escorrentías Ning en el mismo hardware que sería posible con las
máquinas virtuales. Mediante el despliegue de un ser- vicio por contenedor, como
enFigura 6-10, Se obtiene un grado de aislamiento de otros contenedores (aunque
esto no es perfecto), y podemos hacer mucho más rentable de lo que sería posible si
queríamos ejecutar cada servicio en su propia máquina virtual.
La figura 6-10. Servicios en ejecución en recipientes separados
128| Capítulo 6: Despliegue
Los contenedores pueden ser utilizados también con la virtualización de grasa natural
también. He visto más de una disposición del proyecto un gran ejemplo de ejecución
y LXC contenedores AWS EC2 en él para obtener la
De físico a virtual | 129
mejor de ambos mundos: una plataforma de computación efímero en la demanda en
forma de EC2, junto con contenedores altamente flexibles y rápidas que se ejecuta en
la parte superior de la misma.
contenedores de Linux no dejan de tener algunos problemas, sin embargo. Imagínese
que tengo un montón de microservicios que se ejecutan en sus propios contenedores
en un host. ¿Cómo funciona el mundo exterior ha de ver? Usted necesita alguna
manera de encaminar el mundo exterior a través de los contenedores subyacentes,
algo que muchos de los hipervisores hacer por usted con la virtualización normal. He
visto a muchos una persona se hunden enormes cantidades de tiempo en la
configuración de puerto de lucro alejar el uso de iptables para exponer directamente a
los contenedores. Otro punto a tener en cuenta es que estos recipientes no pueden
considerarse completamente sellados el uno del otro. Hay muchas maneras
documentados y conocidos en los que un proceso de un recipiente puede reventar
hacia fuera e interactuar con otros recipientes o el huésped subyacente. Algunos de
estos problemas son por diseño y algunos son insectos que se están abordando, pero
de cualquier manera, si usted no confía en el código que está ejecutando, no
esperamos que se puede ejecutar en un con- tainer y estar seguro. Si necesita ese tipo
de aislamiento, tendrá que considerar el uso de máquinas vir- tuales en su lugar.
Estibador
Docker es una plataforma construida en la parte superior de envases ligeros. Se
ocupa gran parte del trabajo en torno a la manipulación de contenedores para usted.
En estibador, crear y desplegar aplicaciones, que son sinónimo de imágenes en el
mundo VM, si bien por una plataforma basada en contenedores. Acoplable gestiona
el aprovisionamiento de contenedores, se ocupa de algunos de los problemas que el
trabajo en red para usted, e incluso ofrece su propio concepto de registro que le
permite almacenar y aplicaciones de la versión acoplables.
La aplicación de la abstracción del estibador es un útil para nosotros, ya que al igual
que con imágenes de VM la tecnología subyacente que se utiliza para implementar el
servicio se nos oculta. Tenemos nuestra construye para nuestros servicios crean
aplicaciones acoplables, y los almacenan en el REG-terio del estibador, y allá vamos.
Acoplable también puede aliviar algunas de las desventajas de correr una gran
cantidad de servicios a nivel local para fines de pruebas y desarrollo. En lugar de
utilizar Vagrant para albergar varias máquinas virtuales independientes, cada uno con
su propio servicio, podemos albergar una única máquina virtual que se ejecuta en
Vagrant una instancia del estibador. A continuación, utilizamos Vagrant de
configurar y derribar la plataforma acoplable en sí, y el uso del estibador para el
aprovisionamiento rápido de los servicios individuales.
Se están desarrollando una serie de diferentes tecnologías para aprovechar estibador.
CoreOS es un sistema operativo muy interesante diseñado con estibador en mente. Es
un sistema operativo Linux reducidos al mínimo, que ofrece sólo los servicios
esenciales para permitir acoplable a ejecutar. Esto significa que consume menos
130| Capítulo 6: Despliegue
recursos que otros sistemas operativos, por lo que es posible dedicar más recursos de
la máquina subyacente a nuestros ERS contención. En lugar de utilizar un gestor de
paquetes como Debs o RPM, todo el software se instala como aplicaciones
independientes acoplables, cada una ejecutando en su propio contenedor.
De físico a virtual | 131
misma ventana acoplable no resuelve todos los problemas para nosotros. Piense en
ello como un simple PaaS que trabaja en una sola máquina. Si quieres herramientas
para ayudarle a gestionar servicios a través de varias instancias acoplables a través de
múltiples máquinas, usted tiene que mirar a otro software que añade estas
capacidades. Hay una necesidad clave para una capa de programación que le deja
solicitar un recipiente y luego encuentra un recipiente acoplable que puede funcionar
para usted. En este espacio, recientemente, de código abierto y de Kubernetes
CoreOS tecnología de clúster de Google puede ayudar, y parece que cada mes hay un
nuevo participante en este espacio.Deis es otra herramienta intere- sante basado en
acoplable, que se intenta proporcionar un Heroku-como PaaS en la parte superior de
acoplable.
He hablado anteriormente acerca de soluciones PaaS. Mi lucha con ellos siempre ha
sido que a menudo obtienen el nivel de abstracción mal, y que las soluciones de autoorganizado un importante retraso soluciones alojadas como Heroku. Docker se hace
mucho más de este derecho, y la explosión de interés en este espacio significa que
sospecho que se convertirá en una plataforma mucho más viable para todo tipo de
despliegues en los próximos años para todo tipo de diferentes casos de uso. En
muchos sentidos, acoplable con una capa de programación adecuado se encuentra
entre IaaS y soluciones de los PAA contenedores plazo como un servicio (CaaS) ya
está siendo utilizado para describirlo.
Acoplable está siendo utilizado en la producción de múltiples empresas. Se
proporciona muchos de los beneficios de envases ligeros en términos de eficiencia y
velocidad de aprovisionamiento, junto con las herramientas para evitar muchas de las
desventajas. Si usted está interesado en ing Look-a plataformas de despliegue
alternativos, me gustaría sugerir fuertemente a dar una mirada del estibador.
Una interfaz de despliegue
Lo que subyace a la plataforma o artefactos que utiliza, que tiene una interfaz
uniforme para desplegar un servicio dado es vital. Vamos a querer desencadenar el
despliegue de un microService en la demanda en una variedad de situaciones
diferentes, desde las implementaciones a nivel local para dev y prueba para los
despliegues de producción. También vamos a querer mantener los mecanismos de
despliegue lo más similar posible a partir dev para la producción, como el último que
queremos es encontrar a nosotros mismos golpear problemas en la producción a
causa de despliegue utiliza un proceso completamente diferente!
Después de muchos años de trabajo en este espacio, estoy convencido de que la
manera más sensata para activar cualquier despliegue es a través de una simple
llamada de línea de comandos, parametrizable. Esto puede ser provocado por
guiones, puesto en marcha por su herramienta de CI, o ha escrito a mano. He
construido guiones envoltura en una variedad de tecnología de pilas para hacer este
trabajo, a partir de Windows por lotes, para golpear, a scripts de Python tela, y
mucho más, pero todas las líneas de comandos comparten el mismo formato básico.
Una interfaz de despliegue |
127
Necesitamos saber lo que estamos desplegando, por lo que necesitamos para
proporcionar el nombre de una entidad conocida, o en nuestro caso un microService.
También necesitamos saber qué versión de la entidad que queremos. La respuesta a
qué versión tiende a ser una de las tres posibilidades. Cuando
128| Capítulo 6: Despliegue
estás trabajando a nivel local, que va a ser cualquier versión está en su máquina local.
Cuando Exámenes, querrá la versión más reciente verde, que solo podría ser el más
reciente artefacto bendita en nuestro repositorio de artefactos. O cuando se prueba /
diagnóstico de problemas, es posible que desee implementar una acumulación exacta.
La tercera y última cosa que necesitamos saber es qué ambiente queremos que el
servicio de micro desplegado dentro. Como hemos comentado anteriormente, la
topología de nuestra microService puede diferir de un ambiente a otro, pero que debe
ser escondido de nosotros aquí.
Así que, imaginamos, creamos un script de despliegue simple que toma estos tres
parámetros. Decimos que estamos desarrollando a nivel local y desee implementar
nuestro servicio de catálogo en nuestro medio local. Yo podría escribir:
$ Desplegar artefacto = entorno de catálogos = versión local = local
Una vez que me he registrado, nuestro servicio de acumulación IC recoge el cambio
y crea un nuevo artefacto de construcción, lo que le da el número de compilación
B456. Como es habitual en la mayoría de las herramientas de CI, este valor se pasa a
lo largo de la tubería. Cuando nuestra fase de prueba se desencadena, la etapa de CI
se ejecutará:
$ Desplegar artefacto = Catálogo de entorno = ci = versión B456
Mientras tanto, nuestro control de calidad quiere tirar de la última versión del
servicio de catálogo en un entorno de prueba inte- grado para hacer algunas pruebas
exploratorias, y para ayudar con un escaparate. Que corre del equipo:
$ Desplegar artefacto = entorno de catálogos = versión más reciente integrated_qa =
La herramienta que he utilizado la mayor parte de esto es la tela, una biblioteca de
Python diseñada para mapear la línea de comandos llamadas a funciones, junto con
un buen apoyo para el manejo de tareas como SSH a máquinas remotas.
Sincronizarlo con una biblioteca de cliente de AWS como Boto, y usted tiene todo lo
necesario para automatizar totalmente los grandes entornos de AWS. Para Ruby,
capi- strano es similar en algunos aspectos a la tela, y en Windows que podría hacer
mucho uso de PowerShell.
Definición de Medio Ambiente
Es evidente que, para que esto funcione, tenemos que tener alguna manera de definir
lo que nuestros ambientes parecen, y lo que nuestro servicio se ve como en un
entorno determinado. Se puede pensar en una definición de entorno como una
asignación de un microService para calcular, la red y los recursos de
almacenamiento. He hecho esto con los archivos YAML antes, y utilicé mis scripts
para extraer estos datos en.Ejemplo 6-1 es una versión simplificada de un trabajo que
hice hace un par de años para un proyecto que utiliza AWS.
Una interfaz de despliegue |
129
Ejemplo 6-1. Un ejemplo de definición de entorno
desarrollo:
nodos:
- ami_id: ami-e1e1234
Tamaño: t1.micro
credentials_name: eu-oeste-ssh
servicios: [Catálogo de
servicios] Región: eu-oeste-1
producción:
nodos:
- ami_id: Tamaño amie1e1234: m3.xlarge
credentials_name: Prod-credenciales
servicios: [Catálogo de servicios]
número 5
Hemos variado el tamaño de las instancias que utilizamos para ser más rentable.
Usted no necesita una caja de 16 núcleos con 64 GB de RAM para pruebas
exploratorias!
Ser capaz de especificar credenciales diferentes para diferentes entornos es la
clave. dentials CRE para entornos sensibles se almacenan en diferentes
repositorios de código fuente que sólo seleccionar las personas tendrían acceso a.
Decidimos que, por defecto, si un servicio tenía más de un nodo configurado,
queremos crear automáticamente un equilibrador de carga para él.
He eliminado algunos detalles en aras de la brevedad.
La información del catálogo de servicio se almacena en otro lugar. No difieren de un
ambiente a otro, como se puede ver enEjemplo 6-2.
Ejemplo 6-2. Un ejemplo de definición de entorno
Catálogo de servicios:
puppet_manifest: catalog.pp
conectividad:
- Protocolo: TCP
[puertos: 8080, 8081 ]
permitido: [ MUNDO ]
Este era el nombre del archivo de marionetas de gestión pasamos a utilizar la
marioneta en solitario en esta situación, pero en teoría podría haber apoyado los
sistemas alternativos de configuración.
130| Capítulo 6: Despliegue
Obviamente, una gran parte del comportamiento que aquí se basó convención. Por
ejemplo, decidimos normalizar los puertos que utilizan los servicios dondequiera que
corrían, y equilibradores de carga de forma automática ured CONFIG- si un servicio
tenía más de una instancia (algo que ELB de AWS hacen bastante fácil).
La construcción de un sistema como este requiere una cantidad significativa de
trabajo. El esfuerzo es a menudo delante carga-, pero puede ser fundamental para
gestionar la complejidad de la instalación que tiene. Espero que en el futuro no tendrá
que hacerlo usted mismo. Terraform es una nueva herramienta de Hashicorp, que
trabaja en este espacio. Me había generalmente asusto de mencionar una nueva
herramienta de este tipo en un libro que es más acerca de las ideas que la tecnología,
pero es ing Si se intenta crear una herramienta de código abierto a lo largo de estas
líneas. Es pronto todavía, pero ya sus capacidades parece muy interesante. Con la
capacidad de dirigirse a los despliegues en un nú- mero de diferentes plataformas, en
el futuro podría ser sólo la herramienta para el trabajo.
Resumen
Hemos cubierto mucho terreno aquí, así que una recapitulación está en orden. En
primer lugar, se centran en el mantenimiento de la capacidad de liberar un servicio
independiente de los otros, y asegurarse de que cualquier tecnología que admite esta
opción. Yo prefiero mucho tener un solo toria reposi- por microService, pero todavía
estoy más firme que necesita una acumulación de CI por microService si desea
implementar por separado.
A continuación, si es posible, mover a un solo servicio por host / contenedor. Mira
tecnolo- gías alternativas como LXC o acoplable a hacer la gestión de las partes
móviles más barato y más fácil, pero entender que cualquier tecnología que se
adopta, una cultura de la automatización es clave para manejar todo. Automatizar
todo, y si la tecnología que tiene no lo permite, obtener una nueva tecnología! Ser
capaz de utilizar una plataforma como AWS le dará enormes beneficios en lo que
respecta a la automatización.
Asegúrese de entender el impacto de sus opciones de implementación tienen en los
desarrolladores, y asegúrese de que sienten el amor también. La creación de
herramientas que le permiten auto-servicio-implementar un servicio determinado en
un número de diferentes entornos es muy importante, y ayudará a los desarrolladores,
probadores, y personal de operaciones por igual.
Por último, si quieres profundizar más en este tema, yo bien recomiendo que lea Jez
Humble y entrega continua de David Farley (Addison-Wesley), que entra en muchos
más detalles sobre temas como diseño de la tubería y la gestión artefacto.
En el siguiente capítulo, vamos a ir más profundo en un tema hemos tocado
brevemente aquí. Es decir, ¿cómo podemos probar nuestros microservicios para
asegurarse de que funcionan realmente?
Una interfaz de despliegue |
131
CAPÍTULO
7
Prueba
s
El mundo de las pruebas automatizadas ha avanzado significativamente desde que
empecé a escribir código, y cada mes parece que hay una nueva herramienta o
técnica para que sea aún mejor. Pero sigue habiendo problemas como la forma de
probar con eficacia y eficiencia de nuestro funcional- idad cuando se extiende por un
sistema distribuido. En este capítulo se rompe los problemas asocia- dos con los
sistemas de pruebas de grano más fino y presenta algunas soluciones para ayudar a
asegurarse de que puede liberar su nueva funcionalidad con confianza.
Pruebas cubre mucho terreno. Incluso cuando estamos hablando de pruebas
automatizadas, hay un gran número de considerar. Con microservicios, hemos
añadido otro nivel de complejidad. La comprensión de lo que los diferentes tipos de
pruebas que pueden correr es impor- tante para ayudar a equilibrar las fuerzas
opuestas a veces de conseguir nuestro software en producción lo más rápido posible
frente asegurándose de nuestro software es de suficiente calidad.
Tipos de pruebas
Como consultor, me gusta sacar el cuadrante extraño como una forma de categorizar
el mundo, y yo estaba empezando a preocuparse por este libro no tendría uno. Por
suerte, Brian Marick subió con un sistema de categorización fantástica para las
pruebas que encaja a la perfección.Figura 7-1 muestra una variación del cuadrante de
Marick de Lisa Crispin y el libro de Janet Gregory Agile Testing (Addison-Wesley)
que ayuda a clasificar los diferentes tipos de pruebas.
131
Figura 7-1. cuadrante prueba de Brian Marick. Crispin, Lisa; Gregory, Janet,
pruebas ágil: Una guía práctica para los probadores y equipos ágiles, 1ª edición, ©
2009. Adaptado por per- miso de Pearson Education, Inc., Upper Saddle River,
Nueva Jersey.
En la parte inferior, tenemos pruebas de que son la tecnología orientada, es decir,
pruebas que ayudan a los desarrolladores en la creación del sistema en el primer
lugar. Las pruebas de rendimiento y las pequeñas pruebas de unidad de ámbito entran
en esta categoría, todo normalmente automatizado. Esto se compara con la mitad
superior del cuadrante, donde las pruebas ayudan a las partes interesadas no técnicos
entienden cómo funciona el sistema. Estos podrían ser de gran restringidos, pruebas
de extremo a extremo, como se muestra en la plaza Prueba de Aceptación parte
superior izquierda, o pruebas manuales como tipificado por las pruebas de usuario
hecho en contra de un sistema de UAT, como se muestra en la plaza pruebas
exploratorias.
Cada tipo de prueba que se muestra en este cuadrante tiene un lugar. Exactamente
qué cantidad de cada prueba que desea hacer dependerá de la naturaleza de su
sistema, pero el punto clave de soporte inferior es que tiene múltiples opciones en
cuanto a la forma de probar su sistema. La tendencia reciente ha estado lejos de
cualquier prueba manual a gran escala, a favor de automatizar tanto como sea
posible, y desde luego de acuerdo con este enfoque. Si lleva a cabo actualmente una
gran cantidad de pruebas manuales, sugeriría a abordar que antes de proceder
demasiado lejos por el camino de microservicios, ya que no se obtiene muchos de sus
beneficios si no puede validar su software de forma rápida y eficiente.
A los efectos de este capítulo, vamos a hacer caso omiso de las pruebas manuales.
Aunque este tipo de pruebas puede ser muy útil y sin duda tiene un papel que
desempeñar, las diferencias con la prueba de una arquitectura microService su
mayoría se manifiestan en el contexto de diversos tipos de automatización pone a
prueba ted, así que es donde nos vamos a centrar nuestro tiempo.
Pero cuando se trata de pruebas automatizadas, ¿cuántos de cada prueba es lo que
queremos? Otro modelo vendrá en muy práctico para ayudar a responder a esta
pregunta, y entender cuáles podrían ser las diferentes ventajas y desventajas.
132| Capítulo 7: Prueba
Alcance de la prueba
En su libro El tener éxito con Agile (Addison-Wesley), Mike Cohn esboza un
modelo llamado la Pirámide de prueba para ayudar a explicar qué tipos de pruebas
automatizadas que necesita. los
Alcance de prueba |
133
pirámide nos ayuda a pensar acerca de los alcances de las pruebas deben cubrir, sino
también las proporciones de los diferentes tipos de pruebas que debemos aspirar. El
modelo original de Cohn divide automatización ted pone a prueba a la Unidad,
Servicio, y la interfaz de usuario, que se puede ver enFigura 7-2.
Figura 7-2. Pirámide de prueba de Mike Cohn. Cohn, Mike, teniendo éxito con ágil:
desarrollo de software utilizando Scrum, 1ª Edición, © 2010. Adaptado con permiso
de Pearson Edu- cación, Inc., Upper Saddle River, Nueva Jersey.
El problema con este modelo es que todos estos términos significan cosas diferentes
para diferentes personas. “Servicio” es especialmente sobrecargado, y hay muchas
definiciones de una prueba de unidad que hay. Es una prueba de una prueba de
unidad si sólo prueba de una línea de código? Yo diría que sí. ¿Sigue siendo una
prueba de unidad si el test múltiples funciones o clases? Yo diría que no, pero
muchos no estaría de acuerdo! Tiendo a seguir con la unidad y nombres de servicios
a pesar de su ambigüedad, pero prefiero llamar a las pruebas de interfaz de usuario de
extremo a extremo pruebas, que vamos a hacer a partir de ahora.
Dada la confusión, vale la pena mirar a nosotros lo que significan estas diferentes
capas.
Veamos un ejemplo práctico. EnFigura 7-3, Tenemos nuestra aplicación de servicio
de ayuda y nuestro principal sitio web, ambos de los cuales están interactuando con
nuestro servicio al cliente para recuperar, revisar y editar los datos del cliente.
Nuestro servicio al cliente a su vez está hablando con nuestro banco loy- puntos Alty,
donde nuestros clientes acumulan puntos por la compra de Justin Bieber CDs.
Probablemente. Esto es obviamente una astilla de nuestro sistema global tienda de
música, pero es una buena tajada suficiente para nosotros para sumergirse en una
serie de escenarios diferentes es posible que desee probar.
134| Capítulo 7: Prueba
Figura 7-3. Parte de nuestra tienda de música que se está probando
Alcance de prueba |
135
Las pruebas unitarias
Estas son pruebas que típicamente ensayan una función o método sola llamada. Las
pruebas generados como un efecto secundario de guiado por pruebas de diseño
(TDD) caerán dentro de esta categoría, como lo hacen los tipos de pruebas generados
por técnicas tales como la prueba basada en la propiedad. No estamos lanzamiento de
servicios de aquí, y está limitando el uso de archivos externos o conexiones de red.
En general, usted quiere un gran número de este tipo de pruebas. Si se hace bien, son
muy, muy rápido, y en el hardware moderno que se puede esperar para ejecutar
muchos miles de estos en menos de un minuto.
Estas son pruebas que nos ayudan a los desarrolladores y así sería la tecnología
orientada, no orientada hacia el negocio, en la terminología de Marick. Son también
donde esperamos captar la mayor parte de nuestros errores. Así, en nuestro ejemplo,
cuando pensamos en el servicio al cliente, las pruebas unitarias cubrirían pequeñas
partes del código de forma aislada, como se muestra enFigura 7-4.
Figura 7-4. Ámbito de aplicación de las pruebas de unidad en nuestro sistema de
ejemplo
El principal objetivo de estas pruebas es para darnos una respuesta muy rápida acerca
de si nuestro funcio- nalidad es buena. Las pruebas pueden ser importantes para
apoyar a la refactorización de código, lo que nos permite reestructurar nuestro código
a medida que avanzamos, sabiendo que nuestras pruebas pequeñas de ámbito nos
cogerán si hacemos un error.
pruebas de servicio
pruebas de servicio están diseñados para pasar por alto los servicios de interfaz de
usuario y una prueba directa. En una aplicación monolítica, que sólo podría estar
probando una colección de clases que proporcionan un servicio a la interfaz de
usuario. Para un sistema que comprende una serie de servicios, una prueba de
servicio pondría a prueba las capacidades de un servicio individual.
La razón por la que queremos probar un único servicio por sí mismo es mejorar el
aislamiento de la prueba para encontrar y corregir problemas con mayor rapidez. Para
lograr este aislamiento, tenemos que apagar todos los colaboradores externos de
modo que sólo el servicio en sí es en su alcance, comoFigura 7-5 muestra.
136| Capítulo 7: Prueba
Figura 7-5. Ámbito de aplicación de pruebas de servicio en nuestro sistema de ejemplo
Algunas de estas pruebas podrían ser tan rápido como pequeñas pruebas, pero si
usted decide poner a prueba contra una base de datos real, o ir a través de redes de
colaboradores aguas abajo tropezados, los tiempos de prueba puede aumentar.
También cubren más amplio que una simple prueba de unidad, de manera que
cuando no puede ser más difícil de detectar lo que está roto que con una prueba de
unidad. Sin embargo, tienen mucho menos partes móviles y por lo tanto son menos
frágiles que las pruebas más grande con ámbito.
Las pruebas de extremo a extremo
pruebas de extremo a extremo son las pruebas realizadas en contra de todo el sistema.
A menudo se conduce una interfaz gráfica de usuario a través de un navegador, pero
podrían ser fácilmente imitando a otros tipos de interacción con el usuario, al igual
que la posibilidad de subir un archivo.
Estas pruebas abarcan una gran cantidad de código de producción, como vemos en
Figura 7-6 . Así que cuando pasan, que se siente bien: usted tiene un alto grado de
confianza de que el código está probando trabajará en la producción. Pero este
aumento de alcance viene con desventajas, y como veremos en breve, que puede ser
muy difícil de hacer bien en un contexto microservicios.
Figura 7-6. Ámbito de aplicación de pruebas de extremo a extremo en nuestro sistema
de ejemplo
Las compensaciones
Cuando estás leyendo la pirámide, la clave para llevar es que a medida que suben la
Alcance de prueba |
137
pirámide, el alcance aumenta de prueba, al igual que nuestra confianza en que la
funcionalidad está probando obras. Por otro lado, el tiempo de ciclo de
retroalimentación aumenta a medida que las pruebas tardan más en ejecutarse, y
cuando falla una prueba que puede ser más difícil de determinar qué funcionalidad
138| Capítulo 7: Prueba
ha roto. Al bajar la pirámide, en general, las pruebas se hacen mucho más rápido, por
lo que consiguen ciclos de retroalimentación mucho más rápido. Nos encontramos
con funcionalidad rota más rápido, nuestra integración ous continua- construye son
más rápidos, y es menos probable de pasar a una nueva tarea antes de descubrir algo
que han roto. Cuando esas pruebas más pequeñas de ámbito fallan, también tienden a
saber lo que se rompió, a menudo exactamente qué línea de código. En el otro lado,
no obtenemos mucha confianza de que nuestro sistema en su conjunto funciona si
sólo hemos probado una línea de código!
Cuando los ensayos más amplios de ámbito como nuestro servicio o pruebas de
extremo a extremo fallan, vamos a tratar de escribir una prueba unitaria rápido para
alcanzar ese problema en el futuro. De esta manera, estamos constantemente tratando
de mejorar nuestros ciclos de retroalimentación.
Prácticamente cada equipo que he trabajado ha utilizado diferentes nombres que los
que Cohn utiliza en la pirámide. Lo que usted le llama, el punto clave es que tendrá
que pruebas de alcance diferente para diferentes propósitos.
¿Cuántos?
Así que si todas estas pruebas tienen ventajas y desventajas, ¿cuántos de cada tipo lo
que quiere? Una buena regla general es que es probable que desee un orden de
magnitud más pruebas a medida que desciende la pirámide, pero lo importante es
saber que tienen diferentes tipos de pruebas automatizadas y comprensión si su saldo
actual le da un problema!
Trabajé en un sistema monolítico, por ejemplo, donde tuvimos 4.000 pruebas de
unidad, 1.000 pruebas de servicio, y 60 pruebas de extremo a extremo. Hemos
decidido que desde el punto de vista de retroalimentación que teníamos demasiados
servicio y pruebas de extremo a extremo (el último de los cuales eran los peores
delincuentes en impactando bucles de retroalimentación), por lo que hemos trabajado
duro para sustituir la prueba con la cubierta bajo más pequeña pruebas -scoped.
Un anti-patrón común es lo que se refiere a menudo como un cono de nieve de
prueba, o de pirámide invertida. Aquí, hay poco que no hay pruebas pequeñas de
ámbito, con toda la cobertura de las pruebas a gran con ámbito. Estos proyectos
suelen tener pruebas de funcionamiento sumamente lento, y muy largo Feed- volver
ciclos. Si estas pruebas se ejecutan como parte de la integración continua, no
obtendrá muchas construcciones, y la naturaleza de los tiempos de construcción
significa que la construcción puede permanecer roto por un largo período cuando
algo se rompe.
La implementación de pruebas de servicio
La implementación de pruebas de unidad es un asunto bastante simple en el gran
esquema de las cosas, y hay un montón de documentación por ahí explicando cómo
escribirlas. Las pruebas de servicio y de extremo a extremo son los que son más
Alcance de prueba |
139
interesantes.
Nuestras pruebas de servicio quieren probar una rebanada de funcionalidad a través
de todo el servicio, pero a aislarnos de otros servicios que tenemos que encontrar la
manera de apagar todos nuestros colaboradores. Por lo tanto, si queríamos escribir
una prueba de este tipo para el servicio al cliente de
140| Capítulo 7: Prueba
Figura 7-3, Queremos implementar una instancia del servicio al cliente, y como se
explicó anteriormente nos gustaría apagar cualquier servicio de aguas abajo.
Una de las primeras cosas que nuestra acumulación continua integración hará es
crear un hecho arti- binario para nuestro servicio, por lo desplegando es bastante
sencillo. Pero ¿cómo lo manejamos falsificar los colaboradores aguas abajo?
Nuestra serie de pruebas de servicio necesita para poner en marcha los servicios de
derivación para cualquier colaboradores aguas abajo (o garantizar que se ejecuta), y
configurar el servicio que se está probando para conectarse a los servicios de código
auxiliar. entonces tenemos que configurar los talones para enviar respuestas de nuevo
a imitar los servicios del mundo real. Por ejemplo, podríamos configurar el código
auxiliar para el banco puntos de fidelidad para volver conocidos saldos puntos para
ciertos clientes.
Burlándose o Stubbing
Cuando hablo de stubbing colaboradores aguas abajo, quiero decir que nosotros
creamos un servicio de código auxiliar que responde con respuestas enlatadas a las
solicitudes conocidos del servicio, utilizando la prueba. Por ejemplo, podría decirle a
mi banco de puntos de código auxiliar que cuando se le preguntó por el Ance equilide cliente 123, debe devolver 15.000. La prueba no le importa si el talón se llama 0,
1, o 100 veces. Una variante de esto es utilizar una maqueta en lugar de un trozo.
Cuando se utiliza una maqueta, en realidad van más allá y aseguro se realizó la
llamada. Si no se realiza la llamada esperada, la prueba falla. La implementación de
este enfoque requiere más inteligencia en los colaboradores falsos que creamos, y si
se abusa puede provocar que las pruebas se vuelvan frágiles. Como se ha señalado,
sin embargo, un talón no le importa si se llama 0, 1, o muchas veces.
A veces, sin embargo, se burla puede ser muy útil para asegurar que los efectos
secundarios esperados ocurren. Por ejemplo, puede ser que desee comprobar que
cuando se crea un cliente, un equilibrio nuevos puntos está configurado para ese
cliente. El equilibrio entre tropezar y llamadas ING maqueta es delicado, y es tan
plagado de pruebas de servicio como en las pruebas unitarias. En ge- neral, sin
embargo, yo uso mucho más que los trozos se burla de pruebas de servicio. Para una
discusión más a fondo de esta disyuntiva, echar un vistazo a crecer de software
orientado a objetos, guiada por pruebas, por Steve Freeman y Nat Pryce (AddisonWesley).
En general, rara vez usar burla para este tipo de pruebas. Sin embargo, tener una
herramienta que puede hacer ambas cosas es útil.
Aunque siento que los trozos y se burla de hecho son bastante bien diferenciada, sé
que la distinción puede ser confuso para algunos, especialmente cuando algunas
personas tiran en otros términos como falsificaciones, espías y maniquíes. Martin
Fowler llama a todas estas cosas, incluyendo talones y se burla,dobles de prueba.
Implementar el servicio de
exámenes | 137
Un servicio más inteligente del trozo
Normalmente, para los servicios del trozo Los he rodé. He usado todo de Apache o
Nginx a los contenedores Jetty incrustados o servidores web de Python, incluso la
línea de comandos lanzados utilizados para poner en marcha los servidores de código
auxiliar para tales casos de prueba. Probablemente he reproducido el mismo tiempo
de trabajo una y otra vez en la creación de estos talones. Mi colega ThoughtWorks
Brandon Bryars ha salvado potencialmente muchos de nosotros un trozo de trabajo
con su talón / servidor maqueta llamadaSaltimbanqui.
Se puede pensar en charlatán como un pequeño dispositivo de software que se puede
programar a través de HTTP. El hecho de que pasa a ser escrito en NodeJS es
completamente opaca a cualquier servicio de llamadas. Cuando se pone en marcha,
lo envía comandos le dice qué puerto al código auxiliar, qué protocolo para manejar
(actualmente TCP, HTTP, HTTPS y son compatibles, con más planificado), y qué
respuestas se debe enviar cuando se envían las solicitudes. También SUP- puertos de
ajuste expectativas si desea utilizarlo como una maqueta. Puede añadir o eliminar
estos criterios de valoración del trozo a voluntad, por lo que es posible que una sola
instancia charlatán de código auxiliar más de una dependencia de aguas abajo.
Entonces, si queremos ejecutar nuestras pruebas de servicio por sólo nuestro servicio
al cliente se puede poner en marcha el servicio al cliente, y una instancia de charlatán
que actúa como nuestro banco puntos de fidelidad. Y si pasan estas pruebas, puedo
desplegar la recta servicio al cliente! O ¿verdad? ¿Qué pasa con los servicios que
requieren el servicio al cliente servicio de asistencia y la tienda web? ¿Sabemos si
hemos hecho un cambio que puede romper? Por supuesto, nos hemos olvidado de las
pruebas importantes en la parte superior de la pirámide: las pruebas de extremo a
extremo.
Esos Tricky pruebas de extremo a extremo
En un sistema microService, las capacidades que se exponen a través de nuestras
interfaces de usuario se emitirá según una serie de servicios. El punto de las pruebas
de extremo a extremo como se indica en la pirámide de Mike Cohn es conducir
funcionalidad a través de estas interfaces de usuario contra every- cosa debajo para
darnos una visión general de una gran cantidad de nuestro sistema.
Así, para implementar una prueba de extremo a extremo que necesitamos para
desplegar múltiples servicios juntos, a continuación, ejecutar una prueba contra todos
ellos. Obviamente, esta prueba tiene mucho más alcance, ing result- en más
confianza de que nuestro sistema funciona! Por otra parte, estas pruebas se LIA- ble
que sea más lento y que sea más difícil de diagnosticar la insuficiencia. Vamos a
profundizar en ellos un poco más con el ejemplo anterior para ver cómo estas
pruebas pueden encajar.
Imaginemos que queremos empujar a cabo una nueva versión del servicio al cliente.
138| Capítulo 7: Prueba
Queremos desplegar nuestros cambios en la producción tan pronto como sea posible,
pero preocupa que hayamos introducido un cambio que podría romper o bien el
servicio de asistencia o la tienda web. No hay problema, vamos a desplegar todos
nuestros servicios juntos, y hacer algunas pruebas en contra de la asistencia y site de
la tienda para ver si hemos introducido un error. Ahora, un enfoque ingenuo sería
sólo tiene que añadir estas pruebas en el extremo de nuestra línea de servicio al
cliente, al igual que enFigura 7-7.
Implementar el servicio de
exámenes | 139
Figura 7-7. La adición de nuestra etapa de pruebas de extremo a extremo: el enfoque
correcto?
Hasta aquí todo bien. Pero la primera pregunta que tenemos que hacernos es qué
versión de los otros servicios deberíamos usar? ¿Hay que manejamos nuestras
pruebas en contra de las versiones de escritorio y ayuda- site de la tienda que están en
producción? Es una suposición razonable, pero lo que si hay una nueva versión de
cualquiera de los servicio de asistencia o site de la tienda en cola para ir a vivir; ¿Qué
debemos hacer entonces?
Otro problema: si tenemos un conjunto de pruebas de servicio al cliente que
despliegan una gran cantidad de servicios y ejecutar pruebas contra ellos, ¿qué pasa
con las pruebas de extremo a extremo que los otros servicios se ejecutan? Si ellos
están probando lo mismo, nos podemos encontrar que cubre porciones de la misma
planta, y puede duplicar una gran cantidad de esfuerzo para desplegar todos aquellos
servicios en el primer lugar.
Nosotros puede hacer frente a estos dos problemas elegantemente por tener ventilador
de múltiples tuberías a una sola etapa de prueba, de extremo a extremo. En este caso,
cada vez que se activa una nueva versión de uno de nuestros servicios, en que
manejamos nuestras pruebas de extremo a extremo, un ejemplo de lo que podemos
ver enFigura 7-8. Algunas herramientas de CI con un mejor soporte de tuberías de
construcción permitirán a los modelos de abanico de entrada de este tipo fuera de la
caja.
Figura 7-8. Una forma estándar para manejar pruebas de extremo a extremo a través
de los servicios
Así cualquier momento cualquiera de nuestros cambios de servicios, que ejecutan las
Esos Tricky pruebas de extremo a
extremo | 139
pruebas locales a ese servicio. Si se superan estas pruebas, provocamos nuestras
pruebas de integración. Grande, ¿eh? Bueno, hay algunos problemas.
140 | Capítulo 7: Prueba
Los inconvenientes de extremo a extremo de
análisis
Hay, por desgracia, muchas desventajas a extremo a extremo de análisis.
Las pruebas de hojaldre y quebradizo
A medida que aumenta el alcance de prueba, también lo hacen el número de partes
móviles. Estas partes móviles pueden introducir fallos de las pruebas que no
muestran que la funcionalidad que se está probando es Bro-ken, pero que se ha
producido algún otro problema. A modo de ejemplo, si tenemos una prueba para
comprobar que podemos realizar un pedido de un solo CD, pero estamos corriendo
esa prueba en contra de cuatro o cinco servicios, si alguno de ellos es abajo
podríamos obtener un fallo que no tiene nada que ver con la naturaleza de la prueba
en sí. Del mismo modo, un fallo temporal de la red podría causar un error de la
prueba sin decir nada acerca de la funcionalidad que se está probando.
Los más partes móviles, el más frágil nuestras pruebas pueden ser, y al menos
determinista que son. Si usted tiene pruebas de que a veces fallan, pero cada uno sólo
de ellos re-corre, ya que pueden pasar de nuevo más tarde, entonces usted tiene
pruebas de hojaldre. No son sólo pruebas que cubren una gran cantidad de diferentes
procesos que son el culpable aquí. Los exámenes que cubren siendo funcionalidad
cio CISED en varios subprocesos son a menudo problemático, donde una falla podría
significar una condición de carrera, un tiempo de espera, o que la funcionalidad es
realmente roto. pruebas escamosas son el enemigo. Al no conseguirlo, no nos dicen
mucho. Nos re-ejecutar nuestro CI se basa en la esperanza de que van a pasar de
nuevo más tarde, sólo para ver registros de entrada se acumulan, y de repente nos
encontramos a nosotros mismos con una carga de funcionalidad roto.
Cuando detectamos pruebas de hojaldre, es esencial que hacemos todo lo posible
para eliminarlos. De otro modo, empezamos a perder la fe en un conjunto de pruebas
que “siempre falla de esa manera.” Un conjunto de pruebas con las pruebas de
hojaldre puede convertirse en una víctima de lo que Diane Vaughan llama a la
normalización de la desviación: la idea de que con el tiempo podemos llegar a ser tan
acostumbrados a las cosas a equivocarse que se empieza a aceptarlas como normal y
no un problema.1 Esta tendencia muy humana significa que tenemos que encontrar y
eliminar estas pruebas tan pronto como sea posible antes de empezar a asumir que las
pruebas en su defecto están bien.
En “Erradicación del no determinismo en las pruebas”, Martin Fowler defiende el
criterio de que si tiene pruebas de hojaldre, debe rastrearlos y si no se puede arreglar
de inmediato ellos, sacarlos de la suite para que pueda tratarlos. Ver si se puede
volver a escribir para evitar código de prueba que se ejecuta en varios subprocesos.
Ver si se puede hacer el ambiente más estable subyacente. Mejor aún, ver si se puede
sustituir la prueba escamosa con una prueba de menor con ámbito que es menos
Esos Tricky pruebas de extremo a
extremo | 141
propensos a mostrar problemas. En algunos casos, Chang-ing el software bajo prueba
para que sea más fácil para poner a prueba también puede ser el camino correcto a
seguir.
1 Diane Vaughan, el Challenger Lanzamiento Decisión: Tecnología arriesgado, Cultura, y la desviación de la
NASA (Chicago: University of Chicago Press, 1996).
140 | Capítulo 7: Prueba
Quién escribe estas pruebas?
Con las pruebas que se ejecutan como parte de la tubería para un servicio
determinado, el punto de arranque ing sensato es que el equipo que es dueño de ese
servicio debe escribir esas pruebas (hablaremos más sobre el servicio en la propiedad
Capítulo 10). Pero si tenemos en cuenta que podríamos tener varios equipos
implicados, y el paso de extremo a extremo pruebas es ahora compartido con eficacia
entre los equipos, que escribe y se ocupa de estas pruebas?
He visto una serie de anti-patrones causadas aquí. Estas pruebas se convierten en
un libre acceso para todos, con todos los equipos otorgados a añadir pruebas sin
ninguna comprensión de la salud de toda la suite. A menudo, esto puede dar
lugar a una explosión de casos de prueba, a veces RESULTEN en el cono de
nieve prueba de que hemos hablado antes. He visto situaciones en las que, debido
a que no había verdadera propiedad evidente de estas pruebas, sus resultados son
ignorados. Cuando se rompen, todo el mundo asume que es un problema de otra
persona, por lo que no importa si las pruebas están pasando.
A veces las organizaciones reaccionan por tener un equipo dedicado escribir estas
pruebas. Esto puede ser desastroso. El equipo de desarrollo del software se vuelve
cada vez más distante de las pruebas de su código. aumentan los tiempos de ciclo,
como los propietarios de servicios terminan esperando el equipo de pruebas para
escribir pruebas de extremo a extremo para la funcionalidad que acaba de escribir.
Porque otro equipo escribe estas pruebas, el equipo redactor del servicio es menos
involucrados con, y por lo tanto menos probabilidades de saber, cómo ejecutar y
corregir estas pruebas. A pesar de que es, por desgracia sigue siendo un modelo de
organización común, veo un daño significativo a cabo cada vez que un equipo está
distanciado de escribir pruebas para el código que escribió en el primer lugar.
Conseguir este aspecto correcto es realmente difícil. No queremos duplicar esfuerzos,
ni queremos centralizar completo este en la medida en que los equipos de
construcción de servicios están demasiado alejados de las cosas. El mejor balance
que he encontrado es para tratar el conjunto de pruebas de extremo a extremo como
una base de código compartido, pero con la propiedad conjunta. Los equipos son
libres de confirmar a esta suite, pero la propiedad de la salud de la suite tiene que ser
compartida entre los equipos de desarrollo de los servicios mismos. Si desea hacer un
uso extensivo de las pruebas finales a extremo con múltiples equipos Creo que este
enfoque es esencial, y sin embargo he visto hacer muy raramente, y nunca sin la
edición.
¿Cuánto tiempo?
Estas pruebas de extremo a extremo puede tomar un tiempo. Los he visto tardar hasta
un día para correr, si no más, y en un proyecto que trabajé, una suite de regresión
completa llevó seis semanas! Rara vez veo equipos realmente cura sus conjuntos de
pruebas de extremo a extremo para reducir la superposición en la cobertura de la
142 | Capítulo 7: Prueba
prueba, o pasar bastante tiempo en hacerlos rápido.
Esta lentitud, combinado con el hecho de que estos ensayos a menudo puede ser en
forma de escamas, puede ser un problema importante. Un conjunto de pruebas que se
lleva todo el día y, a menudo tiene roturas que se han noth- ing que ver con la
funcionalidad rotos son un desastre. Incluso si su funcionalidad se Bro-ken, que le
podría tomar muchas horas para averiguarlo momento en el que muchos de nosotros
lo haría
Las pruebas de hojaldre y
quebradizo | 141
ya han pasado a otras actividades, y el cambio de contexto en el cambio de nuestro
cerebro de nuevo a solucionar el problema es doloroso.
Nosotros puede mejorar algunos de esto mediante la ejecución de pruebas en el
ejemplo paralelo-para, haciendo uso de herramientas como selenio cuadrícula. Sin
embargo, este enfoque no es un sustituto para comprender realmente lo que necesita
ser probado y eliminar activamente pruebas que ya no son necesarios.
La eliminación de las pruebas es a veces un ejercicio lleno, y sospecho que comparte
gran parte de com- mon con las personas que quieren eliminar ciertas medidas de
seguridad del aeropuerto. No importa qué tan ineficaces podrían ser las medidas de
seguridad, cualquier conversación sobre la eliminación de ellos es a menudo
respondió con reacciones reflejas de no preocuparse por la seguridad de las personas
o el deseo de ganar terroristas. Es difícil tener una conversación equilibrada sobre el
valor de algo añade frente a la carga que conlleva. También puede ser una tarea
difícil de riesgo / recompensa disyuntiva. ¿Usted consigue agradeció si se quita una
prueba? Tal vez. Pero vas a cierta- mente ser culpados si una prueba de que ha
extraído permite un error a través. Cuando se trata de los bancos de pruebas de
ámbito-grande, sin embargo, esto es exactamente lo que tenemos que ser capaces de
hacer. Si la misma característica se cubre en 20 pruebas diferentes, tal vez podemos
deshacernos de la mitad de ellos, como esas 20 pruebas tardan 10 minutos para
correr! Lo que esto requiere una mejor comprensión del riesgo, que algo que los
humanos son famosos malo en. Como resultado, este cura- ción inteligente y gestión
de las pruebas, mayor de ámbito de alta carga pasa muy poca frecuencia. las personas
que deseen hicieron más no es lo mismo que hacer que suceda.
El Gran Pile-up
Los largos ciclos de retroalimentación asociados con pruebas de extremo a extremo
no son sólo un problema cuando se trata de la productividad del desarrollador. Un
banco de pruebas de largo, los saltos de tomar un tiempo para arreglar, lo que reduce
la cantidad de tiempo que las pruebas de extremo a extremo se puede esperar que se
pasa. Si hacemos uso único software que ha pasado por todas nuestras pruebas con
éxito (que debería!), Esto significa menos de nuestros servicios de llegar hasta el
punto de ser despliegue en producción.
Esto puede conducir a un choque en cadena. Mientras rota una etapa de pruebas de
integración se fija, más cambios de los equipos aguas arriba pueden acumularse en.
Aparte del hecho de que esto puede hacer FIX-ing la acumulación más difícil,
significa que el alcance de los cambios que se desplegarán aumenta. Una forma de
resolver este es no dejar que la gente comprobar en si las pruebas de extremo a
extremo están fallando, pero dado mucho tiempo conjunto de pruebas a menudo es
poco práctico. Trate de decir, “Ustedes los 30 desarrolladores: no hay registros de
entrada hasta que nos solucionar este problema de siete horas de duración de
construcción!”
Cuanto mayor sea el alcance de un despliegue y mayor es el riesgo de un
142 | Capítulo 7: Prueba
comunicado, la más probable es que romper algo. Un factor clave para asegurar que
podemos liberar nuestro soft- ware con frecuencia se basa en la idea de que
liberamos pequeños cambios tan pronto como estén listos.
Las pruebas de hojaldre y
quebradizo | 141
el Metaversion
Con la etapa de prueba de extremo a extremo, es fácil empezar a pensar, tanto, sé
todos estos servicios en estas versiones trabajan juntos, así que por qué no se
despliegan todos juntos? Esto se convierte muy rápidamente una conversación a lo
largo de las líneas de, ¿Por qué no usar un número de versión para el sistema entero?
CitarBrandon Bryars“Ahora usted tiene problemas 2.1.0.”
Por versiones juntos los cambios realizados en múltiples servicios, abrazamos con
eficacia la idea de que el cambio y la implementación de varios servicios a la vez es
aceptable. Se convierte en la norma, se convierte en Aceptar. De este modo, cedemos
una de las principales ventajas de micro servicios: la capacidad de desplegar un
servicio por sí mismo, independientemente de otros servicios.
Con demasiada frecuencia, el enfoque de aceptar múltiples servicios que se activa
junto deriva en una situación en Servicios convertirse acoplados. En poco tiempo, los
servicios muy bien separadas se vuelven cada vez se enredaron con los demás, y
nunca se dan cuenta, ya que nunca intenta implementar por sí mismos. Se termina
con una maraña donde hay que organizar el despliegue de servicios múltiples a la
vez, y como hemos comentado previa- mente, este tipo de acoplamiento nos puede
dejar en un lugar peor de lo que sería con un pecado gle, monolítica solicitud.
Esto es malo.
Journeys prueba, No Historias
A pesar de los inconvenientes que acabamos de esbozar, para muchos usuarios de
extremo a extremo pruebas todavía puede ser manejable con uno o dos servicios, y en
estas situaciones todavía hacer un montón de sentido. ¿Pero qué sucede con 3, 4, 10,
20 o servicios? Muy rápidamente estos bancos de pruebas se vuelven enormemente
hinchado, y en el peor de los casos puede producirse una explosión cartesiana-como
en los esce- narios bajo prueba.
Esta situación se agrava si caemos en la trampa de la adición de una nueva prueba de
extremo a extremo para cada pieza de funcionalidad añadimos. Muéstrame un código
base donde todos los nuevos resultados de la historia en una nueva prueba de
extremo a extremo, y yo voy a mostrar un conjunto de pruebas hinchada que tiene
ciclos de retroalimentación pobres y hay grandes coincidencias en la cobertura de la
prueba.
La mejor manera de contrarrestar esto es centrarse en un pequeño número de
desplazamientos básicos para probar todo el sistema. Cualquier funcionalidad no
cubierto en estos viajes de núcleo necesita ser cubierto en las pruebas que analizan
Servicios de aislamiento entre sí. Estos viajes tienen que ser mutuamente acordado, y
de propiedad conjunta. Para nuestra tienda de música, es posible que se centran en
acciones como pedir un CD, de devolver un producto, o tal vez la creación de un
nuevo interacciones con los clientes de alto valor y muy pocos en número.
Al centrarse en un pequeño número (y me refiero pequeña: muy bajas cifras de dos
144 | Capítulo 7: Prueba
dígitos, incluso para sistemas complejos) de pruebas que pueden reducir las
desventajas de las pruebas de integración, pero no podemos evitar todos ellos. ¿Hay
una mejor manera?
Journeys prueba, No Historias |
143
Las pruebas dirigidos por el consumidor al Rescate
¿Cuál es uno de los principales problemas que estamos tratando de hacer frente a
cuando utilizamos las pruebas de integración descritas anteriormente? Estamos
tratando de asegurar que cuando hacemos uso de un nuevo servicio para la
producción, nuestros cambios no se romperán los consumidores. Una forma de hacer
esto sin necesidad de realizar ensayos contra el consumidor real es mediante el uso
de un contrato impulsada por el consumidor (CDC).
Con CDC, estamos definiendo las expectativas de un consumidor de un servicio (o
pro-ductor). Las expectativas de los consumidores son capturados en forma de
código como las pruebas, que luego se ejecutan en el productor. Si se hace bien, estas
CDC se deben ejecutar como parte de la construcción CI del productor, asegurando
que nunca se despliega si se rompe uno de estos contratos. Muy importante desde el
punto de vista de retroalimentación de prueba, estas pruebas deben ejecutarse sólo en
contra de un solo productor de manera aislada, por lo que puede ser más rápido y más
fia- ble que las pruebas de extremo a extremo que podrían reemplazar.
A modo de ejemplo, vamos a revisar nuestro escenario de atención al cliente. El
servicio al cliente tiene dos consumidores distintos: el servicio de asistencia y de la
tela de la tienda. Tanto estos servicios que consumen tienen expectativas de cómo se
comportará el servicio al cliente. En este ejemplo, Cre comió dos series de pruebas:
una para cada consumidor que representa el uso de la tienda web de servicio de
asistencia y de la atención al cliente. Una buena práctica aquí es tener a alguien de
los equipos productores y consumidores colaboran en la creación de las pruebas, así
que quizás la gente de los equipos de tienda web y servicio de asistencia se
emparejan con las personas del equipo de servicio al cliente.
Debido a que estos CDC son las expectativas sobre cómo el servicio al cliente debe
comportarse, que se pueden ejecutar en contra de la atención al cliente por sí mismo
con cualquiera de sus dependencias aguas abajo apagó, como Figura 7-9 muestra.
Desde un punto de vista alcance, se sientan en el mismo nivel en la pirámide de
prueba como pruebas de servicio, aunque con un enfoque muy diferente, como se
muestra enFigura 7-10. Estas pruebas se centran en cómo un consumidor va a utilizar
el servicio, y el gatillo si se rompen es muy diferente en comparación con las pruebas
de servicio. Si uno de estos CDC rompe durante una acumulación de la atención al
cliente, se hace evidente, que se verían afectados los consumidores. En este punto,
puede solucionar el problema o bien iniciar la discusión sobre la introducción de un
cambio importante en la forma que dis- cussed enCapítulo 4. Así que con los CDC,
podemos identificar un cambio de última hora antes de nuestro software de entrar en
producción sin tener que utilizar una prueba de extremo a extremo potencialmente
costosa.
144 | Capítulo 7: Prueba
Figura 7-9. prueba impulsada por el consumidor en el contexto de nuestro ejemplo de
servicio al cliente
La figura 7-10. La integración de pruebas dirigido a los consumidores en la pirámide
de la prueba
Pacto
Pacto es una herramienta de prueba impulsada por el consumidor que fue
desarrollado originalmente en el local en Real-Estate.com.au, pero ahora es de
código abierto, con Beth Skurrie conducir la mayor parte del desa- rrollo.
Originalmente sólo para Ruby, pacto ahora incluye puertos de JVM y .NET.
Pacto funciona de una manera muy interesante, como se resume en Figura 7-11. El
consumidor comienza por definir las expectativas del productor por medio de DSL
Ruby. A continuación, se lanza un servidor simulacro local y ejecutar esta
expectativa en contra de ella para crear el archivo ficación del Pacto speci-. El
archivo pacto es sólo una especificación formal JSON; Naturalmente, también puede
handcode estos, pero el uso de la API de lenguaje es mucho más fácil. Esto también
le da un Run-Ning servidor maqueta que se puede utilizar para realizar pruebas
complementarias aisladas del consumidor.
Las pruebas dirigidos por el consumidor al
Rescate | 145
Figura 7-11. Un resumen de cómo Pacto realiza pruebas impulsada por el consumidor
En el lado del productor, que a continuación, compruebe que esta especificación de
los consumidores se cumple mediante el uso de la especificación JSON Pacto para
conducir llamadas en contra de su API y comprobar las respuestas. Para que esto
funcione, el código base productor necesita acceso al archivo Pacto. Como ya
comentamos en Lier oído:Capítulo 6, Esperamos que tanto el consumidor y el
productor de estar en diferentes formaciones. El uso de una especificación JSON
independiente del idioma es un toque especialmente agradable. Esto significa que
usted puede generar las especificaciones del consumidor, utilizando un cliente Ruby,
sino que lo utiliza para verificar un productor de Java utilizando el puerto JVM del
Pacto.
Como la especificación Pacto JSON es creado por el consumidor, éste debe
convertirse en un artefacto que la acumulación productor tiene acceso. Se podría
almacenar este artefacto en el repositorio de su CI de herramienta / CD, o bien
utilizar el Pacto Broker, lo que le permite almacenar versiones múl- tiples de sus
especificaciones del Pacto. Esto podría permitirle ejecutar sus pruebas de contrato
dirigido a los consumidores contra múltiples versiones diferentes de los
consumidores, si se quería comprobar con respecto a, por ejemplo, la versión del
consumidor en la producción y la versión del consumidor que fue recientemente
construido.
Confusamente, hay un proyecto de código abierto llamado ThoughtWorks pacto, Que
es también una herramienta de rubíes usado para la prueba impulsada por el
consumidor. Tiene la capacidad de grabar las interacciones entre el cliente y el
servidor para generar las expectativas. Esto hace que la redacción de contratos
consumidor-conducidos por los servicios existentes sin gran dificultad. Con Pacto,
una vez que generan estas expectativas son más o menos estática, mientras que con el
Pacto de regenerar las expectativas en el consumidor con cada generación. El hecho
de que se puede definir expectativas para las capacidades de los productores ni
siquiera puede tener sin embargo también mejor encaja en un flujo de trabajo en el
146 | Capítulo 7: Prueba
que el servicio de la producción todavía se está (o aún no se ha) desarrollado.
Las pruebas dirigidos por el consumidor al
Rescate | 145
Es Acerca de las conversaciones
En ágiles, las historias se refieren a menudo como un marcador de posición para una
conversación. CDC son sólo de esa manera. Se convierten en la codificación de un
conjunto de discusiones acerca de lo que es un vicio API ser- debe ser similar, y
cuando se rompen, se convierten en un punto de activación a tener conversaciones
acerca de la forma en que la API debe evolucionar.
Es importante entender que CDC requieren una buena comunicación y confianza
entre el servicio de consumo y producción. Si ambas partes están en el mismo equipo
(o la misma persona!), Entonces esto no debería ser difícil. Sin embargo, si usted está
consumiendo un ser- vicio provisto de un tercero, puede que no tenga la frecuencia
de comunicación, o de confianza, para hacer el trabajo CDC. En estas situaciones, es
posible que tenga que conformarse con LIMITA- TED pruebas de integración más
amplio de ámbito de la vuelta de la componente no es de confianza. Alternativamente, si va a crear una API para miles de consumidores potenciales, como con
un API de servicios web a disposición del público, puede que tenga que jugar el
papel del consumidor a sí mismo (o tal vez trabajar con un subconjunto de los
consumidores) en la definición estas pruebas. Rompiendo un gran número de
consumidores externos es una muy mala idea, por lo que en todo caso la importancia
de los CDC se incrementa!
Así que hay que usar pruebas de extremo a
extremo?
Como se describe en detalle en el capítulo anterior, pruebas de extremo a extremo
tienen un gran número de desventajas que crecen de manera significativa a medida
que añada más piezas móviles que se está probando. De hablar con personas que han
estado aplicando a escala microservicios desde hace un tiempo, he aprendido que la
mayoría de ellos con el tiempo eliminar por completo la necesidad de pruebas de
extremo a extremo en favor de herramientas como CDC y un mejor seguimiento.
Pero no nece- sariamente arrojan las pruebas de distancia. Ellos terminan usando
muchas de esas pruebas viaje de extremo a extremo para controlar el sistema de
producción mediante una técnica denominada monitoreo semántica, del que
hablaremos más enCapítulo 8.
Tú puede ver la ejecución de pruebas de extremo a extremo antes de la
implementación de producción como las ruedas de entrenamiento. Mientras que
usted está aprendiendo cómo funcionan las CDC, y mejorar su control de la
producción y las técnicas de implementación, estas pruebas de extremo a extremo
pueden formar una red de seguridad útil, en el que está operando fuera de tiempo de
ciclo para la disminución del riesgo. Pero a medida que mejora esas otras áreas, se
puede empezar a reducir su dependencia de las pruebas de extremo a extremo hasta
el punto en que ya no son necesarios.
Del mismo modo, es posible trabajar en un ambiente donde el apetito de aprender en
148 | Capítulo 7: Prueba
la producción es baja, y la gente prefiere trabajar tan duro como sea posible para
eliminar cualquier defecto antes de la producción, incluso si eso significa que el
software tarda más en enviar. Siempre y cuando se entienda que no se puede estar
seguro de que se han eliminado todas las fuentes de defectos, y que todavía se
necesita tener un control eficaz y remediación en su lugar en la producción, esto
puede ser una decisión sensata.
Así que hay que usar pruebas de extremo a
extremo? | 147
Obviamente, usted tendrá una mejor comprensión del perfil de riesgo de su propia
organización que yo, pero yo desafío a pensar largo y tendido sobre la cantidad de
pruebas de extremo a extremo que realmente necesita hacer.
Después de las pruebas de Producción
La mayoría de las pruebas se realizan antes de que el sistema está en producción.
Con nuestras pruebas, estamos defin- ing una serie de modelos con los que
esperamos probar si nuestro sistema funciona y se comporta como nos gustaría, tanto
funcional como nonfunctionally. Pero si nuestros modelos no son perfectos, entonces
vamos a encontrar problemas cuando se utilizan nuestros sistemas de rabia. Insectos
caen en la producción, los nuevos modos de fallo se descubren, y nuestros usuarios
utilizan el sistema de una manera que nunca podría esperar.
Una reacción a esto es a menudo para definir más y más pruebas, y perfeccionar
nuestros modelos, para coger más problemas en forma temprana y reducir el número
de problemas que nos encontramos con nuestro sistema de producción en marcha.
Sin embargo, en cierto punto, tenemos que aceptar que llegamos a rendimientos
decrecientes con este enfoque. Con la prueba antes del despliegue, no podemos
reducir la probabilidad de fallo a cero.
La separación de despliegue desde Release
Una forma en que podemos coger más problemas antes de que ocurran es extender en
que manejamos nuestras pruebas más allá de las medidas tradicionales antes del
despliegue. En cambio, si podemos implementar nuestro software, y probarlo in situ
antes de dirigir las cargas de producción en contra de ella, podemos detectar
problemas específicos de un entorno determinado. Un ejemplo común de esto es el
conjunto de pruebas de humo, una colección de pruebas diseñadas para ejecutarse
contra el software recién implementado para confirmar que el despliegue trabajó.
Estas pruebas ayudan a recoger todas las cuestiones ambientales locales. Si está
utilizando un solo comando de línea de comandos para desplegar cualquier
microService dada (y debe), este comando se debe ejecutar las pruebas de humo de
forma automática.
Otro ejemplo de esto es lo que se llama el despliegue azul / verde. Con el azul /
verde, tenemos dos copias de nuestro software implementado en un momento, pero
sólo una versión de la misma está recibiendo peticiones reales.
Vamos considerar un ejemplo sencillo, visto en Figura 7-12. En la producción,
tenemos v123 de la atención al cliente directa. Queremos desplegar una nueva
versión, v456. Hacemos uso de este lado v123, pero no dirigir cualquier tráfico a
la misma. En lugar de ello, llevamos a cabo algunas pruebas in situ con la
versión recién desplegada. Una vez que las pruebas han trabajado, dirigimos la
carga de producción a la nueva versión v456 del servicio al cliente. Es común
para mantener la versión antigua de alrededor de un corto período de tiempo, lo
148 | Capítulo 7: Prueba
que permite un repliegue rápido si detecta algún error.
Así que hay que usar pruebas de extremo a
extremo? | 147
La figura 7-12. El uso de los despliegues / verde azul para separar el despliegue de la
liberación
La implementación de despliegue azul / verde requiere un par de cosas. En primer
lugar, tiene que ser capaz de dirigir el tráfico a la producción de los diferentes
huéspedes (o colecciones de hosts). Se podría hacer esto cambiando las entradas de
DNS, o actualizar la configuración de equilibrio de carga. También es necesario ser
capaz de provisión de suficientes hosts para tener las dos versiones de la
microService funcionando a la vez. Si está utilizando un proveedor de la nube
elástica, esto podría ser la sala straightfor-. El uso de los despliegues / verde azul le
permite reducir el riesgo de despliegue, así como le da la oportunidad de volver Si
surge algún problema. Si obtiene buenos en esto, todo el proceso puede ser
completamente automatizado, ya sea con el roll-completo hacia fuera o revertir
ocurriendo sin ninguna intervención humana.
Dejando de lado la ventaja de que nos permite probar nuestros servicios in situ antes
de enviarlos tráfico de producción, manteniendo la versión antigua en
funcionamiento mientras realizamos nuestra liberación reducimos considerablemente
el tiempo de inactividad asociado con la liberación de nuestro software. Dependiendo
de qué mecanismo se utiliza para implementar el redireccionamiento del tráfico, la
conmutación entre versiones puede ser completamente invisible para el cliente, que
nos da las implementaciones sin tiempo de inactividad.
Existe otra técnica vale la pena discutir brevemente aquí también, que a veces se
confunde con despliegues azul / verde, ya que puede utilizar algunas de las mismas
implementaciones técnicas. Se conoce como la liberación de canario.
La liberación de Canarias
Con canario liberación, estamos verificando nuestro software recién implementado
por la dirección de cantidades de tráfico de producción contra el sistema para ver si
funciona como se esperaba. “Funciona como se esperaba” puede cubrir un número de
cosas, a la vez funcional y no funcional. Por ejemplo, podríamos comprobar que un
servicio recién desplegada está respondiendo a las solicitudes dentro de 500 ms, o
que vemos las mismas tasas de error proporcional a partir de lo nuevo y lo antiguo
servicio. Pero se puede ir más allá de eso. Imaginemos que hemos lanzado una nueva
versión del servicio de recomendación. Podríamos correr a ambos lado de la otra,
150 | Capítulo 7: Prueba
sino ver si las recomendaciones generadas por la nueva versión del resultado del
servicio en el mayor número de ventas esperadas, asegurándose de que no hemos
lanzado un algoritmo óptimo.
Después de las pruebas de
producción | 149
Si la nueva versión es malo, se llega a revertir rápidamente. Si es buena, se puede
empujar increas- cantidades ing de tráfico a través de la nueva versión. Canarias
difiere de la liberación de azul / verde en la que se puede esperar a versiones
coexisten durante más tiempo, y que a menudo van a variar las cantidades de tráfico.
Netflix utiliza este enfoque ampliamente. Antes de la liberación, las nuevas versiones
de servicio se despliegan junto con un grupo de referencia que representa la misma
versión que la producción. Netflix continuación, se ejecuta un subconjunto de la
carga de producción durante un número de horas contra tanto la nueva versión y la
línea de base, anotando ambos. Si el canario pasa, la empresa procede a un pleno
despliegue en producción.
Al considerar la liberación de canario, tiene que decidir si se va a desviar una parte
de las solicitudes de producción hasta el canario o simplemente copiar carga de
producción. Algunos equipos son capaces de sombra tráfico de producción y dirigirla
a su canario. De esta manera, las versiones de producción y canario existentes pueden
ver exactamente las mismas peticiones, pero sólo los resultados de las solicitudes de
producción se ve externamente. Esto le permite hacer una comparación lado a lado al
tiempo que elimina la posibilidad de que un fallo en el canario puede ser visto por un
pedido del cliente. El trabajo a la sombra de tráfico de producción puede ser compleja, sin embargo, especialmente si los eventos / solicitudes está reproduciendo no
son idempotente.
la liberación de Canarias es una técnica de gran alcance, y pueden ayudarle a
verificar las nuevas versiones de su software con tráfico real, mientras que le da las
herramientas para gestionar el riesgo de empujar a cabo un mal lanzamiento. Se
requiere una configuración más compleja, sin embargo, que el despliegue azul /
verde, y un poco más pensado. Se podría esperar que coexistan diferentes versiones
de sus servicios durante más tiempo que con el azul / verde, por lo que se le puede
atar más hardware durante más tiempo que antes. También tendrá más sofisticada de
enrutamiento del tráfico, ya que es posible que desee a la rampa hacia arriba o hacia
abajo los porcentajes del tráfico para conseguir más confianza en que funciona su
liberación. Si ya manejar despliegues / verde azul, es posible que algunos de los
bloques de construcción ya.
Tiempo para reparar lo largo del tiempo medio entre fallos
significa?
Así examinado técnicas como / despliegue o canario verde, azul, liberar,
encontramos una manera de probar más cerca de la producción (o incluso en), y
también construimos herramientas para ayudarnos edad hombre- un fracaso si se
produce. El uso de estos enfoques es un reconocimiento tácito de que no podemos
detectar y atrapar todos los problemas antes de que realmente liberamos nuestro
software.
A veces gastando el mismo esfuerzo en conseguir mejor en la remediación de un
150 | Capítulo 7: Prueba
comunicado puede ser significativamente más beneficiosa que la adición de más
pruebas funcionales automatizadas. En el mundo de las operaciones de web, esto se
refiere a menudo como el equilibrio entre la optimización de tiempo medio entre
fallos (MTBF) y el tiempo medio de reparación (MTTR).
técnicas para reducir el tiempo de recuperación puede ser tan simple como
reversiones muy rápidos aco- se declararon con un buen seguimiento (del que
hablaremos en Capítulo 8), Como tos despliegues azul / verde. Si podemos detectar
un problema en la producción temprana, y hacer retroceder temprano, reducimos
Después de las pruebas de
producción | 149
el impacto a nuestros clientes. También podemos utilizar técnicas como el despliegue
azul / verde, en el que desplegar una nueva versión de nuestro software y probarlo en
situ antes de dirigir nuestros usuarios a la nueva versión.
Para diferentes organizaciones, esta disyuntiva entre MTBF y MTTR variará, y
mucho de esto recae en la comprensión del verdadero impacto del fracaso en una
producción ronment bientes. Sin embargo, la mayoría de las organizaciones que veo
pasar el tiempo la creación de conjuntos de pruebas funcionales a menudo gastan
poco o ningún esfuerzo en absoluto en la mejora del control o de recuperación tras el
fallo. Así, mientras que éstos pueden reducir el número de defectos que se producen
en el primer lugar, no pueden eliminar todos ellos, y están preparados para tratar con
ellos si surgen en la producción.
Existen ventajas y desventajas distintas de MTBF y MTTR. Por ejemplo, si usted
está tratando de averiguar si alguien va a utilizar realmente su software, puede tener
mucho más sentido de sacar algo ahora, para probar la idea o el modelo de negocio
antes de construir software robusto. En un entorno donde este es el caso, la prueba
puede ser excesiva, ya que el impacto de no saber si su idea funciona es mucho
mayor que tener un defecto en la pro- ducción. En estas situaciones, puede ser
bastante sensata para evitar ensayos antes de la pro- ducción por completo.
Prueba de funciones cruzadas
La mayor parte de este capítulo se ha centrado en las pruebas de piezas específicas de
funcionalidad, y en qué se diferencia cuando se está probando un sistema basado en
microService. Sin embargo, existe otra categoría de las pruebas de que es importante
discutir. Los requisitos no funcionales es un término general usado para describir las
características de sus exposiciones del sistema que no puede simplemente ser
implementadas como una característica normal. Incluyen aspectos como la latencia
aceptable de una página web, el número de usuarios de un sistema debe apoyar,
cómo acceder a su interfaz de usuario debe ser a las personas con discapacidades, o
cómo proteger sus datos del cliente deben ser.
El término no funcional nunca se sentó bien conmigo. Algunas de las cosas que son
cubiertas por este término parece muy funcional en la naturaleza! Uno de mis
colegas, Sarah Taraporewalla, acuñaron los requisitos frase multi-funcionales (CFR),
en cambio, que yo prefiero en gran medida. Se habla más al hecho de que estos
comportamientos del sistema en realidad sólo surgen como resultado de un montón
de trabajo intersectorial.
Muchos, si no la mayor parte, las tasas de letalidad realmente sólo se reunieron en la
producción. Dicho esto, podemos definir las estrategias de prueba para ayudarnos a
ver si nos movemos al menos hacia el cumplimiento de estos objetivos. Este tipo de
pruebas se dividen en el cuadrante Prueba propiedad. Un gran ejemplo de esto es la
prueba de rendimiento, del que hablaremos con más profundidad en breve.
Para algunos las tasas de letalidad, es posible que desee realizar un seguimiento de
152 | Capítulo 7: Prueba
ellos en un nivel de servicio individual. Por ejem- plo, puede decidir que la
durabilidad de servicio que necesita de su servicio de pago es significativamente
mayor, pero que está satisfecho con más tiempo de inactividad para su música
Prueba de funciones cruzadas |
151
servicio de recomendación, sabiendo que su negocio puede sobrevivir si no puede
recomendar artistas similares a Metallica durante 10 minutos más o menos. Estas
compensaciones terminarán por tener un gran impacto en la forma de diseñar y
evolucionar su sistema, y una vez más la naturaleza de grano fino de un sistema
basado en microService le da muchas más posibilidades para hacer que estas
compensaciones.
pruebas alrededor de las tasas de letalidad debe seguir la pirámide también. Algunas
pruebas tendrán que ser de extremo a extremo, como pruebas de carga, pero otros no.
Por ejemplo, una vez que haya encontrado un cuello de botella de rendimiento en una
prueba de carga de extremo a extremo, escribir una prueba de ámbito de menor a
ayudarle a coger el problema en el futuro. Otras tasas de letalidad encajan pruebas
más rápidas con bastante facilidad. Recuerdo trabajando en un proyecto donde
habíamos insistido en asegurar nuestra marcado HTML fue el uso de características
adecuadas de accesibilidad para ayudar a las personas con discapacidad utilizan
nuestra página web. Comprobación del marcado generado para asegurarse de que los
controles adecuados se podría haber hecho muy rápidamente sin la necesidad de
ninguna de ida y vuelta de redes.
Con demasiada frecuencia, las consideraciones acerca de las tasas de letalidad llegan
demasiado tarde. Me sugieren fuertemente mirar sus tasas de letalidad tan pronto
como sea posible, y revisar con regularidad.
Pruebas de rendimiento
Las pruebas de rendimiento son vale la pena llamar explícitamente como una manera
de asegurar que algunos de nuestros requerimientos multi-funcionales pueden ser
satisfechas. Al descomponer sistemas en microservicios más pequeños, aumentamos
el número de llamadas que se harán a través de límites de trabajo Net-. Mientras que
antes de una operación podría haber implicado una llamada base de datos, ahora
puede implicar tres o cuatro llamadas a través de límites de la red a otros servi- cios,
con un número correspondiente de las llamadas bases de datos. Todo esto puede
disminuir la velocidad a la que operan nuestros sistemas. La localización de las
fuentes de latencia es especialmente importante. Cuando se tiene una cadena de
llamadas de múltiples llamadas síncronas, si alguna parte de la cadena comienza a
actuar lentamente, todo está afectada, que podría dar lugar a un impacto significativo.
Esto hace que tenga alguna forma de prueba de rendimiento de sus aplicaciones aún
más importante de lo que podría ser con un sistema más monolítico. A menudo, la
razón de este tipo de pruebas se retrasa se debe a que inicialmente no hay suficiente
del sistema hay que probar. Entiendo este problema, pero con demasiada frecuencia
se lleva a patear la lata en el camino, con las pruebas de rendimiento a menudo sólo
está haciendo justo antes de ir en vivo por primera vez, en todo caso! No caiga en
esta trampa.
Al igual que con las pruebas de funcionamiento, es posible que desee una mezcla.
Usted puede decidir que desea pruebas Mance perfor- que aíslan los servicios
152 | Capítulo 7: Prueba
individuales, pero comenzar con las pruebas que evalúan Neys distas básicos en su
sistema. Usted puede ser capaz de tomar las pruebas viaje de extremo a extremo y
sólo tiene que ejecutar estos en volumen.
A generar resultados que valgan la pena, a menudo se necesita para ejecutar
escenarios dados con el aliado gradu- número de clientes simulados en aumento. Esto
le permite ver cómo la latencia de las llamadas varía con el aumento de la carga. Esto
significa que las pruebas de rendimiento puede tomar un tiempo para funcionar.
Además, usted quiere que el sistema de producción coincide con la mayor exactitud
posible,
Prueba de funciones cruzadas |
151
para asegurar que los resultados que se ven serán indicativos del rendimiento que
puede esperar en los sistemas de producción. Esto puede significar que tendrá que
adquirir un volumen mayor de producción como de los datos, y puede necesitar más
máquinas para que coincida con la estructura tareas infraestructuras que pueden ser
un reto. Incluso si se lucha para que el entorno Mance perfor- verdaderamente
producción similar, las pruebas todavía pueden tener valor en la búsqueda de los
cuellos de botella. Sólo ten en cuenta que usted puede obtener falsos negativos, o
peor aún, los falsos positivos.
Debido al tiempo que se tarda en ejecutar las pruebas de rendimiento, no siempre es
factible ejecutar en cada registro de entrada. Es una práctica común para ejecutar un
subconjunto cada día, y un conjunto más grande cada semana. Independientemente
del enfoque que elija, asegúrese de ejecutar ellos con tanta regularidad como sea
posible. Cuanto más tiempo pase sin ejecutar las pruebas de rendimiento, más difícil
puede ser para localizar al culpable. Los problemas de rendimiento son
especialmente difíciles de resolver, por lo que si se puede reducir el número de
confirmaciones que hay que buscar en el fin de ver un problema de reciente
introducción, su vida será mucho más fácil.
Y asegúrese de que también mira los resultados! He estado muy sorprendido por el
número de equipos que he encontrado que han pasado una gran cantidad de pruebas
de aplicación de trabajo y Run-Ning ellos, y nunca comprobar los números. A
menudo esto se debe a que la gente no sabe lo que es un buen resultado se parece.
Usted realmente necesita tener metas. De esta manera, se puede hacer que la
construcción vaya rojo o verde basada en los resultados, con un rojo (no) construir
siendo un claro llamado a la acción.
tesing rendimiento que hay que hacer en conjunto con el seguimiento del sistema real
per- formance (del que hablaremos más en Capítulo 8), Y lo ideal sería utilizar las
mismas herramientas en su entorno de prueba de rendimiento para visualizar el
comportamiento del sistema que aquéllas usadas en la producción. Esto puede hacer
que sea mucho más fácil de comparar cosas similares.
Resumen
Con lo que todo esto junto, lo que he descrito aquí es un enfoque holístico a las
pruebas que se espera le da algunas orientaciones generales sobre cómo proceder al
probar sus propios sistemas. Reiterar los conceptos básicos:
• Optimizar para respuesta rápida, y distintos tipos de pruebas en consecuencia.
• Evitar la necesidad de pruebas de extremo a extremo siempre que sea posible
mediante el uso de contratos orientados al consumidor.
• Utilizar contratos orientados al consumidor para proporcionar puntos de enfoque
para las conversaciones entre los equipos.
• Tratar para entender el trade-off entre poner más esfuerzos en las pruebas y la
154 | Capítulo 7: Prueba
detección de problemas en la producción más rápido (tiempo medio entre fallos
para optimizar frente MTTR).
resumen | 153
Si usted está interesado en leer más acerca de las pruebas, recomiendo Agile Testing
por Lisa Crispin y Janet Gregory (Addison-Wesley), que entre otras cosas incluye el
uso del cuadrante de pruebas con más detalle.
En este capítulo se centró principalmente en asegurar que nuestro código funciona
antes de que llegue pro- ducción, pero también necesitamos saber cómo hacer que
nuestro código funciona una vez que se desplegó. En el siguiente capítulo, vamos a
echar un vistazo a la manera de supervisar nuestros sistemas basados en
MICROSERVICE.
154 | Capítulo 7: Prueba
CAPÍTULO 8
Vigilancia
Como es de esperar que he mostrado hasta ahora, rompiendo nuestro sistema para
arriba en pequeños, microservicios resultados de grano fino en múltiples beneficios.
También, sin embargo, añade complejidad a la hora de vigilar el sistema de
producción. En este capítulo, vamos a ver los retos asociados con el seguimiento y la
identificación de problemas en nuestros siste- mas de grano fino, y voy a esbozar
algunas de las cosas que puede hacer para tener su pastel y comérselo también!
Imagínese la escena. Es un tranquilo viernes por la tarde, y el equipo está a la espera
pendiente antes de tiempo al pub como una manera de empezar un fin de semana
fuera del trabajo. Luego forma repentina los correos electrónicos llegan. El sitio web
está portando mal! Twitter se llena de faltas de su com- pañía, su jefe está
masticando su oreja, y las perspectivas de un fin de semana tranquilo desaparecer.
¿Cuál es la primera cosa que hay que saber? ¿Qué demonios ha salido mal?
En el mundo de la aplicación monolítica, al menos tenemos un lugar muy obvio para
comenzar nuestras investigaciones. Sitio web lento? Es el monolito. Sitio web
impares produce errores? Es el monolito. CPU al 100%? Monolito. Olor a quemado?
Bueno, ya captas la idea. Tener un único punto de fallo también hace investigación
de falla algo más simple!
Ahora vamos a pensar en nuestro propio sistema, basado en microService. Las
capacidades que ofrecemos a nuestros usuarios se sirven de múltiples servicios
pequeños, algunos de los cuales se comunican con aún más servicios para llevar a
cabo sus tareas. Hay un montón de ventajas a este tipo de enfoque (lo cual es bueno,
ya que de lo contrario este libro sería una pérdida de tiempo), pero en el mundo de la
vigilancia, tenemos un problema más complejo en nuestras manos.
Nosotros ahora tienen varios servidores para monitorear, múltiples archivos de
registro para tamizar a través, y múltiples lugares donde la latencia de red podría
causar problemas. Entonces, ¿cómo nos acercamos a esto? Tenemos que dar sentido
a lo que podría ser un caos, desorden, la enmarañada último que cualquiera de
155
nosotros quiere hacer frente a viernes por la tarde (o en cualquier momento, llegar a
eso!).
156 | Capítulo 8: Seguimiento
La respuesta en este caso es bastante sencillo: el seguimiento de las cosas pequeñas,
y el uso de agregación ción para ver la imagen más grande. Para ver cómo, vamos a
empezar con el sistema más simple podemos: un solo nodo.
Servicio individual, Single Server
Figura 8-1 presenta una configuración muy sencilla: un host, se ejecuta un servicio.
Ahora tenemos que vigilar que el fin de saber cuando algo va mal, así que podemos
solucionarlo. ¿Qué debemos tener en cuenta?
Figura 8-1. Un único servicio en un único host
En primer lugar, vamos a querer controlar el host en sí. CPU, memoria de todas estas
cosas se uso-ful. Vamos a querer saber lo que deberían ser las cosas cuando están
sanos, por lo que podemos avisar cuando van fuera de los límites. Si queremos
ejecutar nuestro propio software de monitoreo, podríamos usar algo como Nagios
para hacerlo, o bien utilizar un servicio alojado como Nueva Relic.
A continuación, vamos a querer tener acceso a los registros desde el propio servidor.
Si un usuario informa de un error, estos registros deben recogerlo y es de esperar
nosotros cuando y donde el error es decir. En este punto, con nuestro único host
probablemente podemos llegar a funcionar con sólo iniciar sesión en el host y el uso
de herramientas de línea de comando para escanear el registro. Podemos incluso
llegar avanzada y usar logrotate para mover los registros antiguos, fuera del camino y
evitar dichas prácticas ocupando todo nuestro espacio en disco.
Por último, lo que se quiere controlar la aplicación en sí. Como mínimo, moniToring el tiempo de respuesta del servicio es una buena idea. Es probable que sea
capaz de hacer esto mirando los registros procedentes ya sea desde un servidor web
al frente de su servicio, o tal vez desde el propio servicio. Si conseguimos muy
avanzada, lo que se quiere realizar el seguimiento del número de errores estamos
informando.
El tiempo pasa, las cargas aumentan, y nos encontramos necesidad de escalar ...
Servicio individual, varios servidores
Ahora tenemos varias copias del servicio que se ejecuta en máquinas separadas,
como se muestra en Figura 8-2, Con las solicitudes a las diferentes instancias de
155
servicio distribuidos a través de un ancer equili- carga. Las cosas empiezan a ponerse
un poco ahora más complicado. Todavía queremos monitorear todas las mismas
cosas que antes, pero hay que hacerlo de tal manera que podamos aislar el problema.
156 | Capítulo 8: Seguimiento
Cuando la CPU es alta, es un problema que estamos viendo en todos los hosts, lo que
apuntaría a un problema con el servicio en sí, o se trata de aislar a un único host, lo
que implica que el propio anfitrión tiene el un sistema operativo pícaro quizá la
solución de ¿proceso?
Figura 8-2. Un único servicio distribuido a través de múltiples hosts
Así que en este punto, todavía queremos realizar un seguimiento de las métricas de
nivel de host, y alerta sobre ellos. Pero ahora queremos ver lo que son en todos los
anfitriones, así como los hosts individuales. En otras palabras, queremos agregar a
ellos, y aún así ser capaz de perforar hacia abajo. Nagios nos permite grupo de
nuestros anfitriones como este, tan lejos, tan bueno. Un enfoque similar,
probablemente será suficiente para nuestra aplicación.
Entonces tenemos nuestros registros. Con nuestro servicio que se ejecuta en más de
un servidor, probablemente vamos a cansamos de iniciar sesión en cada caja de
mirarlo. Con sólo unos pocos hosts, sin embargo, podemos utilizar herramientas
como ssh-multiplexores, lo que nos permitirá ejecutar los mismos comandos en
varios hosts. Un monitor grande y una grep "error" app.log más tarde, y podemos
encontrar nuestro culpable.
Para tareas como el seguimiento de tiempo de respuesta, podemos conseguir algo de
la agregación de forma gratuita mediante el seguimiento en el propio equilibrador de
carga. Pero tenemos que seguir el equilibrador de carga, así, por supuesto; si eso se
porta mal, tenemos un problema. En este punto, también, probablemente, importa
mucho más de lo que un servicio de salud se parece, como lo configuraremos nuestra
equilibrador de carga para eliminar nodos no saludables de nuestra aplicación.
Esperamos que para cuando llegamos aquí tenemos al menos una idea de que ...
Servicios Múltiples, múltiples servidores
En Figura 8-3, Las cosas se ponen mucho más interesante. Múltiples servicios están
colaborando para proporcionar capacidades de nuestros usuarios, y dichos servicios
se están ejecutando en anfitriones múltiples ya sean físicos o virtuales. ¿Cómo
encontrar el error que está buscando en miles de líneas de registros en varios hosts?
Servicios Múltiples, múltiples servidores |
157
¿Cómo se determina si un servidor es el Ing misbehav-, o si se trata de una cuestión
sistemática? Y cómo realizar el seguimiento de vuelta un error encontrado en el
fondo de una cadena llamada entre varios hosts y el trabajo lo causó?
158 | Capítulo 8: Seguimiento
Figura 8-3. servicios múltiples colaboradores distribuidos en varios hosts
La respuesta es recogida y agregación central de todo lo que podemos tener en
nuestras manos, a partir de los registros de las métricas de aplicación.
Troncos, troncos, y sin embargo ... Más registros
Ahora el número de hosts que se están ejecutando en se está convirtiendo en un reto.
multiplexación SSH- para recuperar registros probablemente no se va a cortar ahora,
y no hay una pantalla lo suficientemente grande como para que tenga abiertas en
todos los terminales de acogida. En su lugar, estamos buscando a utilizar subsistemas
especializados para agarrar nuestros registros y ponerlos a disposición de forma
centralizada. Un ejemplo de esto eslogstash, Que puede analizar múltiples formatos
de archivo de registro y les puede enviar a los sistemas de aguas abajo para una
mayor investigación.
Kibana es un sistema de Elasticsearch respaldados para los registros de visualización,
ilustradas en las Figura 8-4. Puede utilizar una sintaxis de consulta para buscar a
través de los registros, lo que le permite hacer cosas como restringir los rangos de
fecha y hora o utilizar expresiones regulares para buscar cadenas coincidentes.
Kibana puede incluso generar gráficos a partir de los registros de enviarlo, lo que le
permite ver de un vistazo cómo se han generado muchos errores con el tiempo, por
ejemplo.
Servicios Múltiples, múltiples servidores |
157
Figura 8-4. Usando Kibana para ver registros agregados
Seguimiento métrica Al otro lado de Servicios
Múltiples
Al igual que con el reto de mirar los registros de diferentes anfitriones, tenemos que
mirar a mejores maneras de reunir y ver nuestras métricas. Puede ser difícil saber lo
que se ve bien como cuando estamos mirando métricas para un sistema más
complejo. Nuestra página web está viendo casi 50 4XX códigos de error HTTP por
segundo. ¿Es tan malo? La carga de la CPU en el servicio de registro de cata- ha
aumentado en un 20% desde el almuerzo; ha ido algo mal? El secreto para saber
cuándo entrar en pánico y cuando para relajarse es recopilar métricas sobre cómo su
sis- tema se comporta en un período de tiempo suficientemente largo que emergen
patrones claros.
En un entorno más complejo, vamos a estar aprovisionamiento nuevas instancias de
nuestros servicios con bastante frecuencia, por lo que queremos que el sistema
elegimos para que sea muy fácil de recoger RICS Met de nuevos huéspedes. Vamos a
querer ser capaz de mirar a una métrica agregada para todo el sistema, por ejemplo,
la carga de la CPU, pero avergage que también querrá agregar esa métrica para todas
las instancias de un servicio determinado, o incluso para un solo instancia de ese servicio. Eso significa que tendremos que ser capaz de asociar metadatos con la métrica
que nos permita inferir esta estructura.
El grafito es un tal sistema que hace esto muy fácil. Se expone una API muy simple y
le permite enviar métricas en tiempo real. A continuación, le permite consultar las
métricas para producir gráficos y otras pantallas para ver lo que está sucediendo. La
forma en que maneja volumen también es interesante. Efectivamente, se configura de
tal manera que se reduce la reso- lución de las métricas de más edad para asegurar los
volúmenes no demasiado grande. Así, por ejemplo, podría registrar la CPU para mis
anfitriones una vez cada 10 segundos durante los últimos 10 minutos, a continuación,
una muestra agregada cada minuto para el último día, hasta quizás una muestra cada
30 minutos durante los últimos años. De esta manera, se puede almacenar
160 | Capítulo 8: Seguimiento
información acerca de cómo su sistema se ha comportado durante un largo periodo
de tiempo sin necesidad de grandes cantidades de almacenamiento.
Seguimiento métrica Al otro lado de Servicios
Múltiples | 159
El grafito también le permite agregarse a través de muestras, o acceda a una sola
serie, por lo que se puede ver el tiempo de respuesta de todo el sistema, un conjunto
de servicios, o de una sola instancia. Si grafito no funciona para usted por cualquier
motivo, asegúrese de obtener capacidades similares en cualquier otra herramienta que
seleccione. Y, desde luego asegurarse de que puede obtener acceso a los datos en
bruto para proporcionar a su propia presentación de informes o cuadros de mando si
es necesario.
Otro beneficio clave de la comprensión de sus tendencias es cuando se trata de la
capacidad de la Planificación. ¿Estamos llegando a nuestro límite? ¿Cuánto tiempo
hasta que necesitamos más hosts? En el pasado, cuando trajimos hosts físicos, esto
era a menudo un trabajo anual. En la nueva era de la informática bajo demanda
proporcionado por la infraestructura como servicio (IaaS) vendedores, ahora
podemos escalar hacia arriba o hacia abajo en cuestión de minutos, si no segundos.
Esto significa que si entendemos nuestros patrones de uso, podemos asegurarnos de
que tenemos suficiente infraestructura para servir a nuestras necesidades. El más
inteligente que estamos en el seguimiento de nuestras tendencias y saber qué hacer
con ellos, los más rentables y que responden nuestros sistemas pueden ser.
Las métricas de servicio
Los sistemas operativos que se ejecutan en generar un gran número de métricas para
nosotros, ya que encontrará el momento de instalar collectd en una máquina Linux y
lo señala en grafito. Como- sabia, apoyando subsistemas como Nginx o barniz
expone información útil, como los tiempos de respuesta o las tasas de aciertos de
caché. Pero ¿qué pasa con su propio servicio?
Me gustaría sugerir fuertemente con sus servicios básicos exponen las métricas de sí
mismos. Como mínimo, para un servicio web que probablemente debería exponer
métricas como los tiempos de respuesta y las tasas vitales de error si el servidor no es
liderada por un servidor web que está haciendo esto para usted. Pero realmente
debería ir más allá. Por ejemplo, nuestro servicio de cuentas puede querer exponer el
número de veces que los clientes ver sus pedidos anteriores, o su tienda web puede
ser que desee para capturar la cantidad de dinero que se ha hecho durante el último
día.
¿Por qué nos importa esto? Bueno, por una serie de razones. En primer lugar, hay un
viejo dicho de que el 80% de las características del software no se utilizan nunca.
Ahora no puedo comentar sobre la forma precisa esa cifra es, sino como alguien que
ha sido el desarrollo de software desde hace casi 20 años, sé que he pasado mucho
tiempo en las características que en realidad nunca se acostumbra. ¿No sería bueno
saber cuáles son?
En segundo lugar, nos estamos mejor que nunca en reaccionar a cómo nuestros
usuarios utilizan nuestro sis- tema de encontrar la manera de mejorarlo. Métricas que
nos informan de cómo se comportan nuestros sistemas sólo puede ayudarnos aquí.
160 | Capítulo 8: Seguimiento
Empujamos a cabo una nueva versión de la página web, y encontramos que el
número de búsquedas por géneros se ha incrementado significativamente en el
servicio de catálogo. Es que un problema, o esperar?
Por último, nunca podemos saber qué datos serán útiles! Más veces de las que puedo
contar que he querido capturar datos para ayudar a entender algo que sólo después de
la oportunidad de hacerlo ha pasado mucho tiempo. Tiendo a errar hacia la
exposición de todo y confiar en mi sistema RICS Met para manejar esto más
adelante.
Seguimiento métrica Al otro lado de Servicios
Múltiples | 159
Existen bibliotecas para un número de diferentes plataformas que permiten a nuestros
servicios para enviar métricas para los sistemas estándar. Codahale debiblioteca
métricas es uno de tales biblioteca de ejemplo para la JVM. Se le permite almacenar
métricas como contadores, temporizadores, o calibres; soporta métricas en tiempo
boxeo (para que pueda especificar las métricas como “número de pedidos en los
últimos cinco minutos”); y también viene de la caja con soporte para el envío de
datos a grafito y otra agregación y sistemas de información.
Monitorización sintética
Podemos tratar de averiguar si un servicio es saludable, por ejemplo, decidir lo que
un buen nivel de CPU es, o lo que lo convierte en un tiempo de respuesta aceptable.
Si tem nuestro monitoreo sis- detecta que los valores reales se encuentran fuera de
este nivel seguro, podemos desencadenar una Alert-algo que una herramienta como
Nagios es más que capaz de hacer.
Sin embargo, en muchos sentidos, estos valores se retiran a un paso de lo que
realmente queremos hacer un seguimiento, a saber, es el sistema de trabajo? Cuanto
más compleja es la interacción entre los servicios, se eliminó el más estamos
realmente de responder a esta cues- ción. ¿Y qué si se programan nuestros sistemas
de monitoreo para actuar un poco como nuestros usuarios, y podrían informar si algo
va mal?
Primero lo hice en 2005. Yo era parte de un pequeño equipo ThoughtWorks que era
Building Pro- un sistema para un banco de inversión. A lo largo de la jornada, un
montón de acontecimientos vinieron en la representación de los cambios en el
mercado. Nuestro trabajo consistía en reaccionar a estos cambios, y mirar el impacto
en la cartera del banco. Estábamos trabajando en algunas fechas límites bastante
estrechos, ya que el objetivo era haber hecho todos nuestros cálculos en menos de 10
segundos después del evento llegó. El sistema en sí consistía en alrededor de cinco
servicios discretos, al menos uno de los cuales se ejecutan en una red de computación
que, entre otras cosas, se chatarreros ciclos de CPU no utilizados en alrededor de 250
hosts de escritorio en el centro de recuperación de desastres del banco.
El número de piezas móviles en el sistema significaba mucho ruido estaba siendo
generada a partir de muchas de las métricas de nivel inferior que se reunían. No
teníamos el beneficio de la ampliación gradual o que tengan el sistema funcione
durante unos meses para entender lo que parecía buena para las métricas como
nuestra tasa CPU o incluso las latencias de algunos de los componentes individual y
específico. Nuestro enfoque fue generar eventos falsos a Precio parte del lio portfoque no estaba reservado a los sistemas de aguas abajo. Cada minuto o así, tuvimos
Nagios ejecutar un trabajo de línea de comandos que inserta un evento falso en una
de nuestras colas. Nuestro sistema lo recogió y corrió todos los diversos cálculos al
igual que cualquier otro trabajo, a excepción de los resultados aparecieron en el libro
deseado, que fue utilizado sólo para la prueba. Si una re-fijación de precios no fue
visto en un tiempo determinado, Nagios informó esto como un problema.
162 | Capítulo 8: Seguimiento
Este evento falso que hemos creado es un ejemplo de transacción sintética.
Utilizamos esta transacción tético sin- para asegurar que el sistema se comporta de
vista semántico, por lo que esta técnica se llama a menudo la vigilancia semántica.
Monitoreo sintéticas | 161
En la práctica, he encontrado el uso de transacciones sintéticas para realizar ing
Monitor-semántica, como se trata de un indicador mucho mejor de los problemas en
los sistemas de alerta en las métricas de nivel inferior. No reemplazan la necesidad de
que las métricas de nivel inferior, aunque-nosotros todavía quiere ese detalle cuando
tenemos que averiguar por qué nuestro monitoreo semántica está reportando un
problema.
La implementación de Monitoreo Semántica
Ahora bien, en el pasado, la aplicación de monitoreo semántica era una tarea bastante
desalentadora. Pero el mundo ha cambiado, y los medios de hacer esto es a nuestro
alcance! Estás pruebas Ning RUN para sus sistemas, ¿verdad? Si no, ve a
leerCapítulo 7 y vuelve. ¿Todo listo? ¡Bueno!
Si nos fijamos en las pruebas que tenemos que prueba un servicio dado extremo a
extremo, o incluso todo nuestro sistema de extremo a extremo, tenemos mucho
de lo que necesitamos para implementar ing Monitor-semántica. Nuestro sistema
ya expone los ganchos necesarios para iniciar la prueba y comprobar el resultado.
¿Por qué no basta con ejecutar un subconjunto de estas pruebas, de manera
continua, como una forma de controlar nuestro sistema?
Hay algunas cosas que tenemos que hacer, por supuesto. En primer lugar, tenemos
que tener cuidado con los requerimientos de información de nuestras pruebas. Es
posible que tengamos que encontrar una manera para nuestras pruebas para adaptarse
a diferentes datos en tiempo real si esto cambia con el tiempo, o bien establece una
fuente diferente de datos. Por ejemplo, podríamos tener un conjunto de usuarios
falsos que utilizamos en la producción con un conjunto conocido de datos.
Del mismo modo, tenemos que asegurarnos de que no activan accidentalmente
efectos secundarios imprevistos. Un amigo me contó una historia sobre una
compañía de comercio electrónico que accidentalmente corrió sus pruebas en contra
de sus sistemas de pedidos de producción. No se dio cuenta de su error hasta que un
gran nú- mero de lavadoras llegó a la oficina central.
ID de correlación
Con un gran número de servicios que interactúan para proporcionar cualquier
capacidad del usuario final dado, una sola llamada de iniciación puede terminar la
generación de múltiples llamadas de servicio más aguas abajo. Por ejemplo,
considere el ejemplo de un cliente que está siendo registrada. El cliente rellena todos
sus detalles en un formulario y hace clic en Enviar. Detrás de las escenas,
comprobamos validez de los datos de la tarjeta de crédito con nuestro servicio de
pago, hablamos con nuestro servicio postal para enviar un paquete de bienvenida en
el puesto, y enviar un mensaje de bienvenida con nuestro servicio de correo
electrónico. Ahora lo que sucede si la llamada al servicio de pago termina generando
un error extraño? Hablaremos largo y tendido sobre el manejo de la insuficiencia
162 | Capítulo 8: Seguimiento
deCapítulo 11, Pero tenga en cuenta la dificultad de diagnosticar lo que pasó.
Si nos fijamos en los registros, el único servicio de registro de un error es nuestro
servicio de pago. Si tenemos suerte, podemos trabajar a cabo lo pedido causó el
problema, y podemos incluso ser capaz de mirar a los parámetros de la llamada.
Ahora considera que este es un ejemplo sencillo,
Monitoreo sintéticas | 161
y que una solicitud de iniciación podría generar una cadena de llamadas aguas abajo
y tal vez los eventos que se disparó que se manejan de manera asíncrona. ¿Cómo
podemos reconstruir el flujo de llamadas con el fin de reproducir y solucionar el
problema? A menudo, lo que necesitamos es ver que el error en el contexto más
amplio de la llamada de iniciación; en otras palabras, nos gustaría seguir la cadena de
llamadas aguas arriba, al igual que hacemos con un seguimiento de la pila.
Un enfoque que puede ser útil en este caso es el uso de identificadores de
correlación. Cuando se hizo la primera llamada, se genera un GUID para la llamada.
Esto se hace pasar a continuación a lo largo de todas las llamadas posteriores, como
se ve enFigura 8-5Y se pueden poner en sus registros de una manera estructurada,
todo lo que ya se va a hacer con componentes como el nivel de registro o fecha. Con
el registro de derecho de herramientas gación agregada, a continuación, será capaz de
rastrear ese evento todo el camino a través de su sistema:
15-02-2014
15-02-2014
15-02-2014
15-02-2014
15-02-2014
16:01:01
16:01:02
16:01:03
16:01:03
16:01:03
Web-Frontend INFO [abc-123] Registro
RegisterService INFO [abc-123] RegisterCustomer ...
PostalSystem INFO [abc-123] SendWelcomePack ...
EmailSystem INFO [abc-123] SendWelcomeEmail ...
Pasarela de pago ERROR [abc-123] ValidatePayment ...
Figura 8-5. El uso de identificadores de correlación para realizar un seguimiento de
cadenas de llamadas a través de múltiples servicios
Usted, por supuesto, necesitará asegurarse de que cada servicio sabe transmitir el
identificador de correlación. Aquí es donde usted necesita para estandarizar y ser más
fuertes en la aplicación de esto a través de su sistema. Pero una vez que haya hecho
esto, en realidad se puede crear herramientas para realizar un seguimiento de todo
tipo de interacciones. Tales herramientas puede ser útil en la búsqueda de las
tormentas de eventos, casos de esquina impares, o incluso la identificación de
transacciones especialmente costosos, como se puede imaginar a toda la cascada de
llamadas.
Software como Zipkin También puede rastrear las llamadas a través de múltiples
162
| Capítulo
8: Seguimiento
límites
del sistema.
Sobre la base de las ideas de sistema de rastreo de Google propia,
apuesto, Zipkin puede proporcionar el seguimiento muy detallado de llamadas entre
servicios, junto con una interfaz de usuario para ayudar a presentar los datos.
sonalmente, me he encontrado con los requisitos de Zipkin a ser un poco pesado,
requiriendo clientes personalizados y apoyo a los sistemas de recogida. Teniendo en
cuenta que ya se querrá conectarse
ID de correlación | 163
agregación para otros fines, se siente mucho más simple en lugar de hacer uso de los
datos que ya está recogiendo de tener que sondear en otras fuentes de datos. Dicho
esto, si usted encuentra que necesita una herramienta más avanzada para realizar un
seguimiento de las llamadas entre servicios de este tipo, es posible que desee darles
un vistazo.
Uno de los problemas reales con los ID de correlación es que a menudo no sabe lo
necesita hasta después de que ya tiene un problema que podría ser diagnosticado sólo
si tenías la identificación al principio! Esto es especialmente problemático, como
reequipamiento IDs de correlación en es muy difícil; que necesita para manejarlos de
una manera estandarizada para poder cadenas de llamadas fácilmente reconsititute.
Aunque podría parecer como un trabajo adicional por adelantado, yo fuertemente
sugeriría que los considere el establecimiento de tan pronto como sea posible,
especialmente si su sistema hará uso de patrones de arquitectura evento de
accionamiento, que puede conducir a un comportamiento emergente impar.
Necesidad de manejar tareas como pasar constantemente a través de los ID de
correlación puede ser un fuerte argumento para el uso de las bibliotecas de
derivadores de clientes compartidos delgadas. En una escala determinada, se hace
difícil garantizar que todo el mundo está llamando servicios derivados de la manera
correcta y la recolección de la clase correcta de los datos. Sólo se necesita un servicio
de punto intermedio de la cadena que se olvide de hacer esto para que perder
información crítica. Si decide crear una biblioteca de cliente de la casa para hacer
cosas como esta obra fuera de la caja, no asegurarse de que mantener muy delgada y
no vinculada a ningún ser- vicio producción particular. Por ejemplo, si está utilizando
HTTP como protocolo subyacente para la comu- nicación, simplemente envolver una
biblioteca de cliente HTTP estándar, añadiendo en el código para asegurarse de que
propagan los ID de correlación en las cabeceras.
la Cascade
En cascada fallos puede ser especialmente peligroso. Imagine una situación en la que
la conexión de red entre nuestra página web tienda de música y el servicio de
catálogo se pone. Los propios servicios parecen sanos, pero no pueden hablar entre
sí. Si que acabamos de ver la salud del servicio individual, no sabríamos que hay un
problema. El uso de monitoreo para sintética ejemplo, para imitar a un cliente en
busca de una canción- recogería el problema. Pero también tendríamos que informar
sobre el hecho de que un servicio no puede ver a otro con el fin de determinar la
causa del problema.
Por lo tanto, el seguimiento de los puntos de integración entre los sistemas es la
clave. Cada instancia de servicio debe realizar un seguimiento y exponer la salud de
sus dependencias aguas abajo, desde la base de datos a otros servicios que colaboran.
También debe permitir que esta información se agrega para darle una imagen
enrollada. Usted querrá ver el tiempo de respuesta de las llamadas aguas abajo, y
también detectan si se erroring.
164| Capítulo 8: Seguimiento
Como veremos más en Capítulo 11, Puede utilizar las bibliotecas para implementar
un interruptor de circuito en torno a la red llama para ayudarle a manejar los fallos en
cascada de una manera más elegante, lo que le permite a degradarse con más gracia
su sistema. Algunos de estos libra-
Normalización | 165
Ries, como Hystrix para la JVM, también hacen un buen trabajo de proporcionar
estas capacidades de monitoreo para usted.
Estandarización
Como ya hemos dicho anteriormente, uno de los actos de equilibrio en curso que
necesita para arrancar es donde para permitir que se tomen decisiones estrecho
margen para un solo servicio frente a donde necesita estandarizar a través de su
sistema. En mi opinión, el monitoreo es un área donde la estandarización es
increíblemente importante. Con los servicios de colaboración en un montón de
diferentes maneras de proporcionar capacidades de los usuarios que utilizan
múltiples interfaces, es necesario ver el sistema de una manera holística.
Tú debe tratar de escribir sus registros en un formato estándar. Que debe de tener
todas sus métricas en un solo lugar, y es posible que desee tener una lista de nombres
estándar para sus métricas también; sería muy molesto para un servicio a tener una
métrica llamada ResponseTime, y otra tener uno llamado RspTimeSecs, cuando
quieren decir lo mismo.
Como siempre con la estandarización, las herramientas pueden ayudar. Como he
dicho antes, la clave es hacer que sea fácil de hacer la cosa tan a la derecha por qué
no proporcionar imágenes de máquinas virtuales preconfiguradas con logstash y
collectd listo para salir, junto con las bibliotecas de aplicaciones que le permiten
hablar al grafito con mucha facilidad?
Considere la audiencia
Todos estos datos que estamos reuniendo es para un propósito. Más específicamente,
estamos reuniendo todos estos datos para diferentes personas para ayudar a hacer su
trabajo; estos datos se convierte en una llamada a la acción. Algunos de estos datos
tiene que desencadenar una llamada inmediata a la acción de nuestro apoyo ejemplo
de equipo para, en el caso de una de nuestras pruebas de monitoreo sintéticos que
fallan. Otros datos, como el hecho de que nuestra carga de la CPU se ha
incrementado en un 2% en la última semana, es poten- cialmente sólo de interés
cuando estamos haciendo la planificación de capacidad. Del mismo modo, su jefe es
probablemente va a querer saber de inmediato que los ingresos bajó un 25% después
de la última autorización, pero probablemente no necesita ser despertado, porque las
búsquedas de “Justin Bieber” han subido un 5% en la última hora.
Lo que nuestra gente quiere ver y reaccionar a este momento es diferente de lo que
necesitan cuando la perforación hacia abajo. Por lo tanto, para el tipo de persona que
se busca en estos datos, con- Sider lo siguiente:
• Lo que necesitan saber en este momento
• Lo que tal vez quiera tarde
166| Capítulo 8: Seguimiento
• Cómo les gusta consumir datos
Normalización | 165
Alertar sobre las cosas que necesitan saber en este momento. Crear grandes pantallas
visibles con esta información que se sientan en un rincón de la habitación. darles
acceso fácil a los datos que necesitan conocer más adelante. Y pasar tiempo con ellos
para saber cómo quieren consumir datos. Una discusión acerca de todos los matices
que intervienen en la representación gráfica de la información cuantitativa es, sin
duda fuera del alcance de este libro, pero un gran lugar para comenzar es de Stephen
Few excelente libro de Información Dashboard Design: Visualización de datos de Ata-Glance Monitoreo ( Analítica Prensa).
El futuro
He visto a muchas organizaciones en las métricas están en silos en diferentes
sistemas. métricas de nivel de aplicación, al igual que el número de pedidos
realizados, terminan en un sistema de análisis de propiedad como Omniture, que a
menudo es disponible solamente para seleccionar partes de la empresa, o de lo
contrario termina en el almacén de datos temida, alias donde los datos se va a morir .
Informes de tales sistemas a menudo no está disponible en tiempo real, a pesar de
que es el Ing puesta en cambiar. Mientras tanto, las medidas del sistema, como los
tiempos de respuesta, tasas de error y carga de la CPU se almacenan en los sistemas
que los equipos de operaciones pueden tener acceso. Estos sistemas permiten
normalmente, un camente para la presentación de informes en tiempo real, ya que
normalmente el punto de ellos es provocar una llamada a la acción inmediata.
Históricamente, la idea de que podemos saber acerca de las métricas clave del
negocio de un día o dos más tarde estaba bien, ya que por lo general no fuimos
capaces de reaccionar lo suficientemente rápido como para estos datos para hacer
Any-nada al respecto de todos modos. Ahora, sin embargo, nos movemos en un
mundo en el que muchos de nosotros pueden y empujar a cabo múltiples
comunicados por día. Los equipos ahora se miden no en términos de la cantidad de
puntos que completan, pero en lugar de optimizar el tiempo que toma para el código
de obtener de ordenador portátil para vivir. En tal ambiente, necesitamos todas
nuestras métricas a nuestro alcance para tomar la acción correcta. Irónicamente, los
mismos sistemas que almacenan las métricas de negocio a menudo no están
sintonizados para el acceso inmediato a los datos, pero nuestros sistemas operativos
son.
Entonces, ¿por manejar métricas operativas y de negocio de la misma manera? En
última instancia, ambos tipos de cosas se descomponen a eventos que decir algo que
sucedió en X. Por lo tanto, si podemos unificar los sistemas que utilizamos para
reunir, agregar y almacenar estos eventos, y ponerlos a disposición para la
presentación de informes, nos encontramos con un gran arquitectura más simple.
Riemann es un servidor de eventos que permite la agregación bastante avanzada y el
encaminamiento de eventos y puede formar parte de una solución de este tipo. Suro
es tubería de datos de Netflix y ates oper- en un espacio similar. Suro se utiliza
explícitamente para manejar tanto las métricas asociadas con el comportamiento del
168| Capítulo 8: Seguimiento
usuario, y los datos más operativos como registros de la aplicación. Estos datos
pueden ser enviados a una variedad de sistemas, como tormenta para el análisis en
tiempo real, Hadoop para el procesamiento por lotes fuera de línea, o Kibana para el
análisis de registro.
Muchas organizaciones se están moviendo en una dirección fundamentalmente
diferente: lejos de haberse especializado cadenas de herramientas para diferentes
tipos de métricas y hacia más genérico
Normalización | 165
sistemas de eventos de encaminamiento capaces de escala significativa. Estos
sistemas logran proporcionar mucha más flexibilidad, mientras que al mismo tiempo
realmente simplifica nuestra arquitectura.
Resumen
Por lo tanto, hemos cubierto mucho aquí! Voy a tratar de resumir en este capítulo
algunos consejos de fácil seguimiento.
Para cada servicio:
• Pista tiempo de respuesta de entrada en un mínimo. Una vez que hayas hecho
esto, siga con tasas de error y empezar a trabajar en los indicadores de nivel de
aplicación.
• Pista la salud de todas las respuestas aguas abajo, en un mínimo incluyendo el
tiempo de respuesta de las llamadas aguas abajo, y en el mejor de los índices de
error de seguimiento. Bibliotecas como Hystrix pueden ayudar aquí.
• Estandarizar de cómo y dónde se recogen las métricas.
• Entrar en una ubicación estándar, en un formato estándar, si es posible. La
agregación es un dolor si cada servicio utiliza un diseño diferente!
• Supervisar el sistema operativo subyacente para que pueda localizar a los
procesos autorizados y planificación de capacidad.
Para el sistema:
• métricas de nivel de host agregados como CPU, junto con las métricas de nivel de
aplicación.
• Asegúrese de que su herramienta de almacenamiento métrica permite la
agregación a nivel de sistema o servicio, y profundizar en los hosts individuales.
• Asegúrese de que su herramienta de almacenamiento métrica le permite
mantener los datos de tiempo suficiente para comprender las tendencias en su
sistema.
• Tener una sola herramienta, consultable para agregar y almacenar registros.
• Totalmente de considerar la estandarización en el uso de identificadores de
correlación.
• Entender lo que requiere una llamada a la acción, y alerta estructura y cuadros de
mando en consecuencia.
• Investigar la posibilidad de unificar cómo agregada todas sus diversas RICS Met
viendo si una herramienta como Suro o Riemann tiene sentido para usted.
También he tratado de esbozar la dirección en que se mueve el monitoreo: lejos de
los sistemas especializados para hacer una sola cosa, y hacia sistemas de
resumen | 167
procesamiento de eventos genéricos que le permiten mirar a su sistema de una
manera más integral. Se trata de un ing excit- y el espacio emergente, y al mismo
tiempo una investigación completa está fuera del alcance de este libro, es de esperar
que he dado lo suficiente como para empezar a trabajar con. Si quieres saber más,
168 | Capítulo 8: Seguimiento
Entro en algunas de estas ideas y más en mi publicación anterior Sistemas ligeros
Monitoreo en tiempo real de (O'Reilly).
En el siguiente capítulo, vamos a tener una visión de conjunto diferente de nuestros
sistemas a considerar algunas de las ventajas únicas y desafíos que las arquitecturas
de grano fino pueden proporcionar en el ámbito de la seguridad.
resumen | 167
CAPÍTULO
9
Segurid
ad
hemos familiarizarse con historias sobre violaciones de la seguridad de sistemas a
gran escala resultantes en nuestros datos están expuestos a todo tipo de personajes
poco fiables. Sin embargo, más recientemente, eventos como las revelaciones
Edward Snowden nos han hecho aún más consciente del valor de los datos que las
empresas tienen sobre nosotros, y el valor de los datos que nos son para nuestros
clientes en los sistemas que construimos. En este capítulo se dará una breve
descripción de algunos aspectos de la seguridad que debe considerar en el diseño de
sistemas. Si bien no pretende ser exhaustiva, que despedirá a cabo algunas de las
principales opciones disponibles para usted y le dará un punto de partida para su
propia investigación ulterior.
Nosotros que pensar en lo que la protección de nuestros datos necesita mientras está
en tránsito de un punto a otro, y qué protección que necesita en reposo. Tenemos que
pensar en la seguridad de nuestros sistemas operativos subyacentes, y nuestras redes
también. Hay mucho que pensar, y por lo mucho que podía hacer! Entonces, ¿cuánto
de seguridad necesitamos? ¿Cómo podemos trabajar lo que es suficiente seguridad?
Pero también tenemos que pensar en el elemento humano. ¿Cómo sabemos que es
una persona, y lo que podemos hacer? Y cómo esto se relaciona con la forma en
nuestros servidores se comunican entre sí? Vamos a empezar por ahí.
Autenticacion y autorizacion
Autenticación y autorización son conceptos fundamentales cuando se trata de
personas y cosas que interactúan con nuestro sistema. En el contexto de la seguridad,
la autenticación es el proceso mediante el cual se confirma que una de las partes es
170 | Capítulo 9: Seguridad
quien dice ser. Para un ser humano, por lo general autenticar a un usuario por tener
su tipo en su nombre de usuario y contraseña. Suponemos que sólo ella tiene acceso a
esta información, y por lo tanto que la persona que entra en esta información debe ser
ella. también existen otros sistemas más complejos, por supuesto. Mi teléfono ahora
me permite usar mi huella digital para confirmar que soy quien digo
169
a.m. En general, cuando estamos hablando de manera abstracta acerca de quién o qué
está siendo authentica- Ted, nos referimos a esa parte como el principal.
Autorización es el mecanismo por el cual hacemos un mapa de un director para la
acción estamos permitiendo que haga. A menudo, cuando un director es autenticado,
se nos dará información sobre ella que le ayudará a decidir lo que debemos dejar que
lo haga. Podríamos, por ejemplo, se les diga qué departamento u oficina que trabaja
en piezas de información que nuestros sistemas se pueden utilizar para decidir lo que
puede y no puede hacer.
Para aplicaciones individuales, monolíticos, es común que la propia aplicación para
manejar la autenticación y la autorización para usted. Django, el framework web
Python, sale de la caja con la gestión de usuarios, por ejemplo. Cuando se trata de
siste- mas distribuidos, sin embargo, tenemos que pensar en esquemas más
avanzados. Nosotros no queremos que todos tengan que entrar por separado para los
diferentes sistemas, utilizando un nombre de usuario diferente y la palabra de
Transmisión para cada uno. El objetivo es tener una identidad única que podemos
autenticar una vez.
Común de sesión único Implementaciones
Un enfoque común para la autenticación y autorización es utilizar algún tipo de
solución de inicio de sesión único (SSO). SAML, que es la aplicación que reina en el
espacio empresarial, y OpenID Conectar ambos proporcionan capacidades en esta
área. Más o menos se utilizan los mismos conceptos básicos, aunque la terminología
difiere ligeramente. Los términos utilizados aquí son de SAML.
Cuando un director intenta acceder a un recurso (como una interfaz basada en la
web), que es direc- ted para autenticarse con un proveedor de identidad. Esto puede
preguntarle a proporcionar un nombre de usuario y contraseña, o podría utilizar algo
más avanzada, como la autenticación de dos factores. Una vez que el proveedor de
identidad está convencido de que el director haya sido autenticada, que da
información al proveedor de servicios, que le permita decidir si conceder su acceso al
recurso.
Este proveedor de identidad podría ser un sistema alojado externamente, o algo
dentro de su propia organización. Google, por ejemplo, proporciona una vider pro
OpenID Connect. Para las empresas, sin embargo, es común tener su propio
proveedor de identidad, que puede estar relacionado con el servicio de directorio de
su empresa. Un servicio de directorio podría ser algo así como el Lightweight
Directory Access Protocol (LDAP) o Active Directory. Estos sistemas permiten
almacenar información acerca de las entidades, tales como qué papeles que
desempeñan en la organización. A menudo, el servicio de directorio y el pro veedor
de identidad son una y la misma, mientras que a veces son separados pero
vinculados. Okta, por ejemplo, es un proveedor de identidad SAML alojado que se
encarga de tareas como la autenticación de dos factores, pero puede enlazar a los
servicios de directorio de su empresa como la fuente de la verdad.
170 | Capítulo 9: Seguridad
SAML es un estándar basado en SOAP, y es conocido por ser bastante compleja a
pesar de trabajar con las bibliotecas y herramientas disponibles para apoyarlo.
OpenID Connect es una norma
169
que ha surgido como una implementación específica de OAuth 2.0, basado en la
forma en que Google y otros manejan SSO. Utiliza llamadas REST más simples, y en
mi opinión es probable que hacer incursiones en las empresas debido a su mayor
facilidad de uso. Su mayor obstáculo en este momento es la falta de proveedores de
identidad que lo soportan. Para un sitio web de cara al público, es posible que estar
bien usando Google como su proveedor, pero para los sistemas internos o sistemas en
los que desea más control sobre y visibilidad sobre cómo y dónde se instala sus
datos, usted quiere que su propia identidad en la casa proveedor. En el momento de
ING ESCRITO, OpenAM y Gluu son dos de las pocas opciones disponibles en este
espacio, compararse a una gran cantidad de opciones para SAML (incluyendo Active
Directory, que parece estar en todas partes). Hasta ya menos que los proveedores de
identidad existente empezar a apoyar a OpenID Connect,
Así, mientras pienso OpenID Connect es el futuro, es muy posible que va a tomar un
tiempo para llegar a la adopción generalizada.
Single Sign-On de puerta de enlace
Dentro de una configuración microService, cada servicio podría decidir manejar la
redirección a, y la toma de contacto con el proveedor de identidad. Obviamente, esto
podría significar un montón de trabajo duplicado. Una biblioteca compartida podría
ayudar, pero que tendríamos que tener cuidado para evitar el acoplamiento que puede
venir de código compartido. Esto tampoco sería de ayuda si usted tenía múltiples
diferentes pilas de tecnología.
En lugar de tener cada servicio gestionar apretón de manos con su proveedor de
identidad, se puede utilizar una puerta de entrada a actuar como un proxy, sentado
entre sus servicios y el mundo exterior (como se muestra en Figura 9-1). La idea es
que podemos centralizar el comportamiento para redireccionar al usuario y realizar el
apretón de manos en un solo lugar.
La Figura 9-1. El uso de una puerta de enlace para manejar SSO
170 | Capítulo 9: Seguridad
Autenticación y Autorización | 171
Sin embargo, todavía tenemos que resolver el problema de cómo el servicio de aguas
abajo recibe información acerca de las entidades, como su nombre de usuario o qué
papeles que desempeñan. Si está utilizando HTTP, podría llenar los encabezados con
esta información. Shibboleth es una herramienta que puede hacer esto para usted, y
he visto que se usa con Apache con gran efecto para manejar la integración con
proveedores de identidad basados en SAML.
Otro problema es que si hemos decidido remitir la responsabilidad de authenticación a una pasarela, puede ser más difícil de razonar acerca de cómo se comporta un
microService al mirarlo de forma aislada. Recuerde que enCapítulo 7 donde hemos
explorado algunos de los desafíos en la reproducción de los entornos de producción
similar? Si vas a la ruta de puerta de enlace, asegúrese de que los desarrolladores
pueden lanzar sus servicios, unos tras otros, sin demasiado trabajo.
Un último problema con este enfoque es que se le puede adormecer en una falsa
sensación de seguri- dad. Me gusta la idea de defensa en profundidad, desde el
perímetro de la red, a la subred, a pruebas de inflamabilidad de la pared, a máquina, a
sistema operativo, el hardware subyacente. Usted tiene la capacidad de poner en
práctica medidas de seguridad en todos estos puntos, algunos de los cuales vamos a
entrar en breve. He visto algunas personas ponen todos sus huevos en una canasta,
apoyándose en la puerta de entrada para manejar cada paso para ellos. Y todos
sabemos lo que ocurre cuando tenemos un único punto de fallo ...
Obviamente, usted podría utilizar esta puerta de enlace para hacer otras cosas. Si se
utiliza una capa de instancias de Apache corriendo Shibboleth, por ejemplo, puede
también decidir terminar HTTPS a este nivel, detección de intrusos ejecutar, y así
sucesivamente. Hay que tener cuidado, sin embargo. forma en capas Gate- tienden a
asumir más y más funcionalidad, que en sí mismo puede llegar a ser un punto de
acoplamiento gigante. Y cuanto más funcionalidad algo tiene, mayor es la superficie
de ataque.
Autorización de grano fino
Una puerta de entrada puede ser capaz de proporcionar autenticación bastante eficaz
de grano grueso. Por ejemplo, podría impedir el acceso a cualquier usuario que no ha
iniciado la sesión en el servicio de ayuda a la aplica- ción. Asumiendo nuestra
pasarela puede extraer atributos acerca del principal como resultado de la
autenticación, puede ser capaz de tomar decisiones más matizadas. Por ejemplo, es
común colocar a las personas en grupos, o asignarlos a los roles. Podemos utilizar
esta informa- ción para entender lo que pueden hacer. Así que para la aplicación de
servicio de ayuda, podríamos permitir el acceso sólo a los directores con una función
específica (por ejemplo, personal). Más allá de lo que permite (o mugido disal-) el
acceso a los recursos o puntos finales específicos, sin embargo, tenemos que dejar el
resto a la propia microService; se tendrá que hacer más decisiones acerca de lo que
las operaciones para permitir.
Volver a nuestra solicitud de asistencia: qué permitimos que cualquier miembro del
172| Capítulo 9: Seguridad
personal a ver cualquiera y todos los detalles? Lo más probable es que tendremos
diferentes roles en el trabajo. Por ejemplo, un director en el grupo call_center podría
permitirse para ver cualquier tipo de información sobre un cliente, excepto sus datos
de pago. El director también podría ser capaz de emitir
Servicio-al-servicio de autenticación y autorización | 173
reembolsos, pero esa cantidad podría estar tapados. Alguien que tiene el papel
TER_TEAM_LEADER CALL_CEN-, sin embargo, podría ser capaz de emitir un
reembolso mayor.
Estas decisiones tienen que ser local en el microService en cuestión. He visto
personas utilizan los diversos atributos suministrados por proveedores de identidad
en formas horribles, utilizando papeles muy de grano fino como
CALL_CENTER_50_DOLLAR_REFUND, en el que terminan poniendo la
información específica de una parte de una de comportamiento de nuestro sistema en
sus servicios de directorio. Esto es una pesadilla para mantener y da muy poco
margen para nuestros servicios tengan su propio ciclo de vida independiente, como
de repente un trozo de información sobre cómo se comporta un servicio vidas en otro
lugar, tal vez en un sistema gestionado por una parte dife- rentes de la organización.
En su lugar, favorecer papeles de grano grueso, modelada en torno a cómo funciona
su organización. Va todo el camino de regreso a los primeros capítulos, recordamos
que estamos construyendo el software para que coincida con el funcionamiento de
nuestro organismo. Así que utilice sus papeles de esta manera también.
Servicio-al-servicio de autenticación y autorización
Hasta este punto hemos estado usando el término principal para describir cualquier
cosa que pueda autenticar y estar autorizado para hacer las cosas, pero nuestros
ejemplos se han hecho acerca de los humanos que usan computadoras. Pero ¿qué
pasa con los programas, u otros servicios, autenti- ticating uno con el otro?
Permitir que todo el interior del perímetro
Nuestra primera opción podría ser simplemente asumir que cualquier llamada a un
servicio realizado desde el interior de nuestro perímetro son de confianza implícita.
Dependiendo de la sensibilidad de los datos, esto podría estar bien. Algunas
organizaciones tratan de garantizar la seguridad en el perímetro de sus redes, y por lo
tanto asumen que no es necesario hacer nada más que dos servicios están hablando
juntos. Sin embargo, un atacante debe penetrar en su red, tendrá poca protección
contra un típico ataque man-in-the-middle. Si el atacante decide interceptar y leer los
datos que se envían, cambiar los datos sin conocimiento del usuario, o incluso en
algunas circunstancias pre tienden a ser lo que está hablando, usted no puede saber
mucho al respecto.
Esto es, con mucho, la forma más común de confianza dentro de perímetro que veo
en las organizaciones. Pueden decidir ejecutar este tráfico a través de HTTPS, pero
no hacer mucho más. No estoy diciendo que es una buena cosa! Para la mayoría de
las organizaciones que veo que utilizan este modelo, me preocupa que el modelo de
confianza implícita no es una decisión consciente, pero más que las personas no son
conscientes de los riesgos en el primer lugar.
174| Capítulo 9: Seguridad
HTTP (S) de autenticación básica
La autenticación básica HTTP permite que un cliente envía un nombre de usuario y
contraseña en un encabezado HTTP estándar. El servidor puede comprobar estos
detalles y confirmar que el cliente está autorizado para acceder al servicio. La ventaja
aquí es que este es un protocolo extremadamente bien entendido y bien soportado. El
problema es que hacer esto a través de HTTP es muy problemático, ya que el nombre
de usuario y la contraseña no se envían de forma segura. Cualquier parte intermedia
puede ver la información en la cabecera y ver los datos. Por lo tanto, la autenticación
básica HTTP normalmente se debe utilizar a través de HTTPS.
Cuando se utiliza HTTPS, el cliente obtiene garantías firmes de que el servidor se
está hablando con quién es el cliente piensa que es. También nos da una protección
adicional contra las personas escuchas ilegales en el tráfico entre el cliente y el
servidor o jugar con la carga de PAY.
El servidor necesita para gestionar sus propios certificados SSL, que pueden llegar a
ser problemático cuando se está gestionando múltiples máquinas. Algunas
organizaciones adquieren su propio proceso de emisión cado certifi-, que es una
carga administrativa y operativa adicional. Herramientas alrededor de la gestión de
esta forma automatizada son ni mucho menos tan madura como podrían ser, y no es
sólo el proceso de emisión que tiene que manejar. certifica- dos auto-firmados no son
fácilmente revocable, y por lo tanto requiere de mucho más pensamiento en torno
escenarios de desastre. Ver si se puede esquivar todo este trabajo, evitando
autofirmar por completo.
Otra desventaja es que el tráfico enviado a través de SSL no puede ser almacenado en
caché por los proxies inversos como barniz o calamar. Esto significa que si usted
necesita para almacenar en caché el tráfico, tendrá que ser hecho ya sea dentro del
servidor o en el interior del cliente. Puedes solucionar este problema por tener un
equilibrador de carga por terminado el tráfico SSL, y tener la sentada detrás de la
caché equilibrador de carga.
Nosotros También hay que pensar en lo que sucede si estamos utilizando una solución
SSO existente, como SAML, que ya tiene acceso a los nombres de usuario y
contraseñas. ¿Queremos que nuestro servicio básico de autenticación a utilizar el
mismo conjunto de credenciales, lo que nos permite un proceso para ing issu- y
revocación de ellos? Podríamos hacer esto a través de la charla de servicios al mismo
servicio toria direc- que respalda nuestra solución SSO. Alternativamente, podríamos
almacenar los usuarios y contraseñas a nosotros mismos dentro del servicio, pero
corremos el riesgo de duplicar el comportamiento.
Una nota: en este enfoque, todo el servidor sabe es que el cliente tiene el nombre de
usuario y contraseña. No tenemos idea de si esta información proviene de una
máquina que esperamos; que puede provenir de cualquier persona en nuestra red.
El uso de SAML o OpenID Conectar
Servicio-al-servicio de autenticación y autorización | 175
Si ya está utilizando SAML o OpenID Conectar como su esquema de autenticación y
autorización, es posible que utilices para que las interacciones de servicio a servicio
también. Si está utilizando una puerta de entrada, deberá encaminar el tráfico de todo
dentro de la red a través de la puerta de entrada también, pero si cada servicio se
encarga de la integración en sí, este enfoque sólo debe
176| Capítulo 9: Seguridad
trabajar fuera de la caja. La ventaja aquí es que usted está haciendo uso de la
infraestructura existente, y llegar a centralizar todos sus controles de acceso al
servicio en un servidor de directorio central. Todavía había necesidad de ruta de este
a través de HTTPS si queríamos evitar man-in-the-middle.
Los clientes tienen un conjunto de credenciales que utilizan para autenticarse con el
proveedor de identidad, y el servicio obtiene la información que necesita para decidir
sobre cualquier autentificación de grano fino.
Esto significa que necesitará una cuenta para sus clientes, a veces referido como una
cuenta de servicio. Muchas organizaciones utilizan este enfoque con bastante
frecuencia. Una palabra de advertencia, sin embargo: si se va a crear cuentas de
servicio, trate de mantener su uso nar- fila. Así que considerar cada microService
tiene su propio conjunto de credenciales. Esto hace revocación / cambiar un acceso
más fácil si las credenciales verse en peligro, ya que sólo necesita revocar el conjunto
de credenciales que se han visto afectados.
Hay un par de otras desventajas, sin embargo. En primer lugar, al igual que con
autenticación básica, tenemos que almacenar de forma segura nuestras credenciales:
¿de dónde el nombre de usuario y contraseña viven? El ent CLI- tendrá que encontrar
alguna forma segura de almacenar estos datos. El otro problema es que algunas de las
tecnologías en este espacio para hacer la autenticación es bastante tedioso para
codificar. SAML, en particular, hace que la implementación de un cliente en un
asunto doloroso. OpenID Con- Nect tiene un flujo de trabajo más sencillo, pero como
hemos comentado anteriormente no es así que todavía compatible.
certificados de cliente
Otro enfoque para confirmar la identidad de un cliente es hacer uso de las
capacidades de seguridad de la capa de transporte (TLS), el sucesor de SSL, en forma
de certificados de cliente. En este caso, cada cliente tiene instalado un certificado
X.509 que se utiliza para establecer un vínculo entre el cliente y el servidor. El
servidor puede verificar la autenticidad de cado el cliente certifi-, proporcionando
garantías firmes de que el cliente es válida.
Los retos operativos aquí en la gestión de certificados son aún más onerosa que con
sólo el uso de certificados de servidor. No es sólo algunas de las cuestiones básicas
de la crea- ating y gestionar un mayor número de certificados; más bien, es que con
todas las complejidades alrededor de los propios certificados, se puede esperar a
pasar mucho tiempo tratando de diagnosticar por qué un servicio no aceptará lo que
creemos que es un certificado de cliente completamente válido. Y entonces tenemos
que considerar la dificultad de revocar y reexpedir los certificados si sucede lo peor.
El uso de certificados comodín puede ayudar, pero no va a resolver todos los
problemas. Esta carga adicional significa que va a estar buscando a utilizar esta
técnica cuando usted está especialmente preocupado por la sensibilidad de los datos
que se envían, o si va a enviar datos a través de redes no lo hace totalmente de
control.
Servicio-al-servicio de autenticación y autorización | 177
HMAC a través de HTTP
Como hemos comentado anteriormente, el uso de la autenticación básica sobre HTTP
plano no se torios Bly razonable si nos preocupa el nombre de usuario y la contraseña
sean comprometidos. La alternativa es tradicional ruta de tráfico HTTPS, pero hay
algunas desventajas. Aparte de la gestión de los certificados, la sobrecarga de tráfico
HTTPS puede colocar adi- cional tensión en los servidores (aunque, para ser honesto,
esto tiene un impacto menor de lo que hizo hace varios años), y el tráfico no puede
ser fácilmente almacenado en caché.
Un enfoque alternativo, tal como se utiliza ampliamente por APIs S3 de Amazon
para AWS y en partes de la especificación OAuth, es utilizar un código de mensajería
basado en hash (HMAC) para firmar la solicitud.
Con HMAC la solicitud cuerpo junto con una clave privada es ordenado, y el hash
resultante se envía junto con la solicitud. El servidor utiliza su propia copia de la
clave privada y el cuerpo de la petición para volver a crear el hash. Si coincide,
permite la solicitud. Lo bueno aquí es que si un hombre en el medio se mete con la
solicitud, entonces el hash no coincidirá y el servidor sabe que la solicitud haya sido
manipulado. Y la clave pri- vado nunca se envía en la solicitud, por lo que no puede
verse comprometida durante el transporte! El beneficio añadido es que este tráfico
puede entonces más fácilmente ser almacenado en caché, y la sobrecarga de la
generación de los valores hash bien puede ser inferior a manejar el tráfico de HTTPS
(aunque su kilometraje puede variar).
Hay tres desventajas de este enfoque. En primer lugar, tanto el cliente como el
servidor necesitan un secreto compartido que debe ser comunicada de alguna manera.
¿Cómo lo comparten? Se podría hardcoded en ambos extremos, pero entonces usted
tiene el problema de revocar el acceso si el secreto se convierte en peligro. Si se
comunica esta clave sobre algún protocolo alternativo, entonces usted necesita para
asegurarse de que ese protocolo también es muy seguro!
En segundo lugar, se trata de un patrón, no una norma, y por lo tanto hay formas
divergentes de imple- Menting ella. Como resultado, hay una escasez de buenas
implementaciones, abiertos y utilizables de este enfoque. En general, si este enfoque
le interesa, a continuación, hacer un poco más lectura para entender las diferentes
formas en que se hace. Me gustaría ir tan lejos como para decir que basta con ver
cómo Amazon hace esto para S3 y copiar su enfoque, sobre todo utilizando una
función hash sensible con una forma adecuada a largo clave como SHA-256.JSON
fichas web (JWT) son también vale la pena mirar, a medida que implementan un
enfoque muy similar y parecen estar ganando impulso. Pero ser consciente de la
dificultad de conseguir esta materia derecha. Mi compañero estaba trabajando con un
equipo que estaba llevando a cabo su propia implementación JWT, omite un solo
cheque de Boole, e invalidó toda su código de identificación! Esperemos que con el
tiempo veremos más implementaciones de bibliotecas reutilizables.
178| Capítulo 9: Seguridad
Por último, entiende que este enfoque sólo se asegura que ningún tercero tiene
mani- RELAClONADAS la solicitud y que la clave privada en sí sigue siendo
privada. El resto de los datos en la solicitud seguirá siendo visible para los
partidos espionaje en la red.
Claves API
Todas las API públicas de servicios como Twitter, Google, Flickr, y AWS hacen uso
de claves de la API. claves de la API permiten un servicio para identificar que está
haciendo una llamada, y poner límites a lo que pueden hacer. A menudo, los límites
van más allá de simplemente dar acceso a un recurso, y pueden extenderse a acciones
como personas específicas que limitan la velocidad para proteger la calidad del
servicio para otras personas.
Cuando se trata de usar claves de la API para manejar su propio enfoquemicroService a microService, los mecanismos exactos de cómo funciona dependerán
de la tecnología que utiliza. Algunos sistemas utilizan una única clave de API que se
comparte, y utilizan un enfoque similar al HMAC como se acaba de describir. Un
enfoque más común es utilizar un par de claves pública y privada. Por lo general,
podrás gestionar claves en el centro, al igual que nos administrar identidades de las
personas en el centro. El modelo de pasarela es muy popular en este espacio.
Parte de su popularidad se debe al hecho de que las claves de la API se centran en la
facilidad de uso para los programas. En comparación con el manejo de un apretón de
manos SAML, authentica- ción basada en la clave de API es mucho más simple y
directo.
Las capacidades exactas de los sistemas varían, y hay múltiples opciones, tanto en el
espacio comercial y de código abierto. Algunos de los productos que se encarga
solamente el intercambio de claves de API y un poco de gestión de claves básica.
Otras herramientas ofrecen de todo, hasta e incluyendo la limitación de velocidad,
monetización, catálogos API y sistemas de descubrimiento.
Algunos sistemas API permiten al puente de claves de la API a los servicios de
directorio existentes. Esto le permitiría a emitir claves de la API a los directores (que
representan a personas o sistemas) en su organización, y controlar el ciclo de vida de
las claves de la misma manera en que se mane- jan sus credenciales normales. Esto
abre la posibilidad de permitir el acceso a sus servicios en diferentes formas, pero
manteniendo la misma fuente de la verdad, por ejemplo, mediante SAML para
autenticar a los seres humanos para SSO, y el uso de claves de la API para la
comunicación de servicio a servicio, como se muestra enFigura 9-2.
Servicio-al-servicio de autenticación y autorización | 179
Figura 9-2. Utilizando los servicios de directorio para sincronizar la información
principal entre un SSO y una puerta de enlace API
El problema Adjunto
Tener un director autenticar con un microserservice dado es bastante simple. ¿Pero
qué sucede si ese servicio, entonces tiene que hacer llamadas adicionales para
completar un fun- cionamiento? Echa un vistazo aFigura 9-3, Que ilustra sitio de
compras en línea de MusicCorp. Nuestra tienda en línea es un navegador basado en
JavaScript interfaz de usuario. Se realiza llamadas a una aplicación de tienda del lado
del servidor, utilizando el patrón backends-para-interfaces describimos enCapítulo 4.
Las llamadas realizadas entre el navegador y el servidor de llamadas pueden ser
autenticados mediante SAML o OpenID Connect o similar. Hasta aquí todo bien.
Cuando estoy conectado, puedo hacer clic en un enlace para ver detalles de un
pedido. Para mostrar la información, hay que tirar de la orden original del servicio de
orden, pero también queremos buscar información de la orden de envío. Así clic en el
enlace a / OrderStatus / 12345 hace que la tienda en línea para iniciar una llamada
desde el servicio de tienda online tanto para el servicio de servicio de pedidos y el
envío preguntando por esos detalles. Pero si estos servicios derivados aceptar las
llamadas de la tienda en línea? Podríamos adoptar una postura de confianza implícita
que debido a que la llamada es de origen dentro de nuestro ter perime-, que está bien.
Podríamos incluso utilizar los certificados o claves API para confirmar que sí, lo que
realmente es la tienda en línea solicitando esta información. Pero es esto suficiente?
180| Capítulo 9: Seguridad
Figura 9-3. Un ejemplo en el que un diputado confusa podría entrar en juego
Hay un tipo de vulnerabilidad, denominada el problema adjunto confusa, que en el
con- texto de la comunicación de servicio a servicio se refiere a una situación en la
que un usuario malintencionado puede engañar a un servicio adjunto en la realización
de llamadas a un servicio de aguas abajo en su nombre que él no debería ser capaz de
hacerlo. Por ejemplo, como cliente, al iniciar sesión en el sistema de compras en
línea, puedo ver más detalles de la cuenta. ¿Y si pudiera engañar a la interfaz de
usuario de ping tienda- en línea en la fabricación de una solicitud de alguien más
detalles, tal vez haciendo una llamada con el que ha iniciado sesión en credenciales?
En este ejemplo, ¿cuál es para que dejara de pedir órdenes que no son mías? Una vez
iniciada la sesión, pude empezar a enviar solicitudes de otras órdenes que no son
mías para ver si podía obtener información útil. Podríamos tratar de proteger contra
esta dentro de la misma tienda en línea, comprobando que la orden es para rechazarla
y si alguien está pidiendo cosas que no debería. Si tenemos un montón de diferentes
aplicaciones que salen a la superficie esta informa- ción, sin embargo, que podría ser
potencialmente duplicar esta lógica en muchos lugares.
Nosotros podría encaminar peticiones directamente desde la interfaz de usuario para el
servicio de pedidos y deje que se validen fecha de la solicitud, pero luego llegamos a
los diversos inconvenientes que discutimos en Capítulo 4. Por otra parte, cuando la
tienda en línea envía la solicitud al servicio de orden, que podría indicar no sólo lo
que quiere el fin, sino también en nombre del cual está pidiendo. Algunos esquemas
nológica autenti- nos permiten pasar las credenciales del principal original, aguas
abajo, aunque con SAML esto es un poco de una pesadilla, con la participación
aserciones SAML anidadas que son técnicamente posible, pero tan difícil que nadie
lo hace. Esto puede llegar a ser aún más complejo, por supuesto. Imagínese si los
servicios de la tienda en línea charlas a su vez hacen más llamadas aguas abajo.
¿Hasta dónde tenemos que ir en la validación de la confianza de todos los diputados?
Este problema, por desgracia, no tiene una respuesta sencilla, ya que no es un
problema sencillo. Tenga en cuenta que existe, sin embargo. Dependiendo de la
Servicio-al-servicio de autenticación y autorización | 181
sensibilidad de la operación en
182| Capítulo 9: Seguridad
pregunta, usted podría tener que elegir entre una confianza implícita, la verificación
de la identidad de la persona que llama, o pidiendo a la persona que llama para
proporcionar las credenciales del capital original.
Asegurar los datos en reposo
Datos mentir acerca es un pasivo, especialmente si es sensible. Con suerte que hemos
hecho cuanto esté en nuestra para asegurar los atacantes no puedan romper nuestra
red, y también que no podemos romper nuestras aplicaciones o sistemas operativos
para obtener acceso a la estrecha subyacente arriba. Sin embargo, tenemos que estar
preparados en caso de que lo hacen-defensa en profundidad es la clave.
Muchos del alto perfil de las brechas de seguridad implican datos en reposo siendo
adquiridas por un atacante, y que los datos sistema legible por el atacante. Esto se
debe a que los datos se almacenan en una forma no cifrada, o porque el mecanismo
que se utiliza para proteger los datos tenía un defecto fundamental.
Los mecanismos por los cuales la información segura pueden ser protegidos son
muchas y variadas, pero lo que se aproximan a elegir, hay algunas cosas generales a
tener en cuenta.
Ir a la bien conocida
La forma más sencilla que puede estropear el cifrado de datos es tratar de poner en
práctica sus propios algoritmos de cifrado, o incluso tratar de poner en práctica de
otra persona. Cualquiera que sea el lenguaje programa- ming que utilice, tendrá
acceso a las implementaciones revisados regularmente, parcheadas de algoritmos de
cifrado bien considerados. Utilizar esos! Y suscribirse a las listas de correo / listas de
referencia para la tecnología que elija para asegurarse de que son conscientes de las
vulnerabilidades ya que se encuentran para que pueda mantenerlos parcheado y hasta
la fecha.
Para el cifrado en reposo, a menos que tenga una muy buena razón para escoger otra
cosa, elegir una aplicación bien conocida de AES-128 o AES-256 para su platform.1
Tanto los tiempos de ejecución de Java y .NET incluyen implementaciones de AES
que son altamente probable que sea bien probada (y bien parcheado), pero existen
bibliotecas separadas para la mayoría de las plataformas también- por ejemplo, el
bibliotecas castillo hinchable para Java y C #.
Para las contraseñas, se debe considerar el uso de una técnica llamada salada hash de
la clave.
Mal implementado cifrado podría ser peor que no tener ninguno, como la falsa
sensación de seguridad (perdón por el juego de palabras) que puede llevar a tomar su
ojo de la pelota.
180 | Capítulo 9: Seguridad
1 En general, longitud de la clave aumenta la cantidad de trabajo necesario para la fuerza bruta-romper una
llave. Por lo tanto se puede asumir el la clave más larga, más segura sus datos. Sin embargo, algunos
problemas de menor importancia se han planteado acerca de la implementación de AES-256 para ciertos tipos
de llaves por el experto en seguridad respetadoBruce Schneier. Esta es una de las áreas en las que hay que
hacer más investigación sobre lo que el consejo actual es en el momento de la lectura!
Asegurar los datos en reposo
| 181
Sólo se trata de los Cayos
Como se ha cubierto hasta el momento, el cifrado se basa en un algoritmo de tomar
los datos a ser cifrados y una clave y luego producir los datos cifrados. Por lo tanto,
donde se almacena su clave? Ahora bien, si estoy cifrando los datos de mi porque
estoy preocupado por que alguien le robe toda mi base de datos, y almacenar la clave
que utilizo en la misma base de datos, entonces realmente no he logrado mucho! Por
lo tanto, tenemos que almacenar las claves en otro lugar. ¿Pero donde?
Una solución es utilizar un dispositivo de seguridad separado para cifrar y descifrar
datos. Otra es utilizar una bóveda llave separada que su servicio puede acceder
cuando se necesita una llave. La gestión del ciclo de vida de las teclas (y el acceso a
cambiarlos) puede ser una operación importante, y estos sistemas puede manejar esto
para usted.
Algunas bases de datos, incluso incluyen soporte integrado para el cifrado, como el
cifrado de datos transparente de SQL Server, que tienen como objetivo manejar esto
de una manera transparente. Incluso si su base de datos de elección no, la
investigación de cómo se manejan las claves y entender si la amenaza está
protegiendo contra la realidad está siendo mitigada.
Una vez más, esto es complejo. Evitar la aplicación de su cuenta, y hacer algo de una
buena investigación!
Recoger sus objetivos
Suponiendo que todo debe ser encriptada puede simplificar un poco las cosas. No
hay conjeturas sobre lo que debe o no debe ser protegida. Sin embargo, usted todavía
necesita pensar acerca de qué datos se pueden poner en los archivos de registro para
ayudar a la identificación de problemas, y la sobrecarga de cálculo de cifrar todo
puede llegar a ser bastante onerosa, necesidad- ing hardware más potente como
resultado. Esto es aún más difícil cuando se está aplicando migraciones de bases de
datos como parte de los esquemas de refactorización. Dependiendo de que se realicen
los cambios, los datos pueden necesitar ser descifrado, emigrado, y vuelve a cifrar.
Al subdividir el sistema en más servicios de grano fino, es posible identificar todo un
almacén de datos que pueden ser encriptados al por mayor, pero incluso entonces es
poco probable. LIMIT- ing este cifrado a un conjunto conocido de tablas es un
enfoque sensato.
Descifrar bajo demanda
Cifrar los datos cuando se ve por primera vez. Sólo descifrar en la demanda, y
asegurarse de que los datos nunca se almacena en cualquier lugar.
Las copias de seguridad Cifrar
Las copias de seguridad son buenas. Queremos copia de seguridad de nuestros datos
180 | Capítulo 9: Seguridad
importantes, y casi por definición, los datos nos preocupa lo suficiente acerca de que
queremos cifrar es suficientemente importante como para realizar copias de
seguridad! Por lo que puede parecer un punto obvio, pero tenemos que asegurarnos
de que nuestras copias de seguridad también están cifradas. Esto también significa
que necesitamos saber qué teclas son
Asegurar los datos en reposo
| 181
necesaria para manejar la versión de datos, especialmente si cambian las claves.
Tener clara la gestión de claves se vuelve bastante importante.
Defensa en profundidad
Como he mencionado antes, me gusta poner todos los huevos en una sola canasta. Es
todo acerca de la defensa en profundidad. Hemos hablado ya sobre la seguridad de
los datos en tránsito, y asegurar los datos en reposo. Pero hay otras protecciones que
podría poner en marcha para ayudar?
Los cortafuegos
Tiene uno o más servidores de seguridad es una medida muy sensible a tomar.
Algunos son muy sim- ple, capaces sólo para restringir el acceso a ciertos tipos de
tráfico en algunos puertos. Otros son más sofisticados. ModSecurity, por ejemplo, es
un tipo de firewall de aplicaciones que pueden ayudar a las conexiones de la válvula
reguladora de ciertos rangos de IP y detectar otros tipos de ataques preciosos Malí-.
No hay valor en tener más de un firewall. Por ejemplo, puede decidir utilizar
IPTables localmente en un host para asegurar ese host, la configuración de la entrada
y la salida permitida. Estas reglas pueden ser adaptados a los servicios que se
ejecutan a nivel local, con un servidor de seguridad en el perímetro para controlar el
acceso general.
Inicio sesión
Buen registro, y en concreto la capacidad de agregar registros a partir de múltiples
sistemas, no se trata de la prevención, pero pueden ayudar con la detección y
recuperación de las cosas malas que suceden. Por ejemplo, después de aplicar los
parches de seguridad se puede ver a menudo en los registros si la gente ha estado
explotando ciertas vulnerabilidades. Parches se asegura de que no se HAP pluma de
nuevo, pero si ya ha sucedido, puede que tenga que entrar en modo de recuperación.
Tener registros disponibles le permite ver si algo malo sucedió después de los
hechos.
Sin embargo, observamos que tenemos que tener cuidado con lo que la información
que almacenamos en nuestros registros! información sensible tiene que ser
sacrificadas para garantizar que no tengan fugas de datos importantes en nuestros
registros, lo que podría llegar a ser un gran destino para los atacantes.
Detección de Intrusos (y prevención) Sistema
Intrusión sistemas de detección (IDS) puede supervisar redes o sistemas principales
para el comporta- miento sospechoso, informar de los problemas cuando se los ve.
Los sistemas de prevención de intrusiones (IPS), así como el monitoreo de actividad
sospechosa, puede intervenir para evitar que suceda. A diferencia de un servidor de
182| Capítulo 9: Seguridad
seguridad, que busca principalmente hacia el exterior para evitar que las cosas malas
de entrar, IDS e IPS están buscando activamente dentro del perímetro de un
comportamiento sospechoso. Cuando estás empezando desde cero, IDS puede tener
más sentido. Estos sistemas están basados en la heurística (al igual que muchos
cortafuegos de aplicación), y es posible que el conjunto de partida genérica de reglas
o será demasiado indulgente o no indulgente suficiente para que el comportamiento
de su servicio.
Defensa en profundidad |
183
El uso de un IDS más pasivos para avisarle de problemas es una buena manera de
ajustar sus reglas antes de utilizarlo en una capacidad más activo.
La segregación de la red
Con un sistema monolítico, tenemos límites a cómo podemos estructurar nuestras
redes para proporcionar protecciones adicionales. Con microservicios, sin embargo,
usted puede ponerlos en distintos segmentos de red para controlar mejor cómo los
servicios se comuniquen entre sí. AWS, por ejemplo, proporciona la capacidad de
prestación de forma automática una nube privada virtual (VPC), que permiten a los
anfitriones viven en subredes separadas. A continuación, puede especificar qué VPC
puede verse entre sí mediante la definición de reglas de peering, e incluso enrutar el
tráfico a través de pasarelas de acceso de proxy, que le da, en efecto, varios
perímetros en los que las medidas de seguridad adicionales se pueden poner en su
lugar.
Esto le podría permitir a las redes de segmento basado en la propiedad del equipo, o
tal vez por nivel de riesgo.
Sistema operativo
Nuestros sistemas se basan en una gran cantidad de software que no escribimos, y
pueden tener vulnerabilidades de seguridad que podrían exponer nuestra aplicación,
es decir, nuestros sistemas operativos y las otras herramientas de apoyo que se
ejecutan en ellos. Aquí, consejos básicos puede obtener un largo camino. Comience
con sólo el funcionamiento de los servicios como usuarios de sistemas operativos que
tienen el menor número de permisos como sea posible, para asegurar que si se ve
comprometida tal cuenta que va a hacer el mínimo daño.
A continuación, parchear el software. Regularmente. Esto necesita ser automatizado,
y lo que necesita saber si sus máquinas están fuera de sincronía con los últimos
niveles de parches. Herramientas como SCCM de Micro suave o caminata espacial
de RedHat puede ser beneficioso aquí, ya que pueden ayudar a ver si las máquinas
están al día con los últimos parches e iniciar cambios si es necesario. Si está
utilizando herramientas como Ansible, de marionetas, o el chef, es probable que ya
está bastante contento con empujar a cabo cambios automática-estas herramientas
puede obtener un largo camino también, pero no lo harán todo para usted.
Esto realmente es lo básico, pero es sorprendente la frecuencia con que veo correr
software crítico en los sistemas operativos sin parches, viejos. Puede tener la
seguridad a nivel de aplicación tegido más bien definida y pro en el mundo, pero si
tienes una versión antigua de un servidor web que se ejecuta en el equipo como raíz
que tiene un desbordamiento de búfer vulnerabilidad sin parche, entonces su sistema
todavía podría ser extremadamente vulnerables.
Otra cosa a mirar si está utilizando Linux es la aparición de los módulos de seguridad
para el propio sistema operativo. AppArmour, por ejemplo, le permite definir cómo
184| Capítulo 9: Seguridad
se espera que su aplicación se comporte, con el kernel de mantener un ojo sobre él. Si
comienza a hacer algo que no debe, los pasos del núcleo en. AppArmour ha existido
durante un tiempo, ya que cuenta con SELinux. Aunque técnicamente cualquiera de
ellos debería funcionar en cualquier sistema Linux moderna, en la práctica algunas
distribuciones apoyan uno mejor que el
Defensa en profundidad |
183
otro. AppArmour se utiliza por defecto en Ubuntu y SuSE, por ejemplo, mientras
SELinux tradicionalmente ha sido bien apoyada por RedHat. Una nueva opción es
GrSSecurity, que pretende ser más fácil de usar que sea AppArmour o Grsecurity al
mismo tiempo tratando de ampliar sus capacidades, pero requiere un kernel
personalizado para trabajar. Te sugiero echar un vistazo a los tres para ver cuál se
ajusta mejor a sus casos de uso, pero me gusta la idea de tener otra capa de
protección y prevención en el trabajo.
A Ejemplo resuelto
Tener una arquitectura de sistema de grano más fino nos da mucha más libertad en la
forma en que implementamos nuestra seguridad. Para aquellas partes que tienen que
ver con la información más sensible o exponen las capacidades más valiosas,
podemos adoptar las disposi- ciones más estrictas de seguridad. Sin embargo, para
otras partes del sistema, podemos darnos el lujo de ser mucho más laxos en lo que
nos preocupa.
Vamos MusicCorp considerar una vez más, y tirar de algunos de los conceptos
anteriores juntos para ver dónde y cómo se puede utilizar algunas de estas técnicas de
seguridad. Estamos buscando principalmente a las preocupaciones de seguridad de
los datos en tránsito y en reposo.Figura 9-4 muestra un subconjunto de todo el
sistema que vamos a estar analizando, que en la actualidad muestra una falta de
consideración de trituración por motivos de seguridad. Todo se envía a través de
HTTP plano de edad.
Figura 9-4. Un subconjunto de la arquitectura lamentablemente insegura de
MusicCorp
Aquí tenemos los navegadores web estándar que son utilizados por nuestros clientes
para hacer compras en el sitio. También se introduce el concepto de una puerta de
entrada libre de terceros: hemos comenzado a trabajar con una compañía de terceros
que se encargará de los pagos de regalías para nuestro nuevo servicio de streaming.
186| Capítulo 9: Seguridad
Nos contactos de vez en cuando para tirar hacia abajo registros de lo que la música se
ha transmitido al-información que protegemos celosamente como nos preocupa
compe- tencia de las compañías rivales. Por último, exponemos nuestros datos del
catálogo a otros terceros par- vínculos, por ejemplo, permitiendo que los metadatos
acerca artista o canción que se incrusta en
Defensa en profundidad |
183
sitios de la revisión de la música. Dentro de nuestro perímetro de la red, tenemos
algunos servi- cios colaboradoras, que sólo alguna vez se utilizan internamente.
Para el navegador, vamos a utilizar una mezcla de tráfico HTTP estándar para el
contenido no seguro, para permitir que se almacene en caché. Por seguro, que ha
iniciado sesión en las páginas, todo el contenido seguro se enviará a través de
HTTPS, dando a nuestros clientes una protección adicional si están haciendo las
cosas como Run-Ning en redes WiFi públicas.
Cuando se trata del sistema de pago de derechos de terceros, nos preocupa no sólo
sobre la naturaleza de los datos que estamos exponiendo, sino que también trata de
asegurarse de las solicitudes que estamos recibiendo son legítimas. Aquí, insistimos
en que nuestra tercero utiliza certificados de cliente. Todos los datos se envían a
través de un canal seguro, cifrado, el aumento de nuestra capacidad de asegurar que
está pidiendo para estos datos por la persona correcta. Nosotros, por supuesto, tiene
que pensar en lo que sucede cuando los datos sale de nuestro control. Lo hará nuestro
cuidado pareja acerca de los datos tanto como lo hará?
Para los feeds de datos del catálogo, queremos que esta información se comparta lo
más ampliamente posible para permitir a la gente a comprar fácilmente la música de
nosotros! Sin embargo, no queremos que este abuso, y nos gustaría una idea de quién
está utilizando nuestros datos. Aquí, claves de la API tienen perfecto sentido.
En el interior del perímetro de la red, las cosas son un poco más matizada. Lo
preocupados que estamos por la gente comprometer nuestras redes internas?
Idealmente, nos gustaría utilizar HTTPS en un mínimo, pero la gestión de TI es algo
doloroso. Decidimos en vez de poner la obra (en un principio, al menos) en el
endurecimiento de nuestro perímetro de la red, incluyendo el tener un cortafuegos
bien configurado y la selección de un hardware apropiado o software de seguridad
apli- Ance a observar el tráfico malicioso (por ejemplo, el escaneo de puertos o de
denegación de -Servicio de ataques).
Dicho esto, nos preocupa que algunos de nuestros datos y en el que vive. No estamos
wor- Ried acerca del servicio de catálogo; Después de todo, queremos que los datos
compartidos y han proporcionado una API para él! Pero estamos muy preocupados
por los datos de nuestros clientes. Aquí, decidimos para cifrar los datos en poder de
la atención al cliente, y descifrar datos de lectura. Si ers ATTACK- hacen penetrar en
nuestra red, que aún podrían funcionar peticiones contra el cliente ser- API de hielo,
pero la implementación actual no permite la recuperación mayor parte de los datos
del cliente. Si así fuera, tendríamos probablemente considerar el uso de certificados
de cliente a fin de protegerlo contra esta información. Incluso si los atacantes
comprometer la máquina de la base de datos esté en funcionamiento, encendido y se
las arreglan para descargar todo el contenido, que necesitarían acceso a la clave
utilizada para cifrar y descifrar los datos para hacer uso si.
Figura 9-5 Muestra la imagen final. Como se puede ver, las elecciones que hicimos
acerca de lo que la tecnología para su uso se basan en una comprensión de la
Un ejemplo práctico | 185
naturaleza de la información que se fijan. preocupaciones por la seguridad de su
propia arquitectura es probable que sean muy diferentes, y por lo que puede terminar
con una solución de aspecto diferente.
186 | Capítulo 9: Seguridad
Figura 9-5. sistema más seguro de MusicCorp
ser frugal
Dado que el espacio de disco se hace más barata y las capacidades de las bases de
datos a mejorar, la facilidad con que cantidades masivas de información pueden ser
capturadas y almacenadas está mejorando rápidamente. Estos datos son valiosos, no
sólo para las propias empresas, que cada vez ven los datos como un activo valioso,
pero igualmente a los usuarios que valoran su propia intimidad. Los datos que
pertenece a un individuo, o podría ser utilizada para obtener información sobre una
persona, debe ser los datos que estamos máximo cuidado.
Sin embargo, ¿y si hemos hecho nuestras vidas un poco más fácil? ¿Por qué no fregar
mayor cantidad de información posible que puede ser de identificación personal, y
hacerlo tan pronto como sea posible? Al iniciar la sesión una petición de un usuario,
lo que necesitamos para almacenar la dirección IP completa para siempre, o
podríamos sustituir a los últimos dígitos con x? Qué necesitamos para almacenar el
nombre de alguien, la edad, el género, y la fecha de nacimiento con el fin de
proporcionarle ofertas de productos, o es su rango de edad y el código postal
suficiente información?
Las ventajas aquí son múltiples. En primer lugar, si no lo almacena, nadie puede
robarlo. Segundo, si no lo almacena, nadie (por ejemplo, una agencia gubernamental)
puede pedir que sea!
La frase en alemán Datensparsamkeit representa este concepto. Derivados de la
legislación hombre privacidad germanio, que encapsula el concepto de sólo el
Un ejemplo práctico | 185
almacenamiento de informa- ción tanto como sea absolutamente necesario para
cumplir con las operaciones de negocios o satisfacer las leyes locales.
186 | Capítulo 9: Seguridad
Esto es, obviamente, en la tensión directa con el movimiento hacia almacenar cada
vez más información, pero es un comienzo para darse cuenta de que aún existe esta
tensión!
El factor humano
Gran parte de lo que hemos tratado aquí es lo básico de la forma de aplicar
salvaguardias tecnológicas para proteger sus sistemas y datos de los atacantes
externos y malintencionados. SIN EMBARGO, es posible que tenga procesos y
políticas para hacer frente a la ele- mento humano en su organización. ¿Cómo se
revoca el acceso a las credenciales cuando alguien deja la organización? ¿Cómo
puede protegerse contra la ingeniería social? Como un buen ejercicio mental, tenga
en cuenta el daño que un ex empleado descontento podría hacer para sus sistemas si
ella quería. Ponerse en la mentalidad de un usuario malintencionado es a menudo una
buena manera de razonar acerca de las protecciones que usted pueda necesitar, y
algunas partes maliciosos tener tanta información privilegiada como empleado
reciente!
La regla de oro
Si no hay nada más que se lleva de este capítulo, que sea esto: no escriba su propia
criptografía. No invente sus propios protocolos de seguridad. A menos que seas un
experto en criptografía con años de experiencia, si se intenta inventar su propia
codificación o elaborado protecciones criptográficas, usted se equivoca. E incluso si
usted es un experto en criptografía, es posible que aún se equivocan.
Muchos de las herramientas anteriormente descritas, como AES, son tecnologías de
la industria endurecido cuyos algoritmos subyacentes han sido revisados por pares, y
cuyo software Implementation ha sido rigurosamente probado y parcheado lo largo
de muchos años. Son lo suficientemente bueno! Reinventar la rueda en muchos casos
es a menudo sólo una pérdida de tiempo, pero cuando se trata de seguridad que puede
ser francamente peligroso.
En bicarbonato de Seguridad
Al igual que con las pruebas funcionales automatizadas, no queremos la seguridad de
dejarse a un conjunto dife- rentes de las personas, ni queremos dejar todo para el
último minuto. Ayudar a los desarrolladores cate edu- sobre las preocupaciones de
seguridad es clave, ya aumentar la concienciación general de todos los problemas de
seguridad puede ayudar a reducir en el primer lugar. Hacer que la gente
familiarizados con la lista de lista y se Framework de Pruebas de Seguridad de
OWASP puede ser un gran lugar para comenzar. Especialistas absolutamente tienen
su lugar, sin embargo, y si tiene acceso a ellos, los utilizan para ayudarle.
Hay herramientas automatizadas que pueden sondear nuestros sistemas de
El factor humano | 187
vulnerabilidades, como mediante la búsqueda de los ataques de cross-site scripting.
El Ataque Zed Proxy (también conocido como ZAP) es un buen ejemplo. Informada
por el trabajo de OWASP, ZAP intenta recrear ataques maliciosos en su sitio web.
Existen otras herramientas que el uso de análisis estático para buscar común
188 | Capítulo 9: Seguridad
errores de codificación que pueden abrir agujeros de seguridad, tales como
Guardafrenos para Ruby. Cuando estas herramientas se pueden integrar fácilmente en
CI normal, construye, integrarlos en sus registros de entrada estándar. Otros tipos de
pruebas automatizadas están más involucrados. Por ejemplo, usando algo como
Nessus para escanear en busca de vulnerabilidades es un poco más complicado y
puede requerir un ser humano para interpretar los resultados. Dicho esto, estas
pruebas siguen automata- ble, y puede tener sentido para funcionar con el mismo tipo
de cadencia como pruebas de carga.
microsoft de Ciclo de Vida de Desarrollo de Seguridad También tiene algunos buenos
modelos de cómo los equipos de ery deliv- pueden hornear de seguridad. Algunos
aspectos de la misma se sienten excesivamente cascada, pero echar un vistazo y ver
qué aspectos se pueden encajar en su flujo de trabajo actual.
Verificación externa
Con seguridad, creo que hay un gran valor en tener una evaluación externa realizada.
Los ejercicios como pruebas de penetración, cuando es realizada por un tercero,
realmente hacen intentos del mundo real imitan. También eludir la cuestión de que
los equipos no siempre son capaces de ver los errores que han cometido ellos
mismos, ya que son demasiado cerca del problema. Si usted es una empresa lo
suficientemente grande, es posible que tenga un equipo infosec dedicada que puede
ayudarle. Si no es así, encontrar una parte externa que pueda hacerlo. Llegar a ellos
temprano, entienden cómo les gusta trabajar, y averiguar cuánto tiempo de aviso que
necesitan para hacer una prueba.
Usted también debe tener en cuenta la cantidad de verificación que necesite antes de
cada lanzamiento. En general, hacer una prueba de penetración completa, por
ejemplo, no es necesario para los pequeños comunicados Tal incremen-, pero puede
ser para los cambios más grandes. Lo que se necesita depende de su propio perfil de
riesgo.
Resumen
Así que de nuevo volvemos a un tema central del libro-que tener un sistema
descompuesto en los servicios de grano más fino nos da muchas más opciones en
cuanto a la forma de resolver un problema. No sólo se tienen microservicios
potencialmente reducir el impacto de cualquier incumplimiento dado, sino que
también nos da más capacidad de operar fuera de la sobrecarga de los enfoques más
complejos y seguros donde los datos son sensibles, y un enfoque más ligero cuando
los riesgos son más bajos.
Una vez que entienda los niveles de amenaza de las diferentes partes de su sistema,
usted debe comenzar a tener una idea de cuándo considerar la seguridad durante el
transporte, en reposo, o nada en absoluto.
El factor humano | 187
Por último, comprender la importancia de la defensa en profundidad, asegúrese de
aplicar un parche sus sistemas operativos, e incluso si usted se considera una estrella
de rock, no trate de las aplicará su propia criptografía!
Si desea una descripción general de seguridad para las aplicaciones basadas en el
navegador, un gran lugar para comenzar es la excelente Abrir Web Application
Security Project (OWASP) no lucro, Cuyo documento se actualiza regularmente para
los principales riesgos de seguridad 10 se debe considerar
188 | Capítulo 9: Seguridad
una lectura esencial para cualquier desarrollador. Por último, si quieres una discusión
más general de la criptografía, echa un vistazo al libro Criptografía Ingeniería de
Niels Ferguson, Bruce Schneier, y Tadayoshi Kohno (Wiley).
Tener el control de la seguridad es a menudo acerca de la comprensión de la gente y
cómo trabajan con nuestros sistemas. Uno de los aspectos relacionados con los
humanos aún no hemos discutido en términos de microservicios es la interacción
entre las estructuras organizativas y las propias arquitecturas. Pero como con la
seguridad, vamos a ver que haciendo caso omiso del elemento humano puede un
grave error.
resumen | 189
CAPÍTULO 10
Conway La ley y el sistema de
diseño
Gran parte del libro hasta ahora se ha centrado en los desafíos técnicos en el avance
hacia una arquitectura de grano fino. Pero hay otras cuestiones de organización, a
considerar también. Como vamos a aprender en este capítulo, se ignora el
organigrama de su empresa a su propio riesgo!
Nuestra industria es joven, y parece estar constantemente reinventándose a sí misma.
Y sin embargo, algunas leyes fundamentales han resistido la prueba del tiempo. La
ley de Moore, por ejemplo, que establece que la densidad de transistores en circuitos
integrados se duplica cada dos años, ha demostrado ser sorprendentemente precisa
(aunque algunas personas predicen que esta tendencia ya se está desacelerando). Una
ley que he encontrado para ser casi universalmente cierto, y mucho más útil en mi
trabajo del día a día, es la ley de Conway.
El artículo de Melvin Conway Cómo Inventar Comités Do, publicado en revista
Datamation Maga- en abril de 1968, observó que:
Cualquier organización que diseña un sistema (que se define más ampliamente aquí
que los sistemas de informa- ción sólo) inevitablemente producir un diseño cuya
estructura es una copia de la estructura de comunicación de la organización.
Esta declaración es citado a menudo, en diversas formas, como la ley de Conway.
Eric S. Raymond resume este fenómeno en el diccionario The New Hacker (MIT
Press) diciendo “Si tiene cuatro grupos de trabajo sobre un compilador, podrás
conseguir un compilador de 4 pasadas.”
Evidencia
La historia cuenta que cuando Melvin Conway presentó su documento sobre este
tema para la Harvard Business Review, la rechazaron, alegando que no había
probado su tesis. He visto esta teoría confirmada en muchas situaciones diferentes
191
que lo he aceptado como verdadero. Pero usted no tiene que tomar mi palabra para
ella: desde la presentación original del Conway, una gran cantidad de
192 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
Se ha trabajado en esta área. Un número de estudios se han llevado a cabo para
explorar la interrelación de la estructura organizativa y de los sistemas que crean.
Organizaciones sueltos y de estructura rígida
En la exploración de la dualidad entre el producto y la organización Arquitecturas
(Harvard Business School), los autores Alan MacCormack, John Rusnak, y Carliss
Baldwin vistazo a una serie de diferentes sistemas de software, vagamente
categorizados como un ser creado ya sea por organizaciones débilmente acoplados u
organizaciones fuertemente acoplados. Para las organizaciones fuertemente
acoplados, piense empresas de productos comerciales que se suelen colocarse con
visiones y objetivos fuertemente alineados, mientras que las organizaciones
débilmente acoplados son bien representada por las comunidades de código abierto
distribuido.
En su estudio, en el que coincidían pares de productos similares de cada tipo de
organización, los autores encontraron que las organizaciones acoplada de manera
más flexible en realidad crearon sistemas modulares más, menos acoplados, mientras
que el software de la organización más fuerte orientación era menos modular.
Windows Vista
Microsoft llevó a cabo Un Estudio Empírico donde se examinó la forma en su propia
estructura organizativa afectada la calidad del software de un producto específico,
Windows Vista. En concreto, los investigadores analizaron varios factores para
determinar qué tan propenso a errores de un componente en el sistema sería ser.1
Después de mirar varias métricas, incluidas las métricas de calidad de software de
uso común como la complejidad del código, se encontraron con que las métricas
asociadas con las estructuras organizativas demostraron ser las medidas más
relevantes estadísticamente.
Así que aquí tenemos otro ejemplo de la estructura organizativa que afecta la
naturaleza del sistema que crea la organización.
Netflix y Amazon
Es probable que los dos niños del cartel de la idea de que las organizaciones y la
arquitectura deben estar alineados son Amazon y Netflix. Desde el principio,
Amazon comenzó a entender los beneficios de equipos con todo el ciclo de vida de
los sistemas que gestionan. Se quería equipos para poseer y operar los sistemas que
parecían después, la gestión de todo el ciclo de vida. Sin embargo, Amazon también
sabía que los equipos pequeños pueden trabajar más rápido que los equipos grandes.
Esto llevó famoso a sus equipos de dos pizzas, donde ningún equipo debe ser tan
grande que no podía ser alimentado con dos pizzas. Este controlador para pequeños
equipos con todo el ciclo de vida de
191
1 Y todos sabemos que Windows Vista fue muy propenso a errores!
192 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
sus servicios es una razón importante por Amazon desarrolló Amazon Web Services.
Es necesario crear las herramientas para permitir que sus equipos sean
autosuficientes.
Netflix aprender de este ejemplo, y aseguró que desde el principio se estructuró en
torno a equipos pequeños e independientes, por lo que los servicios que crearon
también serían independientes entre sí. Esto aseguró que la arquitectura del sistema
se ha optimizado para la velocidad de cambio. Efectivamente, Netflix diseñó la
estruc- tura organizativa de la arquitectura del sistema que quería.
¿Qué podemos hacer con esto?
Así que la evidencia anecdótica y empírica, apunta a nuestra estructura organizativa
siendo una fuerte influencia en la naturaleza (y calidad) de los sistemas que
proporcionamos. Entonces, ¿cómo esta comprensión nos ayuda? Veamos algunas
situaciones organizativas diferentes y comprender el impacto que cada uno puede
tener en nuestro diseño del sistema.
La adaptación a las rutas de comunicación
Consideremos primero un simple solo equipo,. Es responsable de todos los aspectos
del diseño y la implementación del sistema. Puede tener, la comunicación de grano
fino frecuente. Ima- INE que este equipo está a cargo de un único servicio, por
ejemplo, servicio de catálogo de nuestra tienda de música. Consideremos ahora el
interior de un servicio: un montón de llamadas de método o función de grano fino.
Como hemos dicho antes, nuestro objetivo es asegurar que nuestros servicios se
descomponen de manera que el ritmo de cambio dentro de un servicio es mucho más
alto que el ritmo de cambio entre los servicios. Esto solo equipo, con su capacidad
para la comunicación de grano fino, coincide muy bien con las vías de comunicación
del código dentro del servicio.
Esto solo equipo le resulta fácil de comunicar acerca de los cambios propuestos y los
Ings refactor-, y por lo general tiene un buen sentido de la propiedad.
Ahora imaginemos un escenario diferente. En lugar de un solo equipo,
geolocalizados ser dueño de nuestro servicio de catálogo, supongamos que los
equipos en el Reino Unido y la India están involucrados activamente en el cambio de
una propiedad conjunta con el servicio de manera efectiva del servicio. límites de la
zona geográfica y el tiempo aquí hacen que la comunicación de grano fino entre esos
equipos difícil. En su lugar, se basan en una comunicación más grano grueso a través
de videoconferencia y correo electrónico. ¿Qué tan fácil es para un miembro del
equipo en el Reino Unido para hacer un PLE sim- refactorización con confianza? El
costo de las comunicaciones en un equipo buido geográficamente dis- es mayor, y
por lo tanto el costo de los cambios de coordinación es mayor.
Cuando el costo de la coordinación de cambio aumenta, una de dos cosas sucederá.
¿Qué podemos hacer con esto? |
193
Cualquiera de las personas a encontrar maneras de reducir los costes de coordinación
/ comunicación, o que dejan de cambios de ING MAK-. Este último es exactamente
cómo nos encontramos con grandes, difíciles de mantener bases de código.
194 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
Recuerdo un proyecto de cliente que trabajé en los que la propiedad de un único
servicio se comparte entre dos ubicaciones geográficas. Con el tiempo, cada sitio
comienza a especializarse qué tipo de trabajo que maneja. Esto le permitió tomar
posesión de parte de la base de código, dentro de la cual podría tener un costo más
fácil del cambio. Los equipos tuvieron entonces la comunicación de grano más
coarse- sobre cómo interrelacionan las dos partes; efectivamente, las vías de comunicación hecho posible dentro de la estructura organizativa se correspondía con el
API de grano grueso que se formó el límite entre las dos mitades de la base de
código.
Entonces, ¿dónde nos deja esto al considerar la evolución de nuestro propio diseño
de servicios? Bueno, yo sugeriría que las fronteras geográficas entre las personas
involucradas con el desarrollo de un sistema pueden ser una gran manera de conducir
cuando los servicios se deben plantear, descomposición, y que, en general, usted
debe buscar para asignar la propiedad de un servicio a un sin- gle, equipo que puede
mantener el coste del cambio bajo colocated.
Tal vez su organización decide que quiere aumentar el número de personas que
trabajan en su proyecto mediante la apertura de una oficina en otro país. En este
punto, pensar activamente sobre qué partes de su sistema se pueden mover más. Tal
vez esto es lo que impulsa sus decisiones acerca de lo que las costuras de dividir el
próximo.
Eso Es también digno de mención en este punto que, al menos sobre la base de las
observaciones de los autores de la exploración de la dualidad entre el producto y la
organización Arquitecturas informe que se menciona anteriormente, si la
organización de la construcción del sistema se acopla de manera más flexible (por
ejemplo, que consiste en equipos distribuidos geográficamente ), los sistemas se
construyen tienden hacia el más modular, y por lo tanto es de esperar menos
acoplados. La tendencia de un solo equipo que posee muchos servicios a inclinarse
hacia una integración más estrecha es muy difícil de mantener en una organización
más distribuida.
Propietario de servicio
¿Qué quiero decir por la propiedad de servicio? En general, esto significa que el
equipo de ser dueño de un servicio se encarga de hacer cambios a ese servicio. El
equipo debe sentirse libre para reestructurar el código sin embargo, quiere, siempre y
cuando que el cambio no se rompe servicios de ING consum-. Para muchos equipos,
la propiedad se extiende a todos los aspectos del servicio, a partir de necesidades de
abastecimiento a la construcción, implementación y mantenimiento de la aplicación.
Este modelo es especialmente frecuente con microservicios, donde es más fácil para
un pequeño equipo de poseer un pequeño servicio. Este aumento de nivel de
propiedad conduce a una mayor autonomía y velocidad de entrega. Tener un equipo
responsable de la implementación y el mantenimiento de la aplicación significa que
tiene un incentivo para crear servicios que son fáciles de implementar; es decir,
¿Qué podemos hacer con esto? |
193
Este modelo es sin duda uno estoy a favor. Empuja las decisiones a las personas más
capaces de hacerlos, dando al equipo tanto en potencia y autonomía, sino también por
lo que es
194 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
cuentas de su trabajo. He visto demasiados desarrolladores entregan su sistema a
través de fases de prueba o de despliegue y piensan que su trabajo se realiza en ese
punto.
Controladores para servicios compartidos
He visto a muchos equipos adoptan un modelo de propiedad de servicios
compartidos. Me parece que este enfoque subóptimo, por las razones ya discutidas.
Sin embargo, los conductores que hacen que las personas a elegir los servicios
compartidos son importantes para entender, especialmente en lo que puede ser capaz
de encontrar algunos modelos alternativos convincentes que puedan abordar las
preocupaciones subyacentes de las personas.
Demasiado duro a Split
Obviamente, una de las razones por las que puede encontrarse con un único servicio
propiedad de más de un equipo es que el costo de dividir el servicio es demasiado
alta, o tal vez su organización podría no ver el punto de la misma. Esto es una
ocurrencia común con grandes sistemas monolíticos. Si este es el principal desafío
que se presente, entonces espero que algunos de los consejos dados enCapítulo 5 será
de utilidad. También podría considerar la fusión de los equipos juntos, para alinear
más estrechamente con la propia arquitectura.
equipos de características
La idea de los equipos de características (también conocidos como equipos basados
en características) es que un pequeño equipo impulsa el desarrollo de un conjunto de
características, implementar toda la funcionalidad requerida incluso si se corta a
través de componente (o incluso servicio) límites. Los objetivos de los equipos de
características son lo suficientemente sensible. Esta estructura permite al equipo
mantener un enfoque en el resultado final y asegura que el trabajo se unió, evitando
algunos de los desafíos de tratar de coordinar los cambios a través de múltiples
equipos diferentes.
En muchas situaciones, el equipo de trabajo es una reacción a las organizaciones de
TI tradicionales, donde la estructura del equipo está alineado alrededor de los límites
técnicos. Por ejemplo, es posible que tenga un equipo que se encarga de la interfaz de
usuario, otro que se encarga de la lógica de apli- cación, y una tercera manejo de la
base de datos. En este entorno, un equipo de la característica es un paso significativo,
ya que funciona a través de todas estas capas para ofrecer la funcionalidad.
Con adopción por mayor de equipos de características, todos los servicios se pueden
considerar compartida. Todo el mundo puede cambiar cada servicio, cada pieza de
código. El papel de los servicios dians custo- aquí se hace mucho más compleja, si la
función existe en absoluto. Desafortunadamente, rara vez ver que funciona custodios
en absoluto en el que se adoptó este patrón, lo que lleva a los tipos de cuestiones que
discutimos anteriormente.
Pero vamos a volver a considerar lo microservicios son: Servicios de modelo de un
dominio de negocio, no técnico. Y si nuestro equipo que posee un determinado
servicio está alineado de manera similar a lo largo del dominio de negocio, es mucho
más probable que el equipo será capaz de mantener un enfoque en el cliente, y ver
más de la característica desarrollada a través, porque
Controladores para servicios compartidos | 195
194 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
tiene una comprensión holística y la propiedad de toda la tecnología asociada a un
servicio.
cambios transversales pueden ocurrir, por supuesto, pero su probabilidad se reduce
significativamente por nuestros equipos de tecnología orientada a evitar.
en la entrega
Una de las razones clave de la gente se mueve hacia los servicios compartidos es
evitar en la entrega. ¿Qué pasa si hay una gran acumulación de cambios que deben
hacerse en un mismo servicio? Imaginemos que estamos desplegando la capacidad de
un cliente para ver el género de una pista a través de nuestros productos, así como la
adición de marca aa nuevo tipo de stock: virtuales musi- cal tonos de llamada para el
teléfono móvil. El equipo del sitio web tiene que realizar un cambio en superfi- cie la
información de género, con el equipo de trabajo de aplicaciones móviles para
permitir a los usuarios navegar, previsualizar y comprar los tonos de llamada. Ambos
cambios deben hacerse al servicio de catálogo, pero desafortunadamente la mitad del
equipo está fuera de la gripe, y la otra mitad se ha quedado atascado el diagnóstico de
un fallo de producción.
Tenemos un par de opciones que no implican servicios compartidos para evitar esta
situación. La primera es simplemente esperar. Los equipos de sitios web y
aplicaciones móviles pasan a algu- cosa. En función de la importancia de la función
es, o cuánto tiempo es probable que sea el retraso, esto puede estar bien o puede ser
un problema importante.
En su lugar podría agregar personas al equipo de catálogo para ayudarles a moverse a
través de su trabajo más rápido. Cuanto más estandarizado la tecnología de pila y
modismos de programación en uso a través de su sistema, más fácil es para otras
personas para hacer cambios en sus servi- cios. La otra cara, por supuesto, como
hemos comentado anteriormente, es que la normalización tiende a reducir la
capacidad de un equipo para adoptar la solución adecuada para el trabajo, y puede
dar lugar a diferentes tipos de ineficiencias. Si el equipo está en el otro lado del
planeta, esto podría ser imposible, sin embargo.
Otra opción podría ser la de dividir el catálogo en un catálogo general de música
independiente y un catálogo de tono. Si el cambio que se realizan para apoyar tonos
es bastante pequeño, y la probabilidad de que esto sea un área en la que vamos a
desarrollar en gran medida en el futuro también es bastante baja, esto bien puede ser
prematuro. Por otro lado, si hay 10 semanas de características relacionadas con
Tono-apilados, dividiendo a cabo el servicio podría tener sentido, con el equipo
móvil de la toma de posesión.
Hay otro modelo que podría funcionar bien para nosotros, sin embargo.
Interna Open Source
196| Capítulo 10: Conway de Derecho y Diseño de
Sistemas
¿Y qué si hemos intentado con todas nuestras fuerzas, pero simplemente no puede
encontrar un camino más allá de tener unos servicios compartidos? En este punto,
adecuadamente abrazar el modelo de código abierto interno puede hacer mucho
sentido.
Abrir interna Fuente | 197
Con de código abierto normal, un pequeño grupo de personas se consideran
committers centrales. Son los guardianes del código. Si quieres un cambio a un
proyecto de código abierto, o bien pedir a uno de los committers para hacer el
cambio para usted, o bien realizar el cambio a ti mismo y les envía una solicitud de
extracción. Los committers núcleo son todavía a cargo de la base de código; ellos son
los dueños.
Dentro de la organización, este patrón puede funcionar bien también. Tal vez las
personas que trabajaron en el servicio originalmente ya no están en un equipo en
conjunto; quizá ahora están dispersos en toda la organización. Bueno, si todavía
tienen permiso de commit, puede encontrarlos y pedir su ayuda, tal vez
emparejamiento con ellos, o si usted tiene la herramienta correcta usted puede enviar
una solicitud de extracción.
Papel de los Custodios
Nosotros Todavía queremos que nuestros servicios sean sensibles. Queremos que el
código sea de buena calidad, y el servicio en sí para exhibir algún tipo de
consistencia en la forma en que está organizado. También queremos para asegurarse
de que los cambios se hacen ahora no realizar futuros cambios planeado mucho más
difícil de lo que necesitan ser. Esto significa que tenemos que adoptar los mismos
patrones utilizados en la normalidad de código abierto también internamente, lo que
significa la separación de un grupo de committers confianza (el equipo central), y
committers no son de confianza (gente de un lado OUT- el equipo de la presentación
de los cambios).
El núcleo del equipo tiene que tener algún medio para controlar y aprobar los
cambios. Tiene que asegurarse de que los cambios son consistentes idiomático, es
decir, que sigan las directrices de codificación generales del resto de la base de
código. Las personas que realizan la investigación de antecedentes, por lo tanto se
van a tener que pasar tiempo trabajando con los peticionarios para asegurarse de que
el cambio sea de suficiente calidad.
Buenos porteros ponen mucho trabajo en esto, la comunicación clara con los tros
submit- y fomentar el buen comportamiento. Malos porteros pueden utilizar esto
como una excusa para ejercer poder sobre otros o tener guerras religiosas sobre las
decisiones técnicas arbitrarias. Después de haber visto los dos conjuntos de
comportamiento, te puedo decir una cosa está clara: en cualquier caso se necesita
tiempo. Al considerar lo que permite committers no confiables para enviar los
cambios a la base de código, usted tiene que decidir si la sobrecarga de ser un
guardián vale la pena el trou- ble: el equipo central podría estar haciendo mejor las
cosas con el tiempo que pasa parches de investigación y evaluación?
Madurez
El menos estable o madurar un servicio es, más difícil será para permitir que la gente
198| Capítulo 10: Conway de Derecho y Diseño de
Sistemas
fuera del equipo central para enviar parches. Antes de que el lomo de la llave de un
servicio está en su lugar, el equipo no puede saber qué se parecen las buenas, y por lo
tanto pueden tener dificultades para saber lo que una buena presentación se parece.
Durante esta etapa, el servicio en sí está experimentando un alto grado de cambio.
Abrir interna Fuente | 197
La mayoría de los proyectos de código abierto tienden a no tener presentaciones de
un grupo más amplio de committers no son de confianza hasta que se haga el núcleo
de la primera versión. Siguiendo un modelo similar para sus propias organizaciones
tiene sentido. Si un servicio es bastante madura, y rara vez se cambia, por ejemplo,
nuestro servicio, entonces tal vez que la compra es el momento de abrirlo para otras
contribuciones.
Estampación
A mejor soporte de un modelo de código abierto interno, usted necesitará un poco de
herramientas en su lugar. El uso de una herramienta de control de versiones
distribuido con la capacidad de las personas pueden presentar solicitudes de
extracción (o algo similar) es importante. Dependiendo del tamaño de la organización, es posible que tenga herramientas para permitir una discusión y la evolución de
las solicitudes de parche; esto puede o no quiere decir un sistema de revisión de
código en toda regla, pero la capacidad de los comentarios en línea sobre los parches
es muy útil. Por último, tendrá que hacer que sea muy fácil para un confirmador para
construir y desplegar su software, y hacer que esté disponible para otros.
Generalmente, esto implica tener tuberías de construcción y despliegue bien
definidos y repositorios de artefactos tralized cen-.
Los contextos y estructuras de equipo acotada
Como se mencionó antes, miramos a sacar nuestras fronteras de servicios de todo
contextos delimitadas. Por lo tanto, se deduce que nos gustaría que nuestros equipos
alineados a lo largo contextos delimitadas también. Esto tiene múltiples ventajas. En
primer lugar, un equipo será más fácil de comprender conceptos de dominio dentro
de un contexto limitado, ya que están relacionadas entre sí. En segundo lugar, los
servicios dentro de un contexto acotado son más propensos a ser servicios que se
comunican entre sí, haciendo el diseño del sistema y liberar la coordinación más
fácil. Por último, en cuanto a la forma en que el equipo de entrega interactúa con los
accionistas de la empresa, se hace más fácil para el equipo para crear buenas
relaciones con los uno o dos expertos en la materia.
El Servicio huérfano?
Entonces, ¿qué acerca de los servicios que ya no están siendo mantenido
activamente? A medida que avanzamos hacia arquitecturas de grano más fino, los
servicios mismos se hacen más pequeños. Una de las metas de los servicios más
pequeños, como hemos discutido, es el hecho de que son más simples. los servicios
más simples con menos funcionalidad que no sea necesario cambiar por un tiempo.
Considere el servicio de carro humilde, que proporciona algunas capacidades
bastante modestas: Añadir a la cesta, Sacar de la cesta, y así sucesivamente. Es
perfectamente concebible que este servicio puede no tener que cambiar durante
meses tras haber sido escrita, incluso si el desarrollo activo está todavía en curso.
200| Capítulo 10: Conway de Derecho y Diseño de
Sistemas
¿Qué pasa aquí? Quien es este servicio?
Abrir interna Fuente | 197
Si sus estructuras de equipo están alineados a lo largo de los contextos acotado de su
organización, incluso los servicios que no se cambian con frecuencia todavía tienen
un dueño de facto. Imagínese un equipo que está alineado con el contexto web de
venta al consumidor. Podría manejar los servicios del sitio, la compra y la
Recomendación en web. Incluso si el servicio de carro no se ha cambiado en meses,
que sería, naturalmente, caer a este equipo para realizar el cambio. Uno de los
beneficios de microservicios, por supuesto, es que si el equipo tiene que cambiar el
servicio para añadir una nueva característica y lo encuentra a su gusto, la reescritura
no debería tomar mucho tiempo en absoluto.
Dicho esto, si usted ha adoptado un enfoque verdaderamente políglota, haciendo uso
de múltiples pilas logía gías, entonces los retos de hacer cambios en un servicio de
huérfanos podrían agravarse si su equipo no sabe la pila de tecnología por más
tiempo.
Estudio de caso: RealEstate.com.au
REA de negocio principal son los bienes raíces. Pero esto abarca múltiples facetas
diferentes, cada uno de los cuales funciona como una sola línea de negocio (LOB).
Por ejemplo, una línea de negocio se ocupa de la propiedad residencial en Australia,
otro comercial, mientras que otro puede referirse a uno de los negocios en el
extranjero de la REA. Estas líneas de negocio ya lo tienen equipos de entrega (o
escuadrones) asociados con ellos; algunos pueden tener sólo un único equipo,
mientras que el mayor tiene cuatro. Así que para la propiedad residencial, hay varios
equipos que participan en la creación de la página web y la lista de servicios para
permitir a la gente a navegar por la propiedad. Las personas rotan entre estos equipos
de vez en cuando, pero tienden a permanecer dentro de esa línea de negocio durante
largos períodos de tiempo, asegurando que los miembros del equipo pueden construir
una fuerte conciencia de que parte del dominio.
Se espera que cada equipo dentro de una línea de negocio de poseer todo el ciclo de
vida de los servi- cios que crea, incluyendo la construcción, pruebas y liberación,
apoyo, e incluso misionar descomposición. Un equipo central proporciona servicios
de entrega de asesoramiento y orientación a estos equipos, así como herramientas
para ayudar a hacer el trabajo. Una fuerte cultura de la automatización es clave, y
REA hace uso intensivo de AWS como una parte clave de permitir a los equipos a
ser más autónomo.Figura 10-1 ilustra cómo funciona todo esto.
Estudio de caso: RealEstate.com.au |
199
Figura 10-1. Una visión general de la estructura organizativa y el equipo de
Realestate.com.au, y la alineación con la arquitectura
No es sólo la organización de prestación que está alineado con el funcionamiento del
negocio. Se extiende a la arquitectura también. Un ejemplo de esto es métodos de
integración. Dentro de un LOB, todos los servicios son gratuitos para hablar unos con
otros en cualquier forma que estimen conveniente, por decisión de los escuadrones
que actúan como sus guardianes. Sin embargo, entre los LOB, toda la comunicación
tiene el mandato de ser lotes asincrónico, una de las pocas reglas de hierro fundido de
lo muy pequeño equipo de arquitectura. Esta comunicación de grano grueso coincide
con la comunicación de grano grueso que existe entre las diferentes partes de la
empresa también. Por ing insistir- con que sea por lotes, cada LOB tiene una gran
cantidad de libertad en la forma en que actúa y gestiona sí. Podría darse el lujo de
tener sus servicios hacia abajo cada vez que quería,
Esta estructura ha permitido una autonomía significativa no sólo de los equipos, sino
también a las diferentes partes de la empresa. A partir de un puñado de servicios de
hace unos años, ahora tiene cientos REA, con más servicios que las personas, y está
creciendo a un ritmo rápido. La capacidad de entregar cambio ha ayudado a la
compañía a alcanzar un éxito significativo en el mercado local hasta el punto en que
se está expandiendo en el extranjero. Y, lo más alentador de todo, de hablar con la
gente de allí me da la impresión de que tanto la arquitectura y la estructura de la
organización tal y como están ahora son sólo la última iteración en lugar del destino.
Me atrevería a decir que en otros cinco años REA será muy diferente de nuevo.
Aquellas organizaciones que son lo suficientemente adaptable para cambiar no sólo
su sistema de arqui- tectura, sino también su estructura organizativa puede producir
200 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
enormes beneficios en términos de
Estudio de caso: RealEstate.com.au |
199
mejora de la autonomía de los equipos y el tiempo de lanzamiento al mercado de
nuevas características y funcio- nalidad. REA es sólo uno de una serie de
organizaciones que se están dando cuenta de que la arquitectura del sistema no existe
en un vacío.
Ley de Conway en reversa
Hasta ahora, hemos hablado sobre cómo los impactos de la organización del diseño
del sistema. Pero ¿qué pasa con la inversa? Es decir, se puede cambiar un diseño de
sistema de la organización? Aunque no he sido capaz de encontrar la misma calidad
de evidencia para apoyar la idea de que la ley de Con- forma en que funciona a la
inversa, lo he visto de manera anecdótica.
Probablemente el mejor ejemplo era un cliente que trabajé hace muchos años. De
vuelta en los días en que la web era bastante incipiente, y la Internet se ve como algo
que llegó en un disquete de AOL a través de la puerta, esta empresa era una empresa
de impresión de gran tamaño que tenía una pequeña, modesta página web. Tenía un
sitio web, ya que era lo que hacer, pero en el gran esquema de las cosas que era de
poca importancia a cómo opera el negocio. Cuando se creó el sistema original, por
decisión técnica bastante arbitraria se hizo en cuanto a cómo funcionaría el sistema.
El contenido de este sistema era originario de múltiples maneras, pero la mayor parte
provino de terceros que fueron la colocación de anuncios para ser vistos por el
público en general. Había un sistema de entrada que permitió que el contenido sea
creado por los terceros pagadores, un sistema central que se llevó a que los datos y se
enriquece de varias maneras, y un sistema de salida que creó el sitio web final que el
público en general podría navegar.
Si las decisiones de diseño originales estaban en lo correcto en el momento es una
conversación para los historia- dores, pero muchos años en la compañía había
cambiado un poco y yo y muchos de mis colegas estaban comenzando a preguntarse
si el diseño del sistema era apto para el presente de la empresa estado. Su negocio de
la impresión física había disminuido significativamente, y los nues reve- y por lo
tanto las operaciones de negocio de la organización ahora se dominada por su
presencia en línea.
Lo que vimos en ese momento era una organización estrechamente alineado a este
sis- tema de tres partes. Tres canales o divisiones en el lado de IT de la empresa
alineados con cada una de las partes de entrada, de núcleo, y de salida de la empresa.
Dentro de esos canales, había equipos de entrega separadas. Lo que no me di cuenta
en ese momento era que estas estructuras organizativas no son anteriores al diseño
del sistema, pero en realidad creció a su alrededor. Como la cara de impresión de la
empresa disminuido, y el lado digital de la empresa crecieron, el diseño del sistema
sin querer abrir el paso al cómo la organización creció.
Al final nos dimos cuenta de que todo lo que las deficiencias del diseño del sistema
eran, tendríamos que hacer cambios en la estructura organizativa de hacer un cambio.
202 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
Muchos años después, ese proceso sigue siendo un trabajo en progreso!
Ley de Conway en marcha atrás |
201
Personas
No importa cómo se ve en un primer momento, siempre es un
problema de personas.
-Gerry Weinberg,
La segunda ley de la Consultoría
Nosotros tener que aceptar que en un entorno microService, es más difícil para un
desarrollador que sólo piensa en la escritura de código en su propio pequeño mundo.
Tiene que ser más conscientes de las implicaciones de cosas como las llamadas a
través de límites de red, o las implicaciones de Ure fail. También hemos hablado
sobre la capacidad de microservicios para que sea más fácil para probar nuevas
tecnologías, desde los almacenes de datos de idiomas. Pero si se está moviendo desde
un mundo en el que usted tiene un sistema monolítico, donde la mayoría de los
desarrolladores simplemente han tenido que utilizar un idioma y permanece
completamente ajeno a las preocupaciones con- operacionales, a continuación,
echarlos en el mundo de la microservicios puede ser una sorpresa muy desagradable
para ellos.
Del mismo modo, empujando alimentación a los equipos de desarrollo para aumentar
la autonomía puede estar lleno. Las personas que en el pasado han arrojado trabajo a
lo largo de la pared a otra persona están acostumbrados a tener a alguien más a quien
culpar, y no se sienten cómodos siendo plenamente responsables de su trabajo. Usted
puede incluso encontrar barreras contractuales a tener sus desarrolladores llevar
localizadores de apoyo para los sistemas que apoyan!
Aunque este libro ha sido sobre todo acerca de la tecnología, las personas no son sólo
una cuestión secundaria para ser considerado; que son las personas que construyeron
lo que tenemos ahora, y va a construir lo que sucede a continuación. El subir con una
visión de cómo deben hacerse las cosas sin tener en cuenta cómo su personal actual
se sentirá sobre esto o sin tener en cuenta qué capacidades que tienen es probable que
conduzca a un mal lugar.
Cada organización tiene su propio conjunto de dinámicas en torno a este tema.
Entender su personal 's apetito para cambiar. No empuje demasiado rápido! Tal vez
usted todavía tiene un equipo independiente manejar el soporte de primera línea o de
despliegue para un corto período de tiempo, dando a su vez a los desarrolladores a
adaptarse a otras nuevas prácticas. Es posible, sin embargo, tener que aceptar que se
necesitan diferentes tipos de personas en su organización para hacer todo este trabajo.
Sea cual sea su enfoque, entiende que usted necesita estar claro en la articulación de
las responsabilidades de su gente en un mundo microservicios, y también estar claro
por qué esas responsabilidades son importantes para usted. Esto puede ayudarle a ver
cuáles podrían ser sus lagunas en la formación, y pensar en cómo cerrarlas. Para
muchas personas, esto va a ser un viaje bastante miedo. Sólo recuerde que sin
personas a bordo,
202 | Capítulo 10: Conway de Derecho y Diseño de
Sistemas
Resumen
Conway la ley pone de relieve los peligros de tratar de hacer cumplir un diseño de
sistema que no coincide con la organización. Esto nos lleva a tratar de alinear la
propiedad de servicio a equipos coloca- ted, que a su vez están alineados en torno a
los mismos contextos acotadas de la organización. Cuando los dos no están en
alineación, obtenemos puntos de tensión como se describe en este capítulo. Al
reconocer el vínculo entre los dos, nos aseguraremos de que el sistema que estamos
tratando de construir tiene sentido para la organización que estamos construyendo
para.
Algo de lo que cubre aquí tocado los desafíos de trabajar con organiza- ciones a
escala. Sin embargo, hay otras consideraciones técnicas que tenemos que
preocuparse cuando nuestros sistemas comienzan a crecer más allá de unos pocos
servicios discretos. Vamos a abordar los siguiente.
resumen | 203
CAPÍTULO 11
Microservicios a
escala
Cuando usted está tratando con ejemplos bonito, pequeño, tamaño de un libro, todo
parece sencillo. Pero el mundo real es un espacio más complejo. ¿Qué pasa cuando
nuestras arquitecturas MICROSERVICE crecen a partir de inicios más simples, más
humildes a algo más com- plejo? Lo que sucede cuando tenemos que manejar el
fracaso de múltiples servicios separados o es propietario de cientos de servicios?
¿Cuáles son algunos de los patrones de afrontamiento cuando se tiene más
microservicios que las personas? Vamos a averiguar.
El no está por todas partes
Nosotros entienden que las cosas pueden ir mal. Los discos duros pueden fallar.
Nuestro software puede fallar. Y como cualquier persona que ha leído elfalacias de
computación distribuida le puede decir, sabemos que la red no es confiable. Podemos
hacer nuestro mejor esfuerzo para tratar de limitar las causas del fracaso, pero a una
escala determinada, el fracaso se convierte en inevitable. Los discos duros, por
ejemplo, son más fiables que nunca antes, pero que va a romper con el tiempo. Las
unidades de disco duro más se tiene, mayor es la probabilidad de fallo de una unidad
individual; el fracaso se convierte en una certeza estadística a escala.
Incluso para aquellos de nosotros no pensar a escala extrema, si podemos aceptar la
posibilidad de fallo estaremos en mejores condiciones. Por ejemplo, si podemos
manejar el fallo de un servicio con gracia, entonces se deduce que también podemos
hacer actualizaciones in situ de un servicio, como un corte de Ned plan- es mucho
más fácil de tratar que uno no planificado.
Nosotros También puede pasar un poco menos de nuestro tiempo tratando de detener
lo inevitable, y un poco más de nuestro tiempo a tratar con él con gracia. Estoy
sorprendido por el número de organizaciones poner cesos y controles pro en el lugar
205
para tratar de detener el fracaso ocurra, pero puse poco o ningún pensamiento en
realidad lo que es más fácil recuperarse de un error en el primer lugar.
La cocción en el supuesto de que todo lo puede y se producirá un error te lleva a
pensar de manera diferente acerca de cómo solucionar problemas.
206 | Capítulo 11: microservicios a escala
Vi un ejemplo de esta forma de pensar, mientras que pasar algún tiempo en el
campus de Google hace muchos años. En la zona de recepción de uno de los edificios
en Mountain View era un viejo bastidor de las máquinas, hay como una especie de
exposiciones. Me di cuenta de un par de cosas. En primer lugar, estos servidores no
estaban en gabinetes de servidores, no eran más que las placas ranuradas desnudas en
el bastidor. Lo principal me di cuenta, sin embargo, fue que las unidades de disco
duro se sujeta con velcro. Pregunté a uno de los empleados de Google por qué. “Oh”,
dijo, “los discos duros fallan tanto que no quiere que ellos atornillados. Acabamos de
arrancarlas, tirar a la basura, y velcro en una nueva.”
Así que repito: a gran escala, incluso si usted compra el mejor equipo, el hardware
más caro, no se puede evitar el hecho de que las cosas pueden y van a fallar. Por lo
tanto, es necesario asumir el fracaso puede suceder. Si se construye esta forma de
pensar en todo lo que haces, y un plan para el fracaso, se pueden hacer diferentes
ventajas y desventajas. Si sabe que su sistema puede manejar el hecho de que un
servidor puede y va a fracasar, ¿por qué molestarse gastar mucho en él en absoluto?
¿Por qué no usar una placa base desnudo con componentes más baratos (y algunos de
velcro) como hizo Google, en lugar de tener que preocuparse demasiado acerca de la
capacidad de recuperación de un solo nodo?
¿Cuánto es demasiado?
Hemos tocado el tema de los requisitos de funciones cruzadas en Capítulo 7. ING
requisitos comprensión multi-funcionales es todo sobre teniendo en cuenta aspectos
como la durabilidad de los datos, disponibilidad de servicios, el rendimiento y la
latencia aceptable de servicios. Muchas de las técnicas tratadas en este capítulo y en
otros lugares a hablar de enfoques a las aplicará estos requisitos, pero sólo usted sabe
exactamente lo que podrían ser los requisitos de sí mismos.
Tener un sistema de cambio automático de escala capaz de reaccionar a un aumento
de la carga o el fracaso de los nodos indivi- indi- podría ser fantástico, pero podría
ser excesiva para un sistema de información que sólo tiene que ejecutar dos veces al
mes, en el que ser por un día o dos no es tan grande de un acuerdo. Del mismo modo,
encontrar la manera de hacer despliegues / verde azul para eliminar el tiempo de
inactividad de un servicio podría tener sentido para su sistema de comercio
electrónico en línea, pero para su base de conocimientos intranet corporativa es
probable que sea un paso demasiado lejos.
Sabiendo lo mucho que falta que puede tolerar, o la velocidad de su sistema tiene que
ser, es impulsada por los usuarios de su sistema. Que a su vez le ayudará a entender
lo que técni- cas harán más sentido para usted. Dicho esto, los usuarios no siempre
serán capaces de articular lo que son las necesidades exactas. Así que hay que hacer
preguntas para ayudar a extraer la información correcta, y ayudarles a entender los
costos relativos de proporcio- nando diferentes niveles de servicio.
Como ya he mencionado anteriormente, estos requisitos multifuncionales pueden
205
variar de un servicio a otro, pero sugeriría que define algunas cruzadas funcionales
generales, a continuación, anulando ellos por casos de uso particulares. Cuando se
trata de considerar si y cómo
206 | Capítulo 11: microservicios a escala
escalar el sistema para una mejor carga de mango o el fracaso, empezar por tratar de
comprender los siguientes requisitos:
El tiempo de respuesta / latencia
¿Cuánto debe durar varias operaciones? Puede ser útil para medir esto con
diferente número de usuarios a entender cómo el aumento de carga tendrá un
impacto en el tiempo de respuesta. Dada la naturaleza de las redes, que siempre
tenga los valores extremos, por lo que la fijación de objetivos para un percentil
determinado de las respuestas monitorizados pueden ser útiles. El objetivo
también debe incluir el número de conexiones / usuarios al mismo tiempo que se
espera que su software para manejar. Así que se podría decir: “Esperamos que el
sitio web para tener un tiempo de respuesta a los 90 percentil de 2 segundos al
manejar 200 conexiones simultáneas por segundo.”
Disponibilidad
Se puede esperar un servicio a estar abajo? ¿Se considera un servicio 24/7?
Algunas personas les gusta mirar a los períodos de tiempo de inactividad
aceptable cuando se miden disponibili- dad, pero lo útil que es esto a alguien que
llame a su servicio? ya sea que debería ser capaz de confiar en su servicio de
responder o no. Períodos de medición de tiempo de inactividad es realmente más
útil desde un ángulo de informes históricos.
La durabilidad de los datos
La cantidad de pérdida de datos es aceptable? ¿Por cuánto tiempo se deben
mantener los datos de? Esto es altamente probable que cambie en una base de
caso por caso. Por ejemplo, es posible optar por mantener registros de sesión de
usuario para un año o menos para ahorrar espacio, pero puede ser que necesite
ser mantenido durante muchos años sus registros ción transac- financiera.
Una vez que tenga estos requisitos en su lugar, usted querrá una forma de medisistemáticamente Ure ellos sobre una base continua. Usted puede decidir hacer uso
de las pruebas de rendimiento, por ejemplo, para asegurar que su sistema cumple con
los objetivos de rendimiento aceptables, pero usted querrá asegurarse de que está
supervisando estas estadísticas en la producción, así!
Funcionalidad degradantes
Una parte esencial de la construcción de un sistema resistente, sobre todo cuando su
funcionalidad se extiende sobre un número de diferentes microservicios que pueden
estar arriba o hacia abajo, es la capacidad de degradar la funcionalidad segura.
Imaginemos una página web estándar en nuestro sitio de comercio electrónico. Para
reunir las distintas partes de ese sitio web, podríamos necesitar varios servicios de
micro a desempeñar un papel. Una microService podría mostrar los detalles acerca
del álbum que se está a la venta. Otro podría mostrar el precio y el nivel de
existencias. Y vamos a proba- blemente mostraremos contenido del carrito de
compras también, que puede ser otro microService. Ahora bien, si uno de esos
Funcionalidad degradantes |
207
servicios se ha reducido, y que los resultados en toda la página web no esté
disponible, entonces hemos hecho podría decirse que un sistema que es menos
resistente de lo que requiere solamente un servicio que esté disponible.
208 | Capítulo 11: microservicios a escala
Lo que tenemos que hacer es entender el impacto de cada interrupción, y averiguar
cómo se degradan correctamente funcionalidad. Si el servicio de carrito de la compra
no está disponible, estamos probable- mente en un montón de problemas, pero aún
pudimos mostrar la página web con el anuncio. Tal vez simplemente ocultar el
carrito de la compra o sustituirla por un icono que dice “vuelvo!”
Con una sola, la aplicación monolítica, que no tienen muchas decisiones que tomar.
El estado del sistema es binario. Pero con una arquitectura microService, debemos
tener en cuenta una situación mucho más matizada. Lo que hay que hacer en
cualquier situación a menudo no es una decisión técnica. Puede ser que sabemos lo
que es técnicamente posible cuando el carrito de la compra está abajo, pero si no
entendemos el contexto empresarial no entenderemos qué medidas debemos tomar.
Por ejemplo, tal vez cerramos todo el sitio, todavía permiten a las personas a navegar
por el catálogo de artículos, o reemplazar partes de la interfaz de usuario que
contiene el control de la compra con un número de teléfono para realizar un pedido.
Pero por cada interfaz de cara al cliente que utiliza múltiples microservicios, o cada
microService que depende de múltiples colaboradores aguas abajo, es necesario
preguntarse, “¿Qué pasa si esto se debe?” Y sabe qué hacer.
Al pensar acerca de la criticidad de cada una de nuestras capacidades en términos de
nuestras necesidades funcionales cruzados, estaremos en mejor posición para saber lo
que podemos hacer. Ahora vamos a considerar algunas cosas que podemos hacer
desde un punto de vista técnico para asegurarse de que cuando se produce un fallo
que podemos manejar con gracia.
Medidas de seguridad de arquitectura
Hay unos cuantos patrones, que en conjunto me refiero como las medidas de
seguridad de arquitectura, que podemos hacer uso para asegurarse de que si algo sale
mal, no causa efectos desagradables de la ondulación de salida. Estos son puntos es
esencial entender, y debe considerar seriamente la estandarización en su sistema para
asegurarse de que uno mal ciudadano no trae todo el mundo derrumbarse alrededor
de sus oídos. En un momento, vamos a echar un vistazo a algunas medidas de
seguridad clave que debe considerar, pero antes de hacerlo, me gustaría compartir
una breve historia para describir el tipo de cosas que pueden ir mal.
Yo era una ventaja técnica sobre un proyecto en el que estábamos construyendo un
sitio web de anuncios clasificados en línea. La propia página web maneja volúmenes
bastante altos, y generó una gran cantidad de ingresos para el negocio. Nuestra
aplicación principal manejado alguna pantalla de sí mismo Tablón de anuncios,
llamadas también proxy a otros servicios que proporcionan diferentes tipos de productos, como se muestra enFigura 11-1. Esto es en realidad un ejemplo de una
aplicación de estrangulador, donde un nuevo sistema intercepta las llamadas
realizadas a las aplicaciones heredadas y repla- gradualmente ces por completo.
Como parte de este proyecto, estábamos a mitad de la de retirarse las aplicaciones
más antiguas. Acabábamos movido sobre el volumen más alto y más grande de
Funcionalidad degradantes |
207
productos de ganancia, pero gran parte del resto de los anuncios aún estaban siendo
atendidos por un número de aplicaciones antiguas. Tanto en términos de la cantidad
de búsquedas y el dinero obtenido por estas aplicaciones, había una cola muy larga.
208 | Capítulo 11: microservicios a escala
Figura 11-1. Un sitio web anuncios clasificados estrangular las aplicaciones heredadas
de más edad
Nuestro sistema había sido vivo por un tiempo y se comporta muy bien, el manejo de
una carga no insignificante. En ese momento debemos estado manejando alrededor
de 6.000-7.000 solicitudes por segundo durante el pico, y aunque la mayor parte de
eso fue muy fuertemente en caché por los proxies inversos que se sienta delante de
nuestros servidores de aplicaciones, las búsquedas de productos (el aspecto más
importante del sitio ) eran en su mayoría no está en caché y requiere un servidor
completo de ida y vuelta.
Una mañana, justo antes de chocar con nuestro pico de la hora de comer todos los
días, el sistema comenzó tamiento ing lentamente, y luego comenzó gradualmente a
fallar. Tuvimos un cierto nivel de supervisión en nuestra nueva aplicación central,
suficiente para decirnos que cada uno de nuestros nodos de aplicación estaba
golpeando un pico de la CPU al 100%, muy por encima de los niveles normales,
incluso en el pico. En un corto período de tiempo, todo el sitio fue abajo.
Nosotros conseguido localizar al culpable y llevar el sitio de copia de seguridad.
Resultó uno de los sistemas de anuncios aguas abajo, uno de los más antiguos y
menos mantenido activamente, había comenzado a responder muy lentamente.
Respondiendo muy lentamente es uno de los peores modos de fallo que puede
experimentar. Si un sistema no está allí, se encuentra con bastante rapidez. Cuando es
sólo lenta, se termina la espera por un tiempo antes de abandonar. Pero Cualquiera
que sea la causa de la falla, que habíamos creado un sistema que era vulnerable a un
fallo de conectar en cascada. Un servicio de aguas abajo, sobre el que teníamos poco
control, era capaz de hacer caer todo nuestro sistema.
Mientras que un equipo analizó los problemas con el sistema de aguas abajo, el resto
de nosotros se puso a mirar lo que había ido mal en nuestra aplicación. Hemos
encontrado algunos problemas. Estábamos usando un conjunto de conexiones HTTP
para manejar nuestras conexiones aguas abajo. Los hilos en la propia piscina habían
configurado los tiempos de espera por cuánto tiempo esperarían al hacer la llamada
HTTP aguas abajo, lo cual es bueno. El problema era que los trabajadores estaban
tomando un tiempo para el tiempo de espera debido al sistema de aguas abajo lento.
Medidas de seguridad de
arquitectura | 209
Mientras esperaban, más solicitudes fueron a la piscina pidiendo subprocesos de
trabajo. Sin trabajadores disponibles, estas solicitudes mismos colgadas. Resultó que
la biblioteca de la piscina ción conexiones que estábamos usando tuvo un tiempo de
espera para la espera de los trabajadores, pero esto
210 | Capítulo 11: microservicios a escala
fue desactivado por defecto! Esto dio lugar a una enorme acumulación de hilos
bloqueados. Nuestra apli- cación normalmente contaba con 40 conexiones
simultáneas en un momento dado. En el espacio de cinco minutos, esta situación nos
causó a pico en alrededor de 800 conexiones, con lo que el sis- tema hacia abajo.
Lo peor fue que el servicio de aguas abajo estábamos hablando con funcionalidad
representado que menos del 5% de nuestra base de clientes utiliza y genera menos
ingresos que eso. Al llegar a fin de cuentas, descubrimos la manera más difícil que
los sistemas que simplemente actúan lenta son mucho más difíciles de tratar que los
sistemas que simplemente fallan rápido. En un sistema distribuido, la latencia mata.
Incluso si hubiéramos tenido los tiempos de espera en la piscina situada
correctamente, sino que también estaban compartiendo una única agrupación de
conexiones HTTP para todas las solicitudes salientes. Esto significaba que un
servicio lento podría agotar el número de trabajadores disponibles por sí mismo,
incluso si todo lo demás estaba sano. Por último, estaba claro que el servicio de aguas
abajo en cuestión no era saludable, pero siguió enviando tráfico de su camino. En
nuestra situación, esto significaba en realidad estábamos haciendo una mala situación
peor, como el servicio de aguas abajo no tenía ninguna posibilidad de recuperarse.
Terminamos la implementación de tres correcciones para evitar que esto suceda otra
vez: conseguir nuestros tiempos de espera de la derecha, la implementación de los
mamparos para separar las diferentes agrupaciones de conexiones, y la
implementación de un disyuntor para evitar el envío de llamadas a un sistema poco
saludable en el primer lugar.
La Organización Antifragile
En su libro Antifragile (Random House), Nassim Taleb habla de cosas que realmente
se benefician de la insuficiencia y desorden. Ariel Tseitlin utiliza este concepto para
acuñar el concepto de laorganización antifragile en lo que respecta a cómo opera
Netflix.
La escala a la que funciona Netflix es bien conocida, como es el hecho de que Netflix
se basa totalmente en la infraestructura de AWS. Estos dos factores significa que
tiene para abrazar así fracaso. Netflix va más allá de que por el fracaso en realidad
incitar a asegurar que sus siste- mas son tolerantes de la misma.
Algunas organizaciones estarían felices con los días de juego, donde el fracaso se
simula mediante sistemas que se están apagados y con los distintos equipos
reaccionan. Durante mi tiempo en Google, se trataba de un fenómeno bastante común
para los diversos sistemas, y ciertamente creo que muchas organizaciones podrían
beneficiarse de tener este tipo de ejercicios con regu- laridad. Google va más allá de
simples pruebas para imitar falla en el servidor, y como parte de su informe anualDe
suciedad (recuperación de desastres de prueba) ejercicios se ha simulado desastres a
gran escala como los terremotos. Netflix también tiene un enfoque más agresivo,
escribiendo pro- gramas que el fracaso causa y ejecutarlos en la producción sobre una
base diaria.
Medidas de seguridad de
arquitectura | 209
El más famoso de estos programas es el mono Caos, que durante ciertas horas del día
se apagará máquinas de azar. Sabiendo que esto puede y va a HAP pluma en la
producción significa que los desarrolladores que crean los sistemas realmente tienen
que estar preparados para ello. El mono caos es sólo una parte del Ejército Simian de
Netflix de los robots de fallo. El Caos gorila se utiliza para sacar todo un centro de
disponibilidad (el equivalente AWS de un centro de datos), mientras que el mono
Latencia simula la conectividad de red lenta entre las máquinas. Netflix ha hecho
estas herramientas disponibles bajo unaabierto licencia de código. Para muchos, la
prueba definitiva de que su sistema es realmente robusta podría ser desatar su propio
ejército de simio en su infraestructura de producción.
Abrazando e incitar al fracaso a través de software y sistemas de construcción que se
manipulan de dle él, es sólo una parte de lo que hace Netflix. También comprende la
importancia de aprender del fracaso cuando se produce, y la adopción de una cultura
libre de culpa cuando los errores ocurren. Los desarrolladores tienen la facultad
adicional de ser parte de este proceso de aprendizaje y evolución, ya que cada
desarrollador es también responsable de la gestión de sus servicios de producción.
Al provocar la falta de suceder, y construyendo para ello, Netflix ha asegurado que
los sistemas tiene escala mejor, y mejor soporte a las necesidades de sus clientes.
No todo el mundo tiene que ir a la clase de extremos que Google o Netflix hacen,
pero es importante entender el cambio de mentalidad que se requiere con los sistemas
distribuidos. Las cosas van a fallar. El hecho de que el sistema está divida en varias
máquinas (que se puede y se producirá un error) a través de una red (que será poco
fiable) en realidad puede hacer que su sistema sea más vulnerable, no menos. Así
que, independientemente de si usted está tratando de ofrecer un servicio a la escala de
Google o Netflix, prepararse para el tipo de fallo que se presentan con más
arquitecturas distribuidas es bastante importante. Entonces, ¿qué tenemos que hacer
para manejar el fracaso en nuestros sistemas?
Tiempos de espera
Los tiempos de espera son algo que es fácil pasar por alto, pero en un sistema de
aguas abajo que son importantes para hacerlo bien. ¿Cuánto tiempo puedo esperar
antes de poder considero un sis- tema de aguas abajo para ser realmente abajo?
Espere demasiado tiempo para decidir que una llamada ha fallado, y se puede retrasar
todo el sistema hacia abajo. Tiempo de espera demasiado rápido, y se le considera
una llamada que podría haber funcionado como fallido. No tienen tiempos de espera
en absoluto, y un sistema de aguas abajo de estar abajo podría pasar todo el sistema.
Ponga los tiempos de espera en todas las llamadas fuera de proceso, y elegir un
tiempo de espera predeterminado para todo. Log cuando se producen tiempos de
espera, mira lo que sucede, y cambiar en consecuencia.
La Organización Antifragile | 211
Rompedores de circuito
En su propia casa, existen disyuntores para proteger sus dispositivos eléctricos de
picos en el poder. Si se produce un pico, el disyuntor se soplado, la protección de sus
electrodomésticos sive expen-. También puede desactivar manualmente un
interruptor para cortar el poder de parte de su casa, lo que le permite trabajar de
forma segura en el sistema eléctrico. El libro de Michael Nygard liberarlo!
(Programadores pragmáticos) muestra cómo la misma idea puede hacer maravillas
como un mecanismo de protección para nuestro software.
Consideremos la historia compartí hace un momento. La apli- cación aguas abajo
legado ad estaba respondiendo muy lentamente, antes de finalmente devolver un
error. Incluso si hubiéramos conseguimos los tiempos de espera de la derecha, que
estaríamos esperando mucho tiempo antes de llegar el error. Y entonces nos gustaría
probar de nuevo la próxima vez que una solicitud entró, y esperar. Ya es bastante
malo que el servicio de aguas abajo está funcionando mal, pero es lo que nos vamos
demasiado lento.
Con un interruptor de circuito, después de un cierto número de solicitudes al recurso
aguas abajo han fracasado, el interruptor de circuito está fundido. Todas las
solicitudes adicionales fallan rápido, mientras que el disyuntor se encuentra en su
estado expandido. Después de un cierto período de tiempo, el cliente envía peticiones
a través de unos pocos para ver si el servicio de aguas abajo se ha recuperado, y si
consigue suficientes respuestas saludables se restablece el interruptor de circuito. Se
puede ver una visión general de este proceso enFigura 11-2.
¿Cómo se implementa un disyuntor depende de lo que significa una solicitud fallado,
pero cuando les he implementado para las conexiones HTTP he tomado falta de
significar un tiempo de espera o un código de retorno HTTP 5XX. De esta manera,
cuando un recurso aguas abajo es hacia abajo, o el tiempo de espera, o devolver
errores, después de un cierto umbral se alcanza automática- mente que deje de enviar
tráfico y empezar a fallar rápidamente. Y podemos empezar de nuevo
automáticamente cuando las cosas son saludables.
Conseguir la configuración correcta puede ser un poco difícil. Usted no quiere que
diera el interruptor de circuito con demasiada facilidad, ni tampoco quiere tomar
demasiado tiempo para hacerlo explotar. Del mismo modo, usted realmente desea
asegurarse de que el servicio de aguas abajo es sano otra vez antes de enviar el
tráfico. Al igual que con los tiempos de espera, me quedaría con unos valores
iniciales adecuados y seguir con ellos en todas partes, a continuación, cambiar ellos
para casos específicos.
Mientras se sopla el disyuntor, usted tiene algunas opciones. Una de ellas es hacer
cola las peticiones y vuelva a intentarlo más adelante. Para algunos casos de uso, esto
podría ser apropiado, especial- mente si usted está llevando a cabo un trabajo como
parte de un trabajo asíncrono. Si esta llamada se está realizando como parte de una
212| Capítulo 11: microservicios a escala
cadena llamada sincrónica, sin embargo, es probablemente mejor fallar rápido. Esto
podría significar la propagación de un error en la cadena de llamada, o una ing
degrad- más sutil de funcionalidad.
Si tenemos este mecanismo en su lugar (como ocurre con los interruptores de circuito
en nuestra casa), podríamos utilizar de forma manual para que sea más seguro para
hacer nuestro trabajo. Por ejemplo, si queríamos tomar un microService abajo como
parte del mantenimiento de rutina, podríamos volar manualmente
La Organización Antifragile | 213
todos los interruptores de circuito de los sistemas dependientes para que fallan
rápido, mientras que el vicio microser- no está en línea. Una vez que está atrás,
podemos restablecer los interruptores de circuito y todo debería volver a la
normalidad.
Figura 11-2. Una visión general de los disyuntores
214| Capítulo 11: microservicios a escala
mamparos
En otro patrón de liberación que !, Nygard introduce el concepto de un mamparo
como una forma de aislarse de fracaso. En el transporte marítimo, un mamparo es
una parte de la nave que puede ser sellada para proteger el resto de la nave. Así que si
el buque surge una fuga, puede cerrar las puertas de los mamparos. Se pierde parte de
la nave, pero el resto de la misma se mantiene intacta.
En términos de arquitectura de software, hay un montón de diferentes mamparos
podemos considerar. Volviendo a mi propia experiencia, que en realidad perdió la
oportunidad de poner en práctica un mamparo. Deberíamos haber utilizado diferentes
agrupaciones de conexiones para cada conexión aguas abajo. De esa manera, si uno
agrupación de conexiones se agota, las otras conexiones no están afectados, como
vemos enFigura 11-3. Esto aseguraría que si un servicio de aguas abajo lentamente
empezó a comportarse en el futuro, sólo eso piscina una conexión sería impac- ted,
permitiendo que otras llamadas para proceder de forma normal.
Figura 11-3. El uso de un conjunto de conexiones por servicio de aguas abajo para
proporcionar los mamparos
La separación de las preocupaciones también puede ser una manera de poner en
práctica los mamparos. Por burlas aparte funcionalidad en microservicios separados,
se reduce la posibilidad de un corte de luz en un área que afecta a otra.
Mira todos los aspectos de su sistema que pueden salir mal, tanto dentro de sus ces
microservi- y entre ellos. ¿Tiene mamparos en su lugar? Yo sugeriría a partir de
grupos de conexión arate SEP para cada conexión aguas abajo al menos. Es posible
que desee ir más lejos, sin embargo, y considerar el uso de interruptores de circuito
también.
Nosotros puede pensar en nuestros interruptores como un mecanismo automático para
sellar un mamparo, no sólo para proteger al consumidor contra el problema aguas
abajo, sino también a potencial- mente proteger el servicio de aguas abajo de más
llamadas que pueden estar teniendo un impacto adverso. Teniendo en cuenta los
peligros de la cascada fracaso, me gustaría recomendar que ordena circuito ERS
La Organización Antifragile | 215
Break para todas sus llamadas aguas abajo síncronos. Usted no tiene que escribir su
propia, ya sea. Netflixbiblioteca hystrix es un interruptor automático de la
abstracción que viene con JVM
216| Capítulo 11: microservicios a escala
un poderoso monitoreo, pero existen otras implementaciones de diferentes pilas de
tecnología, tales como Polly para .NET, o la mixin circuit_breaker para Ruby.
En muchos sentidos, los mamparos son los más importantes de estos tres patrones.
Los tiempos de espera y disyuntores ayudan a liberar recursos cuando se están
limitados, pero los mamparos pueden asegurarse de que no quedan limitados en el
primer lugar. Hystrix le permite, por ejemplo, para poner en práctica los mamparos
que realmente rechazan solicitudes en condiciones determi- nados para garantizar
que los recursos no llegan a ser aún más saturada; esto se conoce como la
desconexión de carga. A veces rechazar una solicitud es la mejor manera de detener
un sistema importante de convertirse en abrumado y ser un cuello de botella para
múltiples servicios de aguas arriba.
Aislamiento
Cuanto más uno de servicio depende de otro ser arriba, más la salud de uno influye
en la capacidad del otro para hacer su trabajo. Si podemos usar técnicas de
integración que permiten a un servidor indirecto a estar fuera de línea, servicios de
aguas arriba tienen menos probabilidades de estar afectados por los cortes, previstas
o imprevistas.
Hay otro beneficio para aumentar el aislamiento entre los servicios. Cuando los
servicios están aislados unos de otros, se necesita mucho menos coordinación entre
los propietarios de servicios. Cuanto menos se necesita la coordinación entre los
equipos, la mayor autonomía esos equipos tienen, ya que son capaces de funcionar y
evolucionar sus servicios con mayor libertad.
idempotencia
En las operaciones idempotente, el resultado no cambia después de la primera
aplicación, incluso si la operación se aplica posteriormente varias veces. Si se
idempotent operaciones, podemos repetir la llamada varias veces sin efectos
adversos. Esto es muy útil cuando queremos reproducir los mensajes que no estamos
seguros han sido procesados, una forma común de recuperación de error.
Vamos considerar una simple llamada a añadir algunos puntos como resultado de uno
de nuestros clientes hacer un pedido. Podríamos hacer una llamada con el tipo de
carga útil se muestra enEjemplo 11-1.
Ejemplo 11-1. Acreditando puntos a una cuenta
<Crédito>
<Cantidad>100</ Cantidad>
<ForAccount>1234</ Cuenta>
</ Crédito>
idempotencia | 215
Si esta llamada es recibida en múltiples ocasiones, que habría que añadir 100 puntos
múltiples veces. Tal como está, por lo tanto, esta llamada no es idempotente. Con un
poco más de información, sin embargo, permitimos que el banco de puntos para
hacer esta llamada idempotente, como se muestra enEjemplo 11-2.
Ejemplo 11-2. La adición de más información al crédito de puntos para que sea
idempotente
<Crédito>
<Cantidad>100</ Cantidad>
<ForAccount>1234</ Cuenta>
<Razón>
<ForPurchase>4567</ ForPurchase>
</ Razón>
</ Crédito>
Ahora sabemos que este crédito se refiere a un orden específico, 4567. Suponiendo
que pudiéramos recibir sólo un crédito para un fin determinado, podríamos aplicar
este crédito nuevo sin aumentar el número total de puntos.
Este mecanismo funciona igual de bien con la colaboración basada en eventos, y
puede ser especial- mente útil si tiene varias instancias del mismo tipo de servicio de
suscripción de eventos. Incluso si almacenamos los eventos que se han procesado,
con algunas formas de entrega de mensajes asíncrona puede haber pequeñas ventanas
donde dos trabajadores pueden ver el mismo mensaje. Al procesar los eventos de una
manera idempotente, nos aseguramos de que esto no nos va a causar ningún
problema.
Algunas personas llegar a ser muy atrapados con este concepto, y asumen que
significa que la subsiguiente llamadas con los mismos parámetros no pueden tener
ningún impacto, que a su vez nos deja en una posición interesante. Realmente todavía
desea grabar el hecho de que una llamada fue recibida en nuestros registros, por
ejemplo. Queremos grabar el tiempo de respuesta de la llamada y recopilar estos
datos para el monitoreo. El punto clave aquí es que es la operación Ness Busisubyacente que estamos considerando idempotente, no todo el estado del sistema.
Algunos de los verbos HTTP, como GET y PUT, se definen en la especificación
HTTP ción para ser idempotente, pero para que eso sea el caso, que se basan en el
manejo de estas llamadas en forma idempotente servicio. Si usted comienza a hacer
estos verbos nonidempotent, pero las personas que llaman piensa que puede ejecutar
con seguridad ellos en varias ocasiones, es posible que te metas en un lío. Recuerde,
sólo porque usted está utilizando HTTP como protocolo subyacente no significa que
usted consigue todo gratis!
Escalada
Nosotros escalar nuestros sistemas, en general, por una de dos razones. En primer
216| Capítulo 11: microservicios a escala
lugar, para ayudar a lidiar con el fracaso: si estamos preocupados de que algo va a
fallar, y luego tener más de lo mismo va a ayudar, ¿verdad? Segundo, se escala para
el rendimiento, ya sea en términos de manejo más carga, reduciendo la latencia, o
ambos. Veamos algunas técnicas de escalamiento comunes que podemos utilizar y
pensar en cómo se aplican a MICROSERVICE arquitecturas.
idempotencia | 217
ir más grande
Algunas operaciones solo pueden beneficiarse de más ronco. Conseguir una caja más
grande con una CPU más rápida y mejor de E / S a menudo puede mejorar la latencia
y rendimiento, lo que le permite pro- ceso más trabajo en menos tiempo. Sin
embargo, esta forma de escala, a menudo llamada la escala vertical, puede ser a veces
un servidor caro grande puede costar más de dos servidores más pequeños con la
misma potencia bruta combinada, especialmente cuando comienza a recibir a
máquinas muy grandes. A veces nuestro software en sí mismo no puede hacer mucho
con los recursos adicionales disponibles a la misma. Las máquinas más grandes a
menudo sólo nos dan más núcleos de CPU, pero no lo suficiente de nuestro software
está escrito para tomar ventaja de ellos. El otro problema es que esta forma de
escalado no puede hacer mucho para mejorar la capacidad de recuperación de nuestro
servidor si sólo tenemos uno de ellos! Sin embargo, esto puede ser una buena victoria
rápida,
Las cargas de trabajo de división
Como se indica en Capítulo 6, Que tiene un único microService por host es
ciertamente preferible a un modelo multiservicio-per-host. Inicialmente, sin embargo,
muchas personas deciden coexistir múltiples microservicios en una caja para
mantener los costos bajos o para simplificar anfitrión manage- ment (aunque eso es
una razón discutible). Como los microservicios son procesos independientes que se
comunican a través de la red, debe ser una tarea fácil para luego moverlos en sus
propios ordenadores para mejorar el rendimiento y escalado. Esto también puede
aumentar la elasticidad del sistema, como un solo corte de anfitrión tendrá un
impacto en un número reducido de microservicios.
Por supuesto, también podríamos utilizar la necesidad de aumentar la escala para
dividir un vicio microser- existente en partes para manejar mejor la carga. Como un
ejemplo simplista, imaginemos que nuestro servicio de cuentas proporciona la
capacidad de crear y administrar las cuentas financieras de los clientes individuales,
pero también expone una API para ejecutar consultas para generar informes. Esta
capacidad de consulta coloca una carga significativa en el sistema. La capacidad de
consulta se considera no crítico, ya que no es necesario para mantener las órdenes
que fluyen durante el día. La capacidad de gestionar los registros financieros para
nuestros clientes es fundamental, sin embargo, y no puede permitirse el lujo de que
sea hacia abajo. Al dividir estas dos capacidades en diversos servicios diferentes, se
reduce la carga en el servicio de cuentas críticas,Capítulo 4, Sino también como un
sistema no crítico no necesita ser desplegado de una manera tan resistentes como las
cuentas del núcleo de servicios.
Difundir su riesgo
Una forma de ampliar la capacidad de recuperación es asegurarse de que usted no
pone todos los huevos en una sola canasta. Un simple ejemplo de esto es asegurarse
escalamiento |
217
de que usted no tiene múltiples servicios en un host, donde una interrupción afectaría
a múltiples servicios. Pero vamos a considerar lo que significa anfitrión. En la
mayoría de las situaciones de hoy en día, una gran cantidad es en realidad un
concepto virtual. Entonces
218| Capítulo 11: microservicios a escala
¿Y si tengo todos mis servicios en diferentes hosts, pero todos esos anfitriones son
realmente anfitriones tuales vir-, que se ejecuta en la misma máquina física? Si este
cuadro no se cae, podría perder los servicios múlti- ples. Algunas plataformas de
virtualización que permiten asegurar que sus anfitriones son distribuidos a través de
múltiples cajas físicas diferentes para reducir esta oportunidad.
Para las plataformas de virtualización internos, es una práctica común tener partición
raíz de la máquina virtual asignado a un solo (red de área de almacenamiento) SAN.
Si eso SAN baja, se puede acabar con todas las máquinas virtuales conectadas. SAN
son grandes, caros, y diseñado para no fallar. Dicho esto, he tenido grandes redes
SAN caros fallan en mí por lo menos dos veces en los últimos 10 años, y cada vez los
resultados fueron bastante grave.
Otra forma común de separación para reducir el fracaso es para asegurarse de que no
todos los servicios se están ejecutando en un solo estante en el centro de datos, o que
sus servicios se dis- tribuyeron en más de un centro de datos. Si está utilizando un
servicio de vider pro subyacente, es importante saber si se ofrece un acuerdo de nivel
de servicio (SLA) y planificar en consecuencia. Si necesita asegurarse de que sus
servicios se han reducido a no más de cuatro horas cada trimestre, pero su proveedor
de alojamiento sólo pueden garantizar un tiempo de inactividad de ocho horas por
trimestre, usted tiene que cambiar ya sea el SLA, o llegar a una solución alter- nativa
.
AWS, por ejemplo, se divide en regiones, que se pueda imaginar nubes distintos.
Cada región está a su vez dividido en dos o más zonas de disponibilidad (AZS). AZS
son equivalentes de un centro de datos de AWS. Es esencial disponer de los servicios
distribuidos a través de múltiples zonas de disponibilidad, como AWS no ofrece
garantías acerca de la disponibilidad de un solo nodo, o incluso toda una zona de
disponibilidad. Por su servicio de computación, que sólo ofrece un tiempo de
actividad del 99,95% durante un período mensual dada de la región en su conjunto,
así que es conveniente para distribuir las cargas de trabajo a través de zonas de
disponibilidad múltiples dentro de una sola región. Para algunas personas, esto no es
lo suficientemente bueno, y en su lugar se ejecuta sus servicios a través de múltiples
regiones también.
Eso Hay que señalar, por supuesto, que debido a que los proveedores le dan una
garantía de SLA, tenderán a limitar su responsabilidad! Si les falta sus objetivos le
cuesta a los clientes y una gran cantidad de dinero, puede que te encuentres buscando
a través de los contratos para ver si se puede arañar nada nuevo de ellos. Por lo tanto,
yo sugerimos que entender el impacto de un proveedor de fallar en sus obligaciones
con usted, y averiguar si es necesario tener un plan B (o C) en el bolsillo. Más de un
cliente que he trabajado ha tenido una recuperación de desastres plataforma de
alojamiento con un proveedor diferente, por ejem- plo, para asegurar que no eran
demasiado vulnerables a los errores de una empresa.
escalamiento |
219
Balanceo de carga
Cuando necesite su servicio para ser resistente, se quiere evitar puntos únicos de
fallo. Para una típica microService que expone un extremo HTTP sincrónico, la
forma más fácil de lograr esto es tener varios hosts funcionando la instancia
microService, sen- tado detrás de un equilibrador de carga, como se muestra
enFigura 11-4. Para los consumidores de la microService, no se sabe si se trata de un
caso microService o cien.
Figura 11-4. Un ejemplo de un enfoque de equilibrio de carga a escala el número de
instancias de servicio al cliente
equilibradores de carga vienen en todas las formas y tamaños, desde ANCES aplihardware grandes y costosos a los equilibradores de carga basados en software como
mod_proxy. Todos ellos comparten algunas funciones clave. Se distribuyen las
llamadas enviadas a ellos para una o más instancias en base a algún algoritmo,
eliminar las instancias cuando ya no son saludables, y es de esperar añadirlos de
nuevo en cuando se encuentran.
Algunos equilibradores de carga proporcionan características útiles. Uno muy
común es la terminación SSL, HTTPS entrantes donde las conexiones con el
equilibrador de carga se transforman en las conexiones HTTP vez que lleguen a
la instancia en sí. Históricamente, la sobrecarga de gestión de SSL fue lo
suficientemente significativo que tener un equilibrador de carga manejar este
proceso para usted era bastante útil. Hoy en día, esto es tanto sobre la
simplificación de la puesta a punto de los anfitriones viduales indi- que ejecuta la
instancia. El punto de usar HTTPS, sin embargo, es asegurarse de que las
solicitudes no son vulnerables a un ataque man-in-the-middle, como hemos
comentado enCapítulo 9, Por lo que si usamos la terminación SSL, estamos
exponiendo potencialmente a nosotros mismos lo que algu-. Uno de mitigación
es tener todas las instancias de la microService dentro de una sola VLAN, como
vemos enFigura 11-5. Una VLAN es una red virtual de área local, es decir
RELAClONADAS iso de una manera tal que solicita desde fuera de ella sólo
puede venir a través de un router, y en este caso nuestro router es también nuestra
220| Capítulo 11: microservicios a escala
equilibrador de carga SSL de terminación. La única comu- nicación a la
microService desde fuera del VLAN viene HTTPS más, pero todo internamente
es HTTP.
escalamiento |
221
Figura 11-5. El uso de la terminación de HTTPS en el equilibrador de carga con una
VLAN para mejorar la seguridad
AWS proporciona HTTPS de terminación de los equilibradores de carga en forma de
ELB (equilibradores de carga elásticas) y puede utilizar sus grupos de seguridad o
nubes privadas virtuales (VPC) para poner en práctica la VLAN. De lo contrario, el
software como mod_proxy puede desempeñar un papel similar al de un equilibrador
de carga de software. Muchas organizaciones tienen equilibradores de carga de
hardware, que pueden ser difíciles de automatizar. En tales circunstancias, me he
encontrado la defensa de los equilibradores de carga de software que se sientan detrás
de los equilibradores de carga de hardware para permitir que los equipos de la
libertad para volver a configurar estos como sea necesario. Usted quiere ver el hecho
de que toda la carga con demasiada frecuencia el hardware balanceadores sí son
puntos únicos de fallo! Independientemente del enfoque que toma, al considerar la
configuración de un equilibrador de carga, lo tratan como tratas a la configuración de
su servicio:
equilibradores de carga nos permite añadir más instancias de nuestra microService de
una manera que sea transparente para los consumidores de servicios. Esto nos da una
mayor capacidad para manejar la carga, y también reducir el impacto de un solo
defecto de acogida. Sin embargo, muchos, si no la mayoría, de sus microservicios
tendrán algún tipo de almacén de datos persistente, probablemente, una base de datos
que se sienta en una máquina diferente. Si tenemos varias instancias
MICROSERVICE en diferentes máquinas, pero sólo un único host que ejecuta la
instancia de base de datos, nuestra base de datos sigue siendo una fuente única de
fracaso. Vamos a hablar acerca de los patrones de manejar esto en breve.
Sistemas del trabajador de base
El balanceo de carga no es la única manera de tener múltiples instancias de su carga
cuota de servicio y reducir la fragilidad. Dependiendo de la naturaleza de las
operaciones, un sistema basado en el trabajador podría ser igual de eficaz. Aquí, una
colección de instancias de todo el trabajo en alguna acumulación de trabajo común.
escalamiento |
221
Esto podría ser una serie de procesos de Hadoop, o tal vez un número de oyentes a
una cola compartida de trabajo. Este tipo de operaciones son también
220 | Capítulo 11: microservicios a escala
adecuado para el trabajo por lotes o asíncronas. Piense en tareas como la imagen en
miniatura cessing pro, el envío de correo electrónico, o la generación de informes.
El modelo también funciona bien para la carga con picos, donde se pueden girar las
instancias adicionales de la demanda para que coincida con la carga que entra.
Mientras la cola de trabajo en sí es resistente, este modelo se puede utilizar para
escalar tanto para mejorar el rendimiento del trabajo, pero también para mejorar la
capacidad de recuperación, el impacto de un trabajador no (o no estar allí) es fácil de
tratar. El trabajo se llevará más tiempo, pero nada se pierde.
He visto que esto funciona bien en organizaciones donde hay una gran cantidad de
capacidad de cómputo no utilizado en determinados momentos del día. Por ejemplo,
durante la noche no puede ser que necesite tantas máquinas para ejecutar su sistema
de comercio electrónico, por lo que puede utilizar de forma temporal para que se
ejecuten los trabajadores para un trabajo de informes en su lugar.
Con los sistemas basados en los trabajadores, aunque los trabajadores mismos no
tiene por qué ser fiable, el sistema que contiene el trabajo que se hará lo hace. Se
podía manejar esto mediante la ejecución de un intermediario de mensajes
persistentes, por ejemplo, o tal vez un sistema como el Zoo-arquero. La ventaja aquí
es que si usamos el software existente para este fin, alguien ha hecho gran parte del
trabajo duro por nosotros. Sin embargo, todavía necesitamos saber cómo configurar y
mantener estos sistemas de una manera flexible.
Empezando de nuevo
La arquitectura que le ayudará a comenzar puede no ser la arquitectura que le
mantiene en marcha cuando el sistema tiene que manejar muy diferentes volúmenes
de carga. Como dijo Jeff Dean en su presentación “Desafíos en la construcción de
información a gran escala sistemas de recuperación” (WSDM conferencia de 2009),
que debería “diseño para ~ 10 × crecimiento, pero el plan de volver a escribir antes
de ~ 100 ×.” En ciertos puntos, es necesario hacer algo bastante radical para apoyar
el siguiente nivel de crecimiento.
Recordemos la historia de la cerda joven, que hemos tocado en Capítulo 6. Una
simple aplicación monolítica rieles hizo así para la cerda joven durante dos años. Su
actividad se convirtió en un éxito creciente, lo que significa más clientes y más carga.
En un determinado punto de inflexión, la compañía tuvo que rediseñar la aplicación
para manejar la carga que estaba viendo.
Un rediseño puede significar una división aparte monolito existente, como lo hizo
para la cerda joven. O puede significar recoger nuevos almacenes de datos que
pueden manejar mejor la carga, lo que vamos a ver en un momento. También podría
significar la adopción de nuevas técnicas, tales como pasar de síncrono de solicitud /
respuesta a los sistemas basados en eventos, la adopción de nuevas plataformas de
despliegue, el cambio de pilas de tecnología enteros, o todo lo demás.
Existe el peligro de que la gente vea la necesidad de rearchitect cuando ciertos
escalamiento |
221
umbrales de escala se alcanzan como una razón para construir de forma masiva desde
el principio. Esto puede ser desastroso. Al inicio de un nuevo proyecto, que a
menudo no sabemos exactamente lo que queremos construir, ni tampoco sabemos si
va a ser un éxito. Necesitamos ser capaces de experimentar rápidamente, y entender
qué capacidades que necesitamos para construir. Si tratamos de construcción
220 | Capítulo 11: microservicios a escala
de forma masiva en la delantera, que acabaríamos de carga frontal una enorme
cantidad de trabajo para pre- parar de carga que puede no llegar nunca, mientras
que el desvío de esfuerzo fuera de las actividades más importantes, como la
comprensión si alguien va a querer utilizar realmente nuestro producto . Eric
Ries cuenta la historia de pasar seis meses en la creación de un producto que
nadie cargado Down-. Pensó que podía haber puesto un enlace en una página
web que 404'd cuando la gente hace clic en él para ver si había alguna demanda,
pasó seis meses en la playa en su lugar, y aprendió igual forma!
La necesidad de cambiar nuestros sistemas para hacer frente a escala no es una señal
de fracaso. Es un signo de éxito.
Bases de datos de escala
Escalamiento microservicios sin estado es bastante sencillo. Pero lo que si estamos
almacenando los datos en una base de datos? Tendremos que saber cómo escalar eso
también. Los diferentes tipos de bases de Data- proporcionan diferentes formas de
escalamiento, y comprender lo que se adapte a su forma de casos de uso mejor se
asegurará de que selecciona la tecnología de base de datos desde el principio.
Disponibilidad de servicio Versus Durabilidad de Datos
Directamente hacia afuera, es importante separar el concepto de disponibilidad del
servicio de la durabilidad de los datos en sí. Es necesario comprender que estos son
dos cosas diferentes, y como tal, tendrá diferentes soluciones.
Por ejemplo, podría almacenar una copia de todos los datos escritos en mi base de
datos en un sistema de Archivo- resistente. Si la base de datos se pone, mis datos no
se pierde, ya que tengo una copia, pero la base de datos en sí no está disponible, lo
que puede hacer mi microService disponible también. Un modelo más com- mon
sería el uso de un modo de espera. Todos los datos escritos en la base de datos
primaria se copia en la base de datos de réplica de espera. Si el principal se
interrumpa, mis datos es segura, pero sin un mecanismo que sea traer una copia de
seguridad o promover la réplica a la primaria, no tenemos una base de datos
disponible, a pesar de que nuestros datos es segura.
Escalamiento de Lee
Muchos los servicios son de lectura en su mayoría. Piense en un servicio de catálogo
que almacena la información de los artículos que tenemos para la venta. Añadimos
los registros de nuevos artículos sobre una base bastante irregular, y no sería en
absoluto sorprendente si tenemos más de 100 lecturas de los datos de nuestro
catálogo para cada escritura. Felizmente, la escala para lecturas es mucho más fácil
de escalar para escrituras. ING Cach- de datos puede desempeñar un papel
importante aquí, y vamos a discutir eso con mayor profundidad en breve. Otro
modelo es hacer uso de réplicas de lectura.
222| Capítulo 11: microservicios a escala
En un sistema de gestión de base de datos relacional (RDBMS) como MySQL o
Postgres, los datos pueden ser copiados desde un nodo primario a uno o más réplicas.
A menudo esto se hace para asegurar que una copia de nuestros datos se mantiene a
salvo, pero también se puede utilizar para distribuir nuestra lecturas. Un servicio
podría dirigir todas las escrituras en el nodo principal y único, pero distribuir lee
Bases de datos de escala |
223
a uno o más réplicas de lectura, como vemos en Figura 11-6. La replicación de la
base de datos mary pri- a las réplicas que sucede en algún momento después de la
escritura. Esto significa que con esta técnica se lee a veces puede ver datos obsoletos
hasta que la replicación tiene com- pletó. Con el tiempo las lecturas se verán los
datos consistentes. Tal configuración se llama eventu- aliado consistente, y si se
puede manejar la inconsistencia temporal es una manera bastante fácil y común para
ayudar a los sistemas de escala. Vamos a ver en esto con más profundidad en breve
cuando nos fijamos en el teorema de CAP.
Figura 11-6. El uso de réplicas de lectura a escala lee
Años Hace, usando réplicas de lectura a escala fue toda la rabia, aunque hoy en día te
sugeriría que mira a la memoria caché en primer lugar, ya que puede ofrecer mejoras
mucho más significativos en el rendimiento, a menudo con menos trabajo.
Escalamiento para escrituras
Lee son comparativamente fácil de escalar. ¿Qué pasa con las escrituras? Un método
consiste en utilizar sharding. Con sharding, tiene varios nodos de bases de datos. Se
toma un trozo de datos a escribir, aplicar una función hash a la clave de los datos, y
en base al resultado de la función aprende dónde enviar los datos. Para recoger un
ejemplo muy simplista (y de hecho mal), imagina que el cliente registra A-M ir a una
instancia de base de datos, y N-Z otra. Usted puede manejar esto por sí mismo en su
aplicación, pero algunas bases de datos, como Mongo, manejar mucho de él para
usted.
La complejidad con sharding para escrituras proviene de consultas de manipulación.
Mirando hacia arriba un registro individual es fácil, ya que sólo puede aplicar la
función hash para encontrar qué instancia los datos deben estar en, y luego
recuperarla desde el fragmento correcto. Pero, ¿qué acerca de las consultas que
abarcan los datos en múltiples nodos, por ejemplo, la búsqueda de todos los tomers
cliente central que tienen más de 18 años? Si desea consultar todos los fragmentos,
ya sea que tenga que mirar cada fragmento individual y unirse en la memoria, o tiene
una tienda de lectura alternativa en la que ambos conjuntos de datos están
224| Capítulo 11: microservicios a escala
disponibles. A menudo, la consulta a través de fragmentos es manejado por un
asynchro-
Bases de datos de escala |
225
mecanismo nous, utilizando los resultados almacenados en caché. Mongo utiliza map
/ reduce puestos de trabajo, por ejemplo, para llevar a cabo estas consultas.
Una de las preguntas que surge con los sistemas fragmentados es, ¿qué ocurre si
desea añadir un nodo de base de datos adicional? En el pasado, esto a menudo
requeriría tiempo, especialmente Down- significativo para grandes grupos, como es
posible que tenga que tomar toda la base de datos de abajo y reequilibrar los datos.
Más recientemente, los sistemas de apoyo más la adición de fragmentos adicionales a
un sistema vivo, en el reequilibrio de datos ocurre en el fondo; Cassandra, por
ejemplo, maneja muy bien. Adición de fragmentos a un clúster existente no es para
los débiles de corazón, sin embargo, así que asegúrese de probar esto a fondo.
Sharding para escrituras puede escalar para el volumen de escritura, pero no puede
mejorar la resistencia. Si el cliente registra A-H siempre van a Instancia X y X
Instancia no está disponible, el acceso a los registros A-H se puede perder. Cassandra
ofrece capacidades adicionales aquí, donde podemos asegurar que los datos se
replican a múltiples nodos en un anillo (plazo de Cassandra para una colección de
nodos de Cassandra).
Como puede haber inferido a partir de este breve resumen, de escala bases de datos
de las escrituras son donde las cosas se ponen muy complicado, y donde las
capacidades de las distintas bases de datos realmente comienzan a diferenciarse. A
menudo veo a la gente evolución de la tecnología de base de datos cuando empiezan
a golpear límites a la facilidad con que se puede ampliar su volumen de escritura
existentes. Si esto le sucede, la compra de una caja más grande es a menudo la
manera más rápida de resolver el proble- ma, pero en el fondo es posible que desee
mirar a sistemas como Cassandra, Mongo, o Riak para ver si sus modelos de escala
alternativos que podrían ofrecer una solución a largo plazo mejor.
Infraestructura base de datos compartida
Algunos tipos de bases de datos, tales como los RDBMS tradicionales, separar el
concepto de la propia base de datos y el esquema. Esto significa una base de datos en
ejecución podría alojar múltiples, esquemas independientes, una para cada
microService. Esto puede ser muy útil en términos de reducir el número de máquinas
que necesitamos para funcionar nuestro sistema, pero estamos introduciendo un
único punto importante de fracaso. Si esta infraestructura de base de datos baja, que
puede afectar múltiples microservicios a la vez, que podrían resultar en una
interrupción catastrófica. Si está ejecutando este tipo de configuración, asegúrese de
considerar los riesgos. Y estar muy seguro de que la base de datos en sí es tan
resistente como lo puede ser.
CQRS
La segregación (CQRS) patrón responsabilidad de mando-Query se refiere a un
modelo nate alter- para almacenar y consultar información. Con bases de datos
normales, utilizamos un sistema para realizar modificaciones a los datos y consulta
226| Capítulo 11: microservicios a escala
de los datos. Con CQRS, parte del sistema se ocupa de comandos, que las solicitudes
de captura para modificar el estado, mientras que otra parte de las ofertas del sistema
con consultas.
Bases de datos de escala |
227
Comandos vienen en solicitar cambios en el estado. Estos comandos son validados, y
si trabajan, van a ser aplicados al modelo. Los comandos debe contener informa- ción
acerca de su intención. Ellos pueden ser procesados manera síncrona o asíncrona,
permitiendo diferentes modelos para manejar escalamiento; Podríamos, por ejemplo,
acaba de poner en cola las peticiones entrantes y procesarlos posteriormente.
La conclusión clave aquí es que los modelos internos utilizados para manejar los
comandos y consultas son en sí mismos completamente separados. Por ejemplo,
podría elegir para manejar y los comandos de proceso como eventos, tal vez sólo el
almacenamiento de la lista de comandos en un almacén de datos (un proceso
conocido como el abastecimiento de eventos). Mi modelo de consulta podría
consultar un almacén de eventos y crear proyecciones de eventos almacenados a
montar el estado de los objetos de dominio, o simplemente podría recoger una
alimentación de la parte de comandos del sistema para actualizar un tipo diferente de
tienda. En muchos sentidos, se obtienen los mismos beneficios de las réplicas de
lectura que dis- cussed antes, sin el requisito de que el almacén de respaldo para las
réplicas ser el mismo que el almacén de datos utiliza para manejar las modificaciones
de datos.
Esta forma de separación permite diferentes tipos de escala. Las partes de mando y
de consulta de nuestro sistema podrían vivir en diferentes servicios, o en otro
hardware, y podrían hacer uso de radicalmente diferentes tipos de almacén de datos.
Esto puede desbloquear un gran nú- mero de maneras de manejar escala. Incluso se
puede soportar diferentes tipos de formatos de lectura al tener múltiples
implementaciones de la pieza de consulta, tal vez el apoyo a una representación
basada graph- de sus datos, o una / formulario de claves basado en el valor de sus
datos.
Se advirtió, sin embargo: este tipo de patrón es bastante un cambio desde un modelo
en un solo almacén de datos se encarga de todas las operaciones CRUD. He visto
más de una experimenté lucha equipo de desarrollo para conseguir este patrón
correcto!
El almacenamiento en caché
El almacenamiento en caché es una optimización del rendimiento de uso común
mediante el cual se almacena el resultado anterior de alguna operación, por lo que las
solicitudes posteriores pueden usar este valor almacenado en lugar de gastar tiempo y
recursos recalcular el valor. Más a menudo que no, el almacenamiento en caché se
trata de eliminar innecesarios de ida y vuelta a las bases de datos u otros servicios a
ofrecer resultados más rápido. Bien utilizada, se puede producir enormes beneficios
en el rendimiento. La razón de que HTTP escalas tan bien en el manejo de un gran
número de peticiones es que el concepto de almacenamiento en caché está integrada.
Incluso con una simple aplicación web monolítica, hay un buen número de opciones
en cuanto a dónde y cómo almacenar en caché. Con una arquitectura microService,
El
almacenamiento
en caché | 225
donde cada servicio es su propia fuente de datos y el comportamiento, tenemos
muchas más opciones para decidir acerca de dónde y cómo almacenar en caché. Con
un sistema distribuido, por lo general pensamos en el almacenamiento en caché, ya
sea en el lado del cliente o en el servidor. Pero que es el mejor?
226| Capítulo 11: microservicios a escala
Del lado del cliente, proxy y almacenamiento en caché del lado
del servidor
En la caché del cliente, el cliente almacena el resultado en caché. El cliente puede
decidir cuando (y si) va y recupera una copia fresca. Idealmente, el servicio de aguas
abajo proporcionará consejos para ayudar al cliente a entender qué hacer con la
respuesta, por lo que sabe cuándo y si para hacer una nueva solicitud. Con el
almacenamiento en caché de proxy, la representación se coloca entre el cliente y el
servidor. Un buen ejemplo de esto es usar una red proxy o entrega de contenido
inversa (CDN). Con el almacenamiento en caché del lado del servidor, el servidor se
encarga de la responsabilidad de almacenamiento en caché, tal vez haciendo uso de
un sistema como Redis o Memcache, o incluso un simple caché en memoria.
¿Cuál tiene más sentido depende de lo que está tratando de optimizar. el
almacenamiento en caché del lado del cliente puede ayudar a reducir drásticamente la
red llama, y puede ser una de las maneras más rápidas de reducir la carga en un
servicio de aguas abajo. En este caso, el cliente es responsable del comportamiento
de caché, y si desea realizar cambios en cómo se realiza el almacenamiento en caché,
roll-ing a cabo cambios en un número de consumidores podría ser difícil. La
invalidación de datos obsoletos también puede ser más complicado, aunque vamos a
discutir algunos mecanismos para lidiar con esto en un momento.
Con proxy caché, todo es opaco tanto para el cliente y el servidor. Esto es a menudo
una forma muy sencilla de añadir almacenamiento en caché a un sistema existente. Si
el proxy está diseñado para almacenar en caché el tráfico genérico, también se puede
almacenar en caché más de un servicio; un ejemplo común es un proxy inverso como
el calamar o el barniz, que se puede almacenar en caché todo el tráfico HTTP. Tener
un proxy entre el cliente y el servidor sí introduce saltos de red adicionales, aunque
en mi experiencia, es muy raro que esto causa problemas, como las optimizaciones
DESEMPEÑO resultantes de la misma almacenamiento en caché superan a los costes
adicionales de la red.
Con el almacenamiento en caché del lado del servidor, todo es opaco a los clientes;
que no es necesario que preocuparse de nada. Con una memoria caché cerca o dentro
de un límite de servicio, puede ser más fácil de razonar acerca de cosas como la
invalidación de los datos, o hacer un seguimiento y optimizar aciertos de caché. En
una situación en la que tiene varios tipos de clientes, una memoria caché del lado del
servidor podría ser la manera más rápida para mejorar el rendimiento.
Para cada sitio web de cara al público que he trabajado, hemos acabado haciendo una
mezcla de los tres enfoques. Pero para más de un sistema distribuido, he salido con
ningún almacenamiento en caché en absoluto. Pero todo se reduce a saber lo que la
carga que necesita para manejar, la frescura de sus datos tiene que ser, y lo que su
sistema puede hacer en este momento. Saber que tiene un número de diferentes
herramientas a su disposición es sólo el principio.
El
almacenamiento
en caché | 227
El almacenamiento en caché de HTTP
HTTP proporciona algunos controles muy útiles para ayudarnos a almacenamos en
caché ya sea en el lado del cliente o del lado del servidor, que son vale la pena
entender, incluso si no está utilizando HTTP en sí.
228| Capítulo 11: microservicios a escala
En primer lugar, con HTTP, podemos utilizar las directivas de control de caché en
nuestras respuestas a los clientes. Indican a los clientes si se debe almacenar en caché
el recurso en absoluto, y si es así cuánto tiempo deben almacenar en caché para que
en cuestión de segundos. También tenemos la opción de establecer un Expira
cabecera, donde en lugar de decir cuánto tiempo una parte del contenido puede ser
almacenado en caché para, especificamos una hora y fecha en la que un recurso debe
considerarse obsoleta y fue a buscar de nuevo. La naturaleza de los recursos que está
compartiendo determina cuál es la más probable para adaptarse. contenido del sitio
web estática estándar como CSS o imágenes menudo encaja bien con un simple
control de tiempo Cache de vida (TTL). Por otro lado, si usted sabe de antemano
cuándo se actualizará una nueva versión de un recurso, el establecimiento de un
Expira cabecera tendrá más sentido.
Aparte de Cache-Control y expira, tenemos otra opción en nuestro arsenal de
golosinas http: Entidad Etiquetas o ETags. Un ETag se utiliza para determinar si el
valor de un recurso ha cambiado. Si puedo actualizar un registro de cliente, el URI
para el recurso es el mismo, pero el valor es diferente, por lo que se puede esperar la
ETag para cambiar. Esto se convierte en poderoso cuando estamos usando lo que se
llama un GET condicional. Al hacer una petición GET, podemos especificar
cabeceras adicionales, contando el servicio para enviar el recurso sólo si se cumplen
ciertos criterios.
Por ejemplo, imaginemos que nos trae un registro de clientes, y su ETag va
recuperando a medida o5t6fkd2sa. Más adelante, tal vez debido a una directiva de
control de caché nos ha dicho el recurso debe considerarse rancio, queremos
asegurarnos de obtener la última versión. Al emitir la solicitud GET posterior,
podemos pasar en un If-None-Match: o5t6fkd2sa. Esto le dice al servidor que
queremos que el recurso en el URI especificado, a menos que ya coincide con este
valor ETag. Si ya tenemos la versión actualizada, el servicio nos envía una respuesta
304 no modificado, que nos dice que tenemos la última versión. Si hay una nueva
versión disponible, se obtiene un 200 OK con el recurso cambiado, y un nuevo ETag
del recurso.
El hecho de que estos controles están integrados en dicha especificación ampliamente
utilizados como medio de llegar a tomar ventaja de una gran cantidad de software
pre-existente que maneja el almacenamiento en caché para nosotros. proxies inversos
como el calamar o el barniz pueden sentarse de forma transparente en la red entre el
cliente y el servidor, almacenamiento y terminaría contenido almacenado en caché
según sea necesario. Estos sistemas están orientados hacia el servicio a un gran
número de solicitudes simultáneas muy rápido, y son una manera de escalar Dard
Están- sitios web de cara al público. CDN como CloudFront de AWS o Akamai
pueden asegurar que las peticiones son redirigidas a cachés cerca del cliente que
llama, asegurándose de que el tráfico no va a mitad de camino alrededor del mundo
cuando se necesita. Y más prosaicamente, bibliotecas de cliente HTTP y cachés
cliente pueden manejar una gran cantidad de este trabajo para nosotros.
El
almacenamiento
en caché | 229
ETags, Expira, y Cache-Control puede solapar un poco, y si no se tiene
cuidado puede llegar a dar información contradictoria si decide utilizar
todos ellos! Para una discusión más a fondo de los varios méritos, echar
un vistazo al libroDescansar en la Práctica
230| Capítulo 11: microservicios a escala
(O'Reilly) o sección de lectura 13 de la HTTP especificación 1.1, Que describe cómo
se supone que tanto los clientes como los servidores para poner en práctica estos
diversos controles.
Ya sea que decida utilizar HTTP como protocolo entre los servicios, el
almacenamiento en caché en el cliente y reducir la necesidad de viajes ida y vuelta al
cliente es bien vale la pena. Si decide elegir un protocolo diferente, comprender
cuándo y cómo se puede proporcionar pistas a la ent CLI- para ayudar a entender
cuánto tiempo se puede almacenar en caché para.
El almacenamiento en caché para escrituras
Aunque se encontrará utilizar la caché para lecturas más a menudo, hay algunos
casos de uso en el almacenamiento en caché de escritura tiene sentido. Por ejemplo,
si hace uso de las rebajas de valor detrás de caché, se puede escribir en una caché
local, y en algún momento más tarde, los datos se vaciarán a una fuente de aguas
abajo, probablemente la fuente canónica de datos. Esto puede ser útil cuando se tiene
estallidos de las escrituras, o cuando hay una buena probabilidad de que los mismos
datos se escribirán en múltiples ocasiones. Cuando se utiliza para amortiguar y
potencialmente lotes escribe, cachés de escritura en segundo puede ser una
optimización del rendimiento más útil.
Con una memoria caché de escritura en segundo, si las escrituras son adecuadamente
tamponadas persistente, incluso si el servicio no está disponible aguas abajo que
podríamos poner en cola las escrituras y enviarlos a través cuando esté disponible de
nuevo.
El almacenamiento en caché de resiliencia
El almacenamiento en caché se puede utilizar para poner en práctica la resistencia en
caso de fallo. Con el lado del cliente ING cach-, si el servicio de aguas abajo no está
disponible, el cliente podría decidir simplemente utilizar los datos en caché, pero
potencialmente obsoletos. También podríamos usar algo como un proxy inverso para
servir datos obsoletos. Para algunos sistemas, estando disponible incluso con datos
obsoletos es mejor que no devolver un resultado en absoluto, sino que es una
cuestión de criterio que tendrá que realizar. Obviamente, si no tenemos los datos
solicitados en la memoria caché, entonces no podemos hacer mucho para ayudar,
pero hay maneras de mitigar esto.
Una técnica que vi utilizado en el Guardian, y posteriormente en otro lugar, era para
rastrear el sitio vivo existente periódicamente para generar una versión estática de la
página web que se podría servir en caso de un corte de luz. Aunque esta versión se
arrastró no era tan fresco como el contenido almacenado en caché sirve desde el
sistema en vivo, en caso de apuro que podría asegurar que una versión del sitio
conseguiría que se muestra.
El
almacenamiento
en caché | 231
Ocultar el origen
Con una caché normal, Si la solicitud se traduce en una pérdida de caché, la solicitud
pasa al origen en busca de los nuevos datos con el bloqueo de llamadas, a la espera
del resultado. En el curso normal de las cosas, esto es de esperar. Pero si sufrimos un
fallo masivo caché, tal vez porque una máquina completa (o grupo de máquinas) que
proporcionan nuestra caché fallan, un gran número de solicitudes golpeará el origen.
232| Capítulo 11: microservicios a escala
Para aquellos servicios que sirven de datos altamente cachable, es común que el
origen en sí a ser escalado para manejar sólo una fracción del total del tráfico, como
la mayoría de las peticiones que nos sirvieran de memoria por los cachés que se
sientan delante del origen. Si de repente tenemos una tormenta Se manada debido a
toda una región de caché de fuga, nuestro origen podría ser golpeado fuera de la
existencia.
Una forma de proteger el origen de esta situación es no permitir nunca que las
solicitudes para ir al origen en el primer lugar. En su lugar, el origen en sí llena el
caché asynchro- nously cuando sea necesario, como se muestra enFigura 11-7. Si se
produce un fallo de caché, lo que desencadena un evento que el origen puede recoger
en, alertando que necesita para repoblar la caché. Así que si todo un fragmento ha
desaparecido, podemos reconstruir la memoria caché en el fondo. Podríamos decidir
bloquear la solicitud original a la espera de la región a ser repoblación ted, pero esto
podría causar la contención en el propio caché, lo que lleva a más problemas. Es más
probable si estamos dando prioridad mantener estable el sistema que queremos fallar
la solicitud original, pero fallaría rápido.
Figura 11-7. Ocultar el origen del cliente y poblar la memoria caché de forma
asíncrona
Este tipo de enfoque puede no tener sentido para algunas situaciones, pero puede ser
una manera de asegurar que el sistema se mantiene cuando partes de ella fallan. Al
no deseos de manera rápida y fin de • asegurar que no tomamos los recursos o
aumentar la latencia, evitamos un fallo en nuestra caché de cascada aguas abajo y nos
damos la oportunidad de recuperarse.
Mantenlo simple
Tenga cuidado con el almacenamiento en caché en demasiados lugares! Las cachés
más entre usted y la fuente de los datos frescos, más rancio los datos pueden ser, y la
más difícil que puede ser para deter- minar la frescura de los datos que un cliente ve
con el tiempo. Esto puede ser especialmente problemático con una arquitectura
microService donde tiene muchos servicios que intervienen en una cadena de
El
almacenamiento
en caché | 233
llamadas. Una vez más, el almacenamiento en caché más tienes, más difícil será
evaluar la frescura de cualquier pedazo de datos. Así que si usted piensa que una
memoria caché es una buena idea, que sea sencillo, se adhieren a uno, y pensar
cuidadosamente antes de añadir más!
234| Capítulo 11: microservicios a escala
El envenenamiento de la caché: un cuento aleccionador
Con almacenamiento en caché a menudo pensamos que si lo hacemos mal lo peor
que puede suceder es que servimos datos antiguos para un poco. ¿Pero qué sucede si
al final sirviendo datos obsoletos para- siempre? Antes he mencionado el proyecto
trabajé en donde estábamos usando una aplicación estrangulador para ayudar a
interceptar llamadas a múltiples sistemas heredados con una vista del recuento
incremen- retirarlos. Nuestra aplicación opera efectivamente como un proxy. El
tráfico a nuestra solicitud se enruta a través de la aplicación heredada. En el camino
de vuelta, hicimos algunas cosas de limpieza; por ejemplo, nos aseguramos de que
los resultados de la aplicación heredada tenían cabeceras de caché HTTP propio
aplicado.
Un día, poco después de la liberación rutina normal, algo extraño comenzó a suceder.
Un error había sido introducida por el que un pequeño subconjunto de páginas
estaban cayendo a través de una condición lógica en nuestro código de inserción de
cabecera caché, lo que resulta en nosotros no cambiar la cabecera en absoluto. Por
desgracia, esta aplicación aguas abajo también había sido cambiado en algún
momento con anterioridad incluir un Expira: Nunca cabecera HTTP. Esto no había
tenido ningún efecto anterior, ya que estábamos preponderantes con esta cabecera.
Ahora no estábamos.
Nuestra aplicación hace un uso intensivo de calamar para almacenar en caché el
tráfico HTTP, y nos dimos cuenta el problema con bastante rapidez, ya que
estábamos viendo más solicitudes sin pasar por sí calamar para golpear nuestros
servidores de aplicaciones. Hemos fijado el código de cabecera caché y empujó un
comunicado, y también borrar manualmente la región correspondiente de la caché de
Squid. Sin embargo, eso no fue suficiente.
Como he mencionado anteriormente, se puede almacenar en caché en múltiples
lugares. Cuando se trata de servir a contenido a los usuarios de una aplicación web
orientada al público, se pueden tener varias cachés entre usted y su cliente. No sólo
puede usted estar al frente de su sitio web con algo así como un CDN, pero algunos
proveedores de Internet hacen uso de almacenamiento en caché. Se puede controlar
esos cachés? E incluso si se pudiera, hay una caché que tiene poco control sobre: la
memoria caché en el navegador del usuario.
Esas páginas con Expira: Nunca atrapados en las cachés de muchos de nuestros
usuarios, y que nunca se invaliden hasta que la caché se ha llenado o el usuario las
limpiado manualmente. Es evidente que no podríamos hacer cualquiera cosa suceda;
nuestra única opción era cambiar las URL de estas páginas para que se re-cargada.
El almacenamiento en caché puede ser muy poderoso, pero hay que entender la ruta
completa de datos que se almacena en caché del origen al destino para apreciar su
complejidad y lo que puede ir mal.
230 | Capítulo 11: microservicios a escala
autoscaling
Si tienes la suerte de tener el aprovisionamiento completamente automatizados de
hosts virtuales, y puede automatizar completamente el despliegue de las instancias
MICROSERVICE, entonces usted tiene los bloques de construcción que permitan
aplicar una escala automática sus microservicios.
autoscaling | 231
Por ejemplo, usted podría también tener la escala provocada por las tendencias
conocidas. Es posible saber que la carga máxima del sistema está entre 9 am y 5 pm,
de modo que aparezca instancias adicionales a las 8:45 am, y apagarlos a las 5:15
pm. Si usted está usando algo como AWS (que tiene muy buen soporte para
AutoScaling incorporada), la desactivación de los casos no es necesario por más
tiempo le ayudará a ahorrar dinero. Que necesita los datos para entender cómo su
carga cambia con el tiempo, de día a día, semana a semana. Algunas empresas tienen
ciclos estacionales obvias también, así que es posible que necesite los datos que se
remontan una manera justa para hacer llamadas de juicio adecuados.
Por otra parte, usted podría ser reactivo, con lo que las instancias adicionales cuando
se ve un aumento en la carga o un fallo de instancia y eliminar instancias cuando ya
no los necesitaba. Sabiendo lo rápido que puede escalar hasta una vez a detectar una
tendencia al alza es la clave. Si sabe que sólo obtendrá un par de minutos de
antelación acerca de un aumento de la carga, pero la ampliación va a tomar por lo
menos 10 minutos, se sabe que necesitará para mantener una capacidad extra en
torno a llenar este vacío. Tener un buen conjunto de pruebas de carga es casi esencial
aquí. Usted las puede utilizar para probar sus reglas AutoScaling. Si usted no tiene
pruebas que pueden reproducir diferentes cargas que activarán escalado, entonces
sólo se va a encontrar en la producción si tienes las reglas equivocadas. Y las
consecuencias del fracaso no son grandes!
Un sitio de noticias es un gran ejemplo de un tipo de negocio donde es posible que
desee una mezcla de escalamiento predictivo y reactivo. En el último sitio de noticias
que trabajé, vimos muy claras tendencias diarias, con vistas a la escalada de la
mañana a la hora del almuerzo y luego comenzar a declinar. Este patrón se repite día
tras día, con un tráfico menos pronunciada en el fin de semana. Que le dio una
tendencia bastante clara que podría conducir escala proactiva hacia arriba (y abajo)
de los recursos. Por otro lado, una gran noticia provocaría un aumento inesperado,
que requiere más capacidad a menudo corto plazo.
en realidad veo AutoScaling utilizado mucho más para el manejo de la insuficiencia
de instancias que para reaccionar a las condiciones de carga. AWS permite
especificar reglas como “Debe haber por lo menos 5 casos de este grupo,” por lo que
si alguien se sumerge uno nuevo se pone en marcha automáticamente. He visto este
enfoque conduce a un divertido juego de golpe-a-mole cuando alguien se olvida de
apagar la regla y luego intenta acabar con los casos de mantenimiento, sólo para
verlos seguir girando arriba!
Tanto la escala reactiva y predictiva son muy útiles, y puede ayudar a ser mucho más
rentable si usted está utilizando una plataforma que le permite pagar sólo por los
recursos informáticos que utiliza. Pero también requieren una cuidadosa observación
de los datos disponibles para usted. Yo sugeriría el uso automático de escala para las
condiciones de falla primero, mientras que recoja los datos. Una vez que desee iniciar
la ampliación de la carga, asegúrese de que está muy cauteloso acerca de la
expansión demasiado rápido. En la mayoría de las situaciones, tener más potencia de
230 | Capítulo 11: microservicios a escala
cálculo en las manos de lo que necesita es mucho mejor que no tener suficiente!
autoscaling | 231
Teorema de la PAC
Nos gustaría tener todo, pero por desgracia sabemos que no se puede. Y cuando se
trata de sistemas distribuidos como los que construimos utilizando arquitecturas
MICROSERVICE, incluso tenemos una prueba matemática que nos dice que no
podemos. Es posible que así haya escuchado sobre el teorema de la PAC, sobre todo
en las discusiones sobre los méritos de varios tipos diferentes de almacenes de datos.
En su corazón se nos dice que en un sistema distribuido, tenemos tres cosas que
podemos comercio se enfrenten entre sí: la consistencia, la disponibilidad y
tolerancia a la partición. En concreto, el teorema nos dice que tiene que mantener dos
en un modo de fallo.
La consistencia es la característica del sistema por el cual voy a tener la misma
respuesta si voy a múltiples nodos. Disponibilidad significa que cada solicitud recibe
una respuesta. la tolerancia de la partición es la capacidad del sistema para manejar el
hecho de que la comunicación entre las partes que a veces es imposible.
Desde Eric Brewer publicó su conjetura original, la idea ha ganado una prueba de cal
matemáticamente. No voy a sumergirse en las matemáticas de la prueba en sí, ya que
no sólo es esto no ese tipo de libro, pero también puedo garantizar que iba a hacerlo
mal. En su lugar, vamos a utilizar algunos ejemplos prácticos que nos ayudarán a
entender que debajo de todo, la PAC teo rem es una destilación de un conjunto muy
lógica de razonamiento.
hemos Ya hablado de algunas técnicas de escalamiento de base de datos simples.
Vamos a usar uno de estos para sondear las ideas detrás del teorema de CAP.
Imaginemos que nuestro servicio de inventario se despliega a través de dos centros
de datos independientes, como se muestra enFigura 11-8. Copia de nuestra instancia
de servicio en cada centro de datos es una base de datos, y estas dos bases de datos se
comuniquen entre sí para tratar de sincronizar los datos entre ellos. Lee y escribe se
realizan a través del nodo de base de datos local, y la replicación se utiliza para
sincronizar los datos entre los nodos.
Ahora vamos a pensar en lo que sucede cuando algo falla. Imagínese que algo tan
simple como el enlace de red entre los dos centros de datos deja de funcionar. De
sincronía en este punto falla. Escrituras realizadas a la base de datos primaria en DC1
no se propagarán a DC2, y viceversa. La mayoría de las bases de datos que soportan
estas configuraciones también soportan una especie de cola técnica para asegurar que
podemos recuperar de esta sala después del horario, pero lo que sucede en el ínterin?
232| Capítulo 11: microservicios a escala
Figura 11-8. Uso de replicación multiprimary para compartir datos entre dos nodos de
base de datos
La consistencia sacrificar
Vamos Suponemos que no cerramos el servicio de inventario por completo. Si hago
un cambio ahora a los datos en DC1, DC2 en la base de datos no lo ve. Esto significa
que todas las solicitudes hechas a nuestro nodo de inventario en DC2 ver los datos
potencialmente obsoletos. En otras palabras, nuestro sistema está disponible en
ambos nodos que son capaces de servir las peticiones, y hemos mantenido el sistema
funcionando a pesar de la partición, pero hemos perdido la consistencia. Esto a
menudo se llama un sistema de AP. No se quedan con los tres.
Durante esta partición, si mantenemos la aceptación de las escrituras a continuación,
aceptamos el hecho de que en algún momento en el futuro que tienen que volver a
sincronizar. Cuanto más larga sea la partición dura, más difícil que puede llegar a ser
de resincronización.
La realidad es que incluso si no tenemos un fallo en la red entre los nodos de bases
de datos, replicación de datos no es instantáneo. Como mencioné antes, se dice que
están en consonancia eventu- aliado sistemas que están dispuestos a ceder
consistencia para mantener la tolerancia de la partición y la disponibilidad; es decir,
se espera que en algún momento en el futuro que todos los nodos verán los datos
actualizados, pero no va a suceder a la vez por lo que tenemos que vivir con la
posibilidad de que los usuarios ven los datos antiguos.
sacrificar la disponibilidad
¿Qué pasa si tenemos que mantener la consistencia y queremos dejar algo más en su
lugar? Pues bien, para mantener la coherencia, cada nodo de base de datos necesita
Teorema CAP | 233
saber la copia de los datos que tiene es el mismo que el otro nodo de base de datos.
Ahora en la partición, si los datos-
234| Capítulo 11: microservicios a escala
los nodos de base no pueden hablar el uno al otro, no pueden coordinar para asegurar
la consistencia. No somos capaces de garantizar la coherencia, por lo que nuestra
única opción es negarse a responder a la solicitud. En otras palabras, hemos
sacrificado disponibilidad. Nuestro sistema es consistente y partición tolerante, o CP.
En este modo nuestro servicio tendría que encontrar la manera de degradar la
funcionalidad hasta que la partición se curó y los nodos de base de datos puede
volver a sincronizarse.
La consistencia a través de múltiples nodos es muy duro. Hay pocas cosas (quizás
noth- ing) más duros en los sistemas distribuidos. Piensa un momento en ello.
Imagino quiero leer un registro desde el nodo de base de datos local. ¿Cómo sé que
es hasta la fecha? Tengo que ir y pedir el otro nodo. Pero también tengo que pedir
que el nodo base de datos para no permitir que se actualiza mientras que la lectura
completa; en otras palabras, lo que necesito para iniciar una transaccional leer a
través de múltiples nodos de base de datos para asegurar la consistencia. Pero, en
general, la gente no lo lee transaccional, ¿verdad? Debido transaccional lee son
lentos. Requieren cerraduras. Una lectura puede bloquear todo un sistema para arriba.
Todos los sistemas consistentes requieren un cierto nivel de bloqueo para hacer su
trabajo.
Como ya hemos comentado, los sistemas distribuidos tienen que esperar el fracaso.
Considere nuestra transaccional leer a través de un conjunto de nodos consistentes.
Les pido un nodo remoto para bloquear un registro dado, mientras se inicia la lectura.
Que complete la lectura, y pedir al nodo remoto para liberar su bloqueo, pero ahora
no puedo hablar con él. ¿Que pasa ahora? Cerraduras son muy duro para hacerlo bien
incluso en un solo sistema de proceso, y son significativamente más difíciles de las
aplicará también en un sistema distribuido.
Recuerde que cuando hablamos de transacciones distribuidas en Capítulo 5? El hijo
rea- núcleo están desafiando es debido a este problema de garantizar la coherencia a
través de múltiples nodos.
Conseguir la consistencia de varios nodos derecha es tan fuerte que me gustaría
firmemente, sugieren fuertemente que, si lo necesita, no trate de inventar por sí
mismo. En su lugar, elegir un almacén de datos o servicio cerradura que ofrece estas
características. Cónsul, por ejemplo, del que hablaremos en breve, implementa una
tienda de clave / valor fuertemente coherente diseñado para compartir con- figuración
entre varios nodos. Junto con “Los amigos no dejan amigos escribir su propio cripto”
debe ir “Los amigos no dejan que los amigos escriban su propio almacén de datos
coherente distribuida.” Si usted piensa que necesita para escribir su propio almacén
de datos CP, leer todos los documentos sobre el sujeto en primer lugar, a
continuación, obtener un doctorado, y luego mirar hacia adelante a pasar unos años
hacerlo mal. Mientras tanto, voy a utilizar algo fuera de la plataforma que lo hace por
mí, o más probablemente tratando muy duro para construir sistemas de AP,
finalmente, consistentes en su lugar.
Teorema CAP | 235
Sacrificar la tolerancia de reparto?
Nosotros dan a elegir dos, ¿verdad? Así que tenemos nuestro sistema de AP
eventualmente consistentes. Tenemos nuestra consistente, pero difícil de construir y
sistema de escala, CP. ¿Por qué no un sistema de CA? Pues bien, ¿cómo podemos
sacrificar la tolerancia partición? Si nuestro sistema no tiene tolerancia partición,
236| Capítulo 11: microservicios a escala
no se puede ejecutar en una red. En otras palabras, tiene que ser un proceso único que
opera localmente. sistemas de CA no existen en los sistemas distribuidos.
AP o CP?
¿Qué es el adecuado, AP o CP? Bueno, la realidad es que depende. A medida que la
gente la construcción del sistema, sabemos que existe la disyuntiva. Sabemos que los
sistemas de AP escalar más fácilmente y son más fáciles de construir, y sabemos que
un sistema CP requerirá más trabajo debido a los desafíos en el apoyo a la
consistencia distribuida. Pero no podemos entender el impacto comercial de esta
disyuntiva. Para nuestro sistema de inventario, si un registro está actualizado por
cinco minutos, es que está bien? Si la respuesta es sí, un sistema de AP podría ser la
respuesta. Pero ¿qué pasa con el saldo a cabo para un cliente en un banco? ¿Puede ser
fuera de fecha? Sin conocer el contexto en el que se utiliza la operación, no podemos
saber lo que hay que hacer. Conocer el teorema CAP simplemente le ayuda a
comprender que existe esta disyuntiva y qué preguntas hacer.
No es todo o nada
Nuestro sistema en su conjunto no tiene por qué ser de AP o CP. Nuestro catálogo
podría ser AP, ya que no importa demasiado acerca de un registro rancio. Sin
embargo, podemos decidir que nuestro servicio de inventario tiene que ser CP, ya
que no queremos vender un cliente algo que no tenemos y luego tener que
disculparse después.
Pero los servicios individuales ni siquiera necesitan ser CP o AP.
Vamos pensar acerca de nuestro servicio de saldo de puntos, ya que guarda un
registro de la cantidad de puntos Alty loy- nuestros clientes han construido.
Podríamos decidir que no nos importa si el saldo se muestra por un cliente está
demasiado cargado, pero que cuando se trata de la actualización de un equilibrio que
necesitamos que sea consistente para asegurar que los clientes no utilizar más puntos
que tienen disponible. Es esta microService CP, o AP, o se trata de ambas cosas? En
realidad, lo que hemos hecho es empujar las compensaciones de todo el teorema de
CAP a las capacidades de servicio individuales.
Otra complicación es que ni la consistencia ni la disponibilidad es todo o nada.
Muchos sistemas de nosotros un cada vez más matizado disyuntiva permiten. Por
ejemplo, con Cassandra puedo hacer diferentes compensaciones para llamadas
individuales. Así que si necesito estricta coherencia, puedo per- formar una lectura
que bloquea hasta que todas las réplicas han respondido confirmando el valor es
Consistente, o hasta que un quórum específico de réplicas han respondido, o incluso
sólo un único nodo. Obviamente, si puedo bloquear la espera de todas las réplicas
que informe y uno de ellos no está disponible, voy a estar bloqueando desde hace
mucho tiempo. Pero si estoy satisfecho con sólo un simple quórum de nodos
informar, puedo aceptar cierta falta de consistencia para ser menos vulnerables a una
única réplica no esté disponible.
Teorema CAP | 237
Vas a menudo ver mensajes acerca de las personas que baten el teorema CAP. Ellos
no tienen. Lo que han hecho es crear un sistema en el que algunas capacidades son
CP, y algunos son AP. los
238| Capítulo 11: microservicios a escala
prueba matemática detrás del teorema de CAP se mantiene. A pesar de muchos
intentos en la escuela, he aprendido que no laten matemáticas.
Y el mundo real
Mucho de lo que hemos hablado es de los bits electrónicos mundiales y bytes
almacenados en la memoria. Hablamos de la consistencia de una manera casi infantil;
nos imaginamos que dentro del alcance del sistema que hemos creado, podemos
detener el mundo y hacer que todo tenga sentido. Y sin embargo, gran parte de lo que
construimos es sólo un reflejo del mundo real, y no conseguimos controlar eso,
¿verdad?
Vamos revisar nuestro sistema de inventario. Se correlaciona con el mundo real, los
elementos físicos. Llevamos una cuenta en nuestro sistema de cuántos discos que
tenemos. Al comienzo del día, tuvimos 100 copias de donar sangre por los frenos.
Hemos vendido uno. Ahora tenemos 99 copias. Fácil, ¿verdad? Por qué ocurre si
cuando la orden estaba siendo enviado, alguien toca una copia del álbum en el suelo
y que se pisó y roto? ¿Que pasa ahora? Nuestros sistemas dicen que 99, pero hay 98
copias en el estante.
¿Y si nos hizo nuestra AP sistema de inventario en su lugar, y de vez en cuando tenía
que ponerse en contacto con un usuario más adelante y decirle que uno de sus
artículos es en realidad fuera de stock? ¿Sería la peor cosa en el mundo? Sin duda,
sería mucho más fácil de construir, escala, y asegurarse de que es correcta.
Nosotros Hay que reconocer que no importa qué tan consistentes nuestros sistemas
podrían ser en sí y por sí mismos, no puede saber todo lo que sucede, especialmente
cuando estamos manteniendo los registros del mundo real. Esta es una de las
principales razones por las cuales los sistemas de AP terminan siendo la decisión
correcta en muchas situaciones. Aparte de la complejidad de la construcción de CP
sis- TEMS, no pueden solucionar todos nuestros problemas de todos modos.
Descubrimiento de servicio
Una vez que tenga más de unos pocos microservicios por ahí, su atención se dirige
inevitablemente a saber dónde está en la tierra está todo. Tal vez usted quiere saber lo
que se está ejecutando en un entorno determinado para que sepa lo que debe haber un
seguimiento. Tal vez es tan simple como saber dónde está su servicio de cuentas es
para que aquellos que lo utilizan microservicios saben dónde encontrarlo. O tal vez lo
que desea es hacer más fácil para los Ircops desa- en su organización para saber qué
opciones están disponibles APIs para que no reinventar la rueda. En términos
generales, todos estos casos de uso abarca los departamentos de servicio de descubrimiento. Y como siempre con microservicios, tenemos bastantes opciones
diferentes a nuestra disposición para tratar con ella.
Todas las soluciones vamos a ver las cosas de mango en dos partes. En primer lugar,
proporcionan un mecanismo para una instancia registrarse a sí mismo y decir, “Estoy
Teorema CAP | 239
aquí!” En segundo lugar, proporcionan una manera de encontrar el servicio una vez
que se ha registrado. descubrimiento de servicios se vuelve más complicado, sin
embargo, cuando estamos considerando un ambiente donde constantemente estamos
destruyendo
240| Capítulo 11: microservicios a escala
y el despliegue de nuevas instancias de servicios. Idealmente, nos gustaría cualquier
solución que elegimos para hacer frente a esto.
Vamos mirar algunas de las soluciones más comunes para la prestación de servicios y
considerar nuestras opciones.
DNS
Sus agradable para empezar de forma sencilla. DNS nos permite asociar un nombre
con la dirección IP de una o más máquinas. Podríamos decidir, por ejemplo, que
nuestro servicio de cuentas siempre se encuentra en accounts.musiccorp.com.
entonces tendríamos ese punto de entrada para la dirección IP del host que ejecuta
ese servicio, o tal vez tenga que resolver a un equilibrador de carga que está
distribuyendo la carga a través de una serie de casos. Esto significa que tendríamos
que manejar la actualización de estas entradas como parte de la implementación de
nuestro servicio.
Cuando se trata de instancias de un servicio en diferentes entornos, he visto un
dominio de trabajo de la plantilla basada en la convención también. Por ejemplo,
podríamos tener una plantilla define como <servicename> - <ambiente>
.musiccorp.com, que nos da entradas como accounts-uat.musiccorp.com o accountsdev.musiccorp.com.
Una forma más avanzada de manejo de diferentes entornos es tener diferentes
servidores de nombres de dominio para diferentes entornos. Por lo que podría
suponer que accounts.musi- ccorp.com es donde siempre encuentro el servicio de
cuentas, pero podría resolver a diferentes hosts dependiendo de donde hago la
búsqueda. Si ya tiene sus entornos sentados en diferentes segmentos de la red y se
siente cómodo con la gestión de sus propios servidores DNS y las entradas, esto
podría ser una buena solución, pero es mucho trabajo si no está recibiendo otros
beneficios de esta configuración.
DNS tiene una serie de ventajas, siendo la principal que es un estándar tales bien
entendido y bien utilizado que casi cualquier pila de tecnología va a apoyar.
Lamentablemente, si bien existe una serie de servicios para la gestión de DNS dentro
de una organización, algunos de ellos parecen diseñados para un entorno en el que se
trata de hosts de alta desechables, por lo que las entradas de actualización de DNS
algo doloroso. Route53 servicio de Amazon hace un muy buen trabajo de esto, pero
no he visto una opción de auto-organizada que es tan bueno, sin embargo, a pesar de
que (como veremos en breve) Cónsul puede ayudarnos aquí. Aparte de los problemas en la actualización de las entradas de DNS, la especificación de DNS en sí nos
puede causar algunos problemas.
entradas de DNS para los nombres de dominio tienen un tiempo de vida (TTL). Este
es el tiempo que un cliente puede tener en cuenta la entrada fresca. Cuando queremos
cambiar el host al que se refiere el nombre de dominio, actualizar esa entrada, pero
tenemos que asumir que los clientes se aferran a la vieja IP de al menos mientras los
estados TTL. entradas de DNS pueden quedar almacenado en caché en múltiples
lugares (incluso la JVM caché entradas DNS a menos que usted
le indique
Teorema
CAP | 241 lo
contrario), y los más lugares que se almacenan en caché en el más rancio de la
entrada puede ser.
Una forma de solucionar este problema es tener la entrada de nombre de dominio
para su punto de servicio a un equilibrador de carga, que a su vez apunta a las
instancias de su servicio,
Descubrimiento de Servicio | 237
como se muestra en Figura 11-9. Al implementar una nueva instancia, se puede
tomar el viejo fuera de la entrada de equilibrador de carga y añadir el nuevo. Algunas
personas utilizan DNS redondas robining, donde las entradas del DNS a sí mismos se
refieren a un grupo de máquinas. Esta técnica es extremadamente problemático, ya
que el cliente no se podrá ver desde el host subyacente, y por lo tanto no puede parar
fácilmente el enrutamiento del tráfico a uno de los anfitriones en caso de ser enfermo.
Figura 11-9. El uso de DNS para resolver a un equilibrador de carga para evitar
entradas de DNS rancios
Como se ha mencionado, DNS se entiende bien y ampliamente compatible. Pero
tiene uno o dos inconvenientes. Yo sugeriría investiga si se trata de una buena opción
para usted antes de recoger algo más complejo. Para una situación en la que sólo
tiene nodos individuales, teniendo DNS se refieren directamente a los ejércitos es
probablemente muy bien. Pero para aquellas situaciones donde se necesita más de
una instancia de un anfitrión, tienen entradas DNS se resuelven a cargar
equilibradores que pueden manejar poner hosts individuales dentro y fuera de
servicio, según corresponda.
Registros de Servicio dinámicos
Las desventajas de DNS como una manera de encontrar nodos en un entorno
altamente dinámico han dado lugar a una serie de sistemas alternativos, la mayoría de
las cuales implican el servicio tering regis- sí con algún registro central, que a su vez
ofrece la posibilidad de buscar estos servicios mas tarde. A menudo, estos sistemas
hacen más que proporcionar un servicio tración REG y el descubrimiento, que puede
o no puede ser una buena cosa. Se trata de un campo lleno de gente, por lo que sólo
tendremos que mirar algunas opciones para darle un sentido de lo que está
disponible.
Zookeeper
Zookeeper fue desarrollado originalmente como parte del proyecto Hadoop. Se
utiliza para una serie casi desconcertante de casos de uso, incluyendo gestión de la
238| Capítulo 11: microservicios a escala
configuración, los datos nizing sincronizada entre los servicios, elección del líder,
colas de mensajes, y (útil para nosotros) como un servicio de nombres.
Al igual que muchos tipos similares de sistemas, Zookeeper se basa en la ejecución
de un número de nodos en un clúster para proporcionar diversas garantías. Esto
significa que usted debe esperar para Run-
Servicio dinámico Registros | 239
Ning al menos tres nodos Zookeeper. La mayor parte de la inteligencia en Zookeeper
son alrededor de asegurar que los datos se replican de forma segura entre estos
nodos, y que las cosas siguen siendo consistentes cuando los nodos fallan.
A su corazón, Zookeeper ofrece un espacio de nombres jerárquico para almacenar
información. Los clientes pueden insertar nuevos nodos en esta jerarquía, cambiarlos
o consultarlos. ULTERIORES más, pueden agregar relojes de los nodos que se les
diga cuando cambian. Esto significa que podríamos almacenar la información acerca
de dónde se encuentran nuestros servicios en esta estructura, y como un cliente se le
indicará cuándo cambian. Zookeeper se utiliza a menudo como un almacén de
configuración general, por lo que también podría configuración específica del
servicio almacena en el mismo, lo que le permite realizar tareas como cambiar
dinámicamente los niveles de registro o apagar características de un sistema en
funcionamiento. Personalmente, tiendo a alejarse de la utilización de sistemas como
Zookeeper como fuente de configuración, ya que creo que puede hacer más difícil
para razonar acerca del comportamiento de un determinado servicio.
Zookeeper en sí es bastante genérico en lo que ofrece, por lo que se utiliza para
tantos casos de uso. Usted puede pensar que es igual que un árbol replicado de
información que puede ser alertado sobre cuando cambia. Esto significa que por lo
general va a construir cosas en la parte superior de la misma para adaptarse a su caso
en particular. Afortunadamente, existen bibliotecas de cliente para la mayoría de los
idiomas que hay.
En el gran esquema de las cosas, Zookeeper podría considerarse vieja por ahora, y no
nos proporciona la funcionalidad que gran parte de la caja para ayudar con el servicio
de des- cubrimiento en comparación con algunas de las alternativas más recientes.
Dicho esto, sin duda es un hecho comprobado, y ampliamente utilizado. Los
implementos de algoritmos subyacentes del guardián son muy difíciles de conseguir
la derecha. Conozco a un proveedor de base de datos, por ejemplo, que utilizaba sólo
para Zookeeper elección del líder con el fin de garantizar que un nodo primario
consiguió promovido adecuadamente durante las condiciones de falla. El cliente
siente que Zookeeper era demasiado pesado y pasó mucho tiempo limar errores en su
propia implementación de la rithm PAXOS algo- para reemplazar lo hizo Zookeeper.
La gente suele decir que no se debe escribir sus propias bibliotecas de criptografía.
Me extiendo que al decir que no se debe escribir sus propios sistemas de
coordinación dis- tribuido tampoco. Hay mucho que decir sobre el uso de material
existente que simplemente funciona.
Cónsul
Al igual que Zookeeper, Cónsul soporta tanto gestión de la configuración y el
servicio descubrimiento. Pero va más allá de lo Zookeeper en proporcionar más
apoyo para estos casos de uso clave. Por ejemplo, se expone una interfaz HTTP para
el descubrimiento de servicios, y una de las características del asesino del Consul es
que realmente proporciona un servidor DNS de la caja; Específicamente, puede
240| Capítulo 11: microservicios a escala
servir registros SRV, que le permite obtener una IP y puerto para un nombre dado.
Esto significa que si una parte de su sistema utiliza DNS ya y puede soportar los
registros SRV, puede simplemente dejar de Cónsul y empezar a usarlo sin ningún
cambio en su sistema existente.
Servicio dinámico Registros | 239
Cónsul también se basa en otras capacidades que le puede resultar útil, tales como la
capacidad de realizar controles de salud en los nodos. Esto significa que Cónsul bien
podría solapar las capacidades proporcionadas por otras herramientas de monitoreo
dedicados, a pesar de que usaría más probable Cónsul como fuente de esta
información y luego tire de ella en un tablero de instrumentos hensive más
Comprehensive o sistema de alerta. diseño y altamente tolerante a fallos del Cónsul
se centran en sistemas que hacen un uso intensivo de los nodos efímeras hace que me
pregunto, sin embargo, si se puede llegar a la sustitución de sistemas como Nagios y
Sensu para algunos casos de uso manipulación.
Cónsul utiliza una interfaz HTTP REST para todo, desde el registro de un servicio,
consultar el almacén de claves / valor, o la inserción de los controles de salud. Esto
hace que la integración con la tecnología de pilas de diferente muy sencillo. Una de
las otras cosas que me gusta de Cónsul es que el equipo detrás de él se ha dividido el
pedazo ción manage- clúster subyacente. Serf, que Consul se sienta encima de, se
ocupa de la detección de nodos en un cluster, gestión de fallo, y alerta. Cónsul luego
añade el descubrimiento de servicios y la gestión de con- figuración. Esta separación
de las preocupaciones que me atrae, que debería ser ninguna sorpresa para usted dado
los temas que se ejecutan a través de este libro!
Cónsul es muy nuevo, y dada la complejidad de los algoritmos que utiliza, esto
normalmente me haría más reacios en recomendarlo para un trabajo tan importante.
Dicho esto, Hashicorp, el equipo detrás de él, sin duda tiene una gran trayectoria en
la creación de la tecnología de código abierto muy uso- ful (en forma de tanto Packer
y el vagabundo), el proyecto está siendo desarrollado activamente, y he hablado con
un algunas personas que están felices para su uso en la producción. Teniendo en
cuenta que, creo que es bien vale la pena un vistazo.
Eureka
de código abierto de Netflix sistema de Eureka se opone a la tendencia de los
sistemas como cónsul y guardián Zoo- en que no tenga también pretende ser un
almacén de configuración de propósito general. En realidad, es muy específica en su
caso de uso.
Eureka también proporciona capacidades básicas de equilibrio de carga en que pueda
soportar las operaciones de búsqueda básica de round-robin de instancias de servicio.
Proporciona un punto final basada en REST para que pueda escribir sus propios
clientes, o puede utilizar su propio cliente de Java. El cliente Java proporciona
capacidades adicionales, tales como la comprobación de estado de instancias.
Obviamente, si se omite propio cliente de Eureka e ir directamente al extremo REST,
que está en su propia allí.
Al tener los clientes tratan con el descubrimiento de servicios directamente, evitamos
la necesidad de un proceso Separando. Sin embargo, no se requiere que todos los
clientes implementar la detección de servicios. Netflix, que estandariza en la JVM,
logra esto haciendo que todos los clientes utilizan Eureka. Si estás en un entorno más
La documentación de Servicios
| 241
políglota, esto puede ser más de un desafío.
240 | Capítulo 11: microservicios a escala
Rodar su propio
Un método que he utilizado yo mismo y visto hecho en otros lugares es rodar su
propio sistema. En un proyecto que estábamos haciendo un uso intensivo de AWS,
que ofrece la posibilidad de añadir etiquetas a los casos. Al poner en marcha
instancias de servicio, me gustaría aplicar etiquetas para ayudar a definir lo que el
caso era y lo que se utilizó para. Estos permitido para algunos ricos metadatos a estar
asociadas con una serie dada, por ejemplo:
• = cuentas de servicios
• ambiente = producción
• version = 154
entonces podría utilizar las API de AWS para consultar todas las instancias asociadas
con una cuenta de AWS dada para encontrar máquinas que me importaba. Aquí, en sí
AWS está manejando el almacenamiento de los metadatos asociados a cada caso, y
que nos proporciona la capacidad de consultar la misma. a continuación, he
construido herramientas de línea de comandos para interactuar con estos casos, y
haciendo cuadros de mando para la supervisión del estado se vuelve bastante fácil,
especialmente si usted adopta la idea de que cada instancia de servicio exponer
detalles de comprobación de estado.
La última vez que hice esto, no fue tan lejos como que tienen servicios utilizan las
API de AWS para encontrar sus dependencias de servicio, pero no hay ninguna razón
por la que no podía. Obviamente, si desea los servicios de aguas arriba para recibir
una alerta cuando la ubicación de un río abajo cambios en el servicio, que está en su
propia.
No se olvide de los seres humanos!
Los sistemas que hemos visto hasta el momento hacen que sea fácil para una
instancia de servicio para registrarse a sí mismo y buscar otros servicios que
necesita para hablar. Pero a medida que los seres humanos que a veces desea que
esta información también. Cualquiera sea el sistema que elija, asegúrese de que
tiene las herramientas disponibles que le permiten crear informes y cuadros de
mando en la parte superior de estos registros para crear pantallas para los seres
humanos, no sólo para las computadoras.
Documentación de Servicios
Al descomponer nuestros sistemas en microservicios de grano más fino, estamos
esperando para exponer una gran cantidad de costuras en forma de API que la gente
puede utilizar para hacer muchas, es de esperar de maravillas ful, las cosas. Si usted
recibe su derecho de descubrimiento, sabemos dónde están las cosas. Pero, ¿cómo
La documentación de Servicios
| 241
sabemos lo que hacen esas cosas, o cómo usarlos? Una opción es obviamente tener
documenta- ción acerca de las API. Por supuesto, la documentación a menudo puede
estar fuera de fecha. Lo ideal aliado, nos aseguramos de que nuestra documentación
está siempre al día con la API microService, y es más fácil ver esta documentación
cuando sabemos que un End-servicio
240 | Capítulo 11: microservicios a escala
punto es. Dos piezas diferentes de la tecnología, Swagger y HAL, tratan de hacer de
esto una realidad, y ambos son vale la pena mirar.
Pavonearse
Swagger le permite describir su API a fin de generar una muy buena interfaz de
usuario web que le permite ver la documentación e interactuar con la API a través de
un navegador web. La capacidad de ejecutar solicitudes es muy agradable: puede
definir plantillas de entrada, por ejem- plo, dejando claro qué tipo de contenido que
el servidor espera.
Para hacer todo esto, Swagger necesita el servicio para exponer un archivo sidecar
que coincida con el formato de Swagger. Swagger tiene una serie de bibliotecas de
diferentes lenguajes que lo hace por usted. Por ejemplo, para Java puede anotar
métodos que responden a las llamadas de la API, y el archivo se genera para usted.
Me gusta la experiencia del usuario final de que Swagger le da, pero hace poco para
el concepto de exploración incrementales en el corazón de hipermedia. Aún así, es
una forma bastante agradable para exponer la documentación sobre sus servicios.
HAL y el navegador HAL
Por sí mismo, el Idioma de la aplicación de hipertexto (HAL) es un estándar que
describe las normas para los controles de hipermedia que nos exponemos. Como ya
vimos enCapítulo 4, Controles hipermedia son los medios por los cuales permiten a
los clientes explorar progresivamente nuestras APIs para utilizar las capacidades de
nuestros servicios de una manera menos junto a otras técnicas de inte- gración. Si
decide adoptar el estándar hipermedia de HAL, entonces no sólo se puede hacer uso
de una amplia serie de bibliotecas de cliente para el consumo de la API (en el
momento de la escritura, el HAL wiki de la lista 50 librerías de soporte para un
número de diferentes lenguajes) , pero también se puede hacer uso del navegador de
HAL, que le da una forma de explorar la API a través de un navegador web.
Al igual que Swagger, esta interfaz de usuario se puede utilizar no sólo para actuar
como documentación de la vida, sino también para ejecutar llamadas contra el propio
servicio. La ejecución de las llamadas no es tan resbaladiza, sin embargo. Mientras
que con Swagger se puede definir plantillas para hacer cosas como tema una solicitud
POST, con HAL es más por su cuenta. La otra cara de esto es que el poder inherente
de los controles hipermedia le permite explorar mucho más efectiva la API expuesta
por el servicio, como se puede seguir enlaces de todo muy fácilmente. Resulta que
los navegadores web son bastante bueno en ese tipo de cosas!
A diferencia de la fanfarronería, toda la información necesaria para conducir esta
documentación y caja de arena está incrustado en los controles hipermedia. Esta es
una espada de doble filo. Si ya está utilizando controles hipermedia, se necesita poco
esfuerzo para exponer un navegador HAL y tienen los clientes a explorar su API. Sin
embargo, si usted no está utilizando hipermedia, que o bien no se puede usar HAL o
242| Capítulo 11: microservicios a escala
tienen que adaptar su API para utilizar hipermedia, que es probable que sea un
ejercicio que rompe los consumidores existentes.
La auto-describen Sistema | 243
El hecho de que HAL también describe un estándar hipermedia con algunas
bibliotecas de cliente de soporte es una ventaja añadida, y sospecho que es una gran
razón por la que he visto más captación de HAL como una forma de documentar las
API de Swagger para aquellas personas que ya utilizan controles hipermedia . Si está
utilizando hipermedia, mi recomendación es ir con HAL sobre Swagger. Pero si
usted está utilizando hipermedia y no puede justificar el cambio, me def- initely
sugieren dar Swagger una oportunidad.
El sistema de auto-Describiendo
Durante la evolución temprana de SOA, normas como Universal Description,
Discovery and Integration (UDDI) surgió para ayudar a la gente a dar sentido a lo
que los servicios estaban funcionando. Estos enfoques eran bastante pesado, lo que
llevó a ques técnicamente alternativas para tratar de dar sentido a nuestros sistemas.
Martin Fowler discutió el concepto de laregistro humana, Donde un enfoque mucho
más ligero es simplemente tener un lugar donde los seres humanos pueden registrar
información acerca de los servicios de la organización en algo tan básico como un
wiki.
Obtener una imagen de nuestro sistema y cómo se está comportando es importante,
sobre todo cuando estamos en escala. Hemos cubierto una serie de diferentes técnicas
que nos ayudarán a ganar la comprensión directa de nuestro sistema. Mediante el
seguimiento de la salud de nuestros servicios derivados, junto con los ID de
correlación para ayudarnos a ver cadenas de llamadas, podemos obtener datos reales
en términos de cómo se interrelacionan nuestros servicios. El uso de los sistemas de
descubrimiento de servicios como cónsul, podemos ver donde se están ejecutando
nuestros microservicios. HAL nos permite ver qué capacidades están siendo alojados
en cualquier punto final determinado, mientras que nuestras páginas de
comprobación de la salud y sistemas de control nos permiten saber la salud de todo el
sistema y los servicios individuales.
Toda esta información se encuentra disponible mediante programación. Todos estos
datos nos permite hacer nuestro registro humano más poderoso que una simple
página wiki que, sin duda, salir de la fecha. En cambio, debemos usarlo para
aprovechar y mostrar toda la información de nuestro sistema se emite. Mediante la
creación de cuadros de mando personalizados, podemos reunir la gran cantidad de
información que está disponible para ayudarnos a dar sentido a nuestro ecosistema.
Por todos los medios, comenzar con algo tan simple como una página web estática o
wiki que quizás rasguños en un bit de datos desde el sistema en vivo. Pero mira para
tirar en más y más infor- mación con el tiempo. Hacer esta información disponible es
una herramienta clave para la gestión de la complejidad emergente que vendrá de la
ejecución de estos sistemas a gran escala.
Resumen
244| Capítulo 11: microservicios a escala
Como un enfoque de diseño, microservicios son todavía bastante joven, por lo que
aunque tenemos algunas experiencias notables que apoyarse, estoy seguro de que los
próximos años van a producir patrones más útiles en el manejo de ellos a escala. No
obstante, espero que este capítulo se han esbozado algunos pasos que puede seguir en
su viaje a microservicios en la escala que usted tiene en una buena posición.
La auto-describen Sistema | 243
Además de lo que he tratado aquí, recomiendo el excelente libro de lanzamiento de
Michael Nygard It !. En él comparte una colección de historias sobre el fracaso del
sistema y algunos patrones para ayudar a lidiar con él también. El libro está bien vale
la pena leer (de hecho, me gustaría ir tan lejos como para decir que se debe
considerar una lectura esencial para cualquier persona la construcción de sistemas a
escala).
Hemos cubierto un buen montón de tierra, y estamos llegando al final. En nuestro
próximo y último capítulo, vamos a ver a tirar todo de nuevo juntos y resumir lo que
hemos aprendido en el libro general.
246| Capítulo 11: microservicios a escala
CAPÍTULO 12
Uniendo fuerzas
hemos cubierto una buena cantidad en los capítulos anteriores, de lo microservicios
son a la manera de definir sus límites, ya partir de la tecnología de integración a las
preocupaciones sobre la seguridad y la vigilancia. E incluso nos encontramos tiempo
para averiguar cómo el papel del arquitecto encaja. Hay mucho para tomar, ya que
aunque microservicios sí mismos pueden ser pequeños, la amplitud y el impacto de
su arquitectura no son. Así que aquí voy a tratar de summa- Rize algunos de los
puntos clave a lo largo del libro.
Principios de microservicios
Nosotros discutido el papel que pueden desempeñar en principios Capitulo 2. Son
declaraciones acerca de cómo deben hacerse las cosas, y por eso creemos que se debe
hacer de esa manera. Nos ayudan a enmarcar las diversas decisiones que tenemos que
hacer en la construcción de nuestros siste- mas. Debe definir absolutamente sus
propios principios, pero pensé que vale la pena spell- ing lo que veo como los
principios fundamentales para arquitecturas MICROSERVICE, que se puede ver que
se resumen enFigura 12-1. Estos son los principios que nos ayudarán crea- comía
pequeños servicios autónomos que trabajan bien juntos. Ya hemos cubierto everycosa aquí al menos una vez hasta ahora, por lo que nada debe ser nueva, pero hay un
valor en la destilación se reduce a su esencia central.
Puede optar por adoptar estos principios al por mayor, o tal vez ajustar a tener
sentido en su propia organización. Pero tenga en cuenta el valor que viene de su uso
en combinación: el conjunto debe ser mayor que la suma de las partes. Así que si
usted decide dejar caer uno de ellos, asegúrese de que entiende lo que se le echa en
falta.
Para cada uno de estos principios, he tratado de sacar algunas de las prácticas de
apoyo que hemos cubierto en el libro. Como se suele decir, hay más de una manera
de pelar un gato: es posible encontrar sus propias prácticas para ayudar a entregar en
246 | Capítulo 12: Uniendo fuerzas
estos principios, pero esto debe empezar.
245
Figura 12-1. Principios de microservicios
Modelo de negocio en torno a conceptos
La experiencia nos ha demostrado que las interfaces estructuradas en torno a los
contextos de negocio-delimitada son más estables que los estructurada en torno a los
conceptos técnicos. Al modelar el dominio en el que opera nuestro sistema, no sólo
se intenta formar las interfaces ble más Sta, sino que también nos aseguramos de que
estamos en mejores condiciones para reflejar los cambios en los procesos de negocio
con facilidad. Utilizar contextos acotados para definir posibles límites del dominio.
Adoptar una cultura de Automatización
Microservicios añadir un montón de complejidad, una parte clave de la que proviene
de la gran nú- mero de piezas que tenemos que tratar con el movimiento. Adoptar
una cultura de la automatización es una forma clave para hacer frente a esto, y el
esfuerzo de carga frontal para crear las herramientas para apoyar microservicios
pueden hacer mucho sentido. Las pruebas automatizadas es esencial, ya que garantiza
nuestros servicios siguen funcionando es un proceso más complejo que con los
sistemas monolíticos. Tener una llamada de línea de comandos uniformes para
desplegar la misma manera en todas partes puede ayudar, y esto puede ser una parte
clave de la adopción de la entrega continua para darnos retroalimentación rápida de
la calidad pro- ducción de cada registro de entrada.
Considere el uso de definiciones de entornos para ayudarle a especificar las
diferencias de un ambiente a otro, sin sacrificar la capacidad de utilizar un método de
implementación uniforme. Pensar en crear imágenes personalizadas para acelerar el
despliegue, y abrazando la creación de servidores inmutables totalmente
automatizadas para que sea más fácil para razonar acerca de sus sistemas.
246 | Capítulo 12: Uniendo fuerzas
Ocultar internos Detalles de la implementación
A maximizar la capacidad de un servicio a evolucionar de forma independiente de
cualquier otro, es vital que nos ocultan detalles de implementación. Modelado
delimitada contextos pueden ayudar, ya que esto ayuda a centrarnos en aquellos
modelos que deben ser compartidos, y los que deben ser den HID-. Los servicios
también deben ocultar sus bases de datos para evitar caer en uno de los géneros más
comunes de acoplamiento que pueden aparecer en arquitecturas orientadas a
servicios tradicionales, y utilizar los datos bombas o datos de eventos para consolidar
los datos a través de múltiples servicios para los informes.
Siempre que sea posible, recoger las API independiente de la tecnología para darle la
libertad de utilizar diferentes pilas de tecnología. Considere el uso de REST, que
formaliza la separación de datos internos y externos de implementación, aunque
incluso si el uso de las llamadas a procedimiento remoto (RPC), todavía se puede
abrazar estas ideas.
Descentralizar todas las cosas
A maximizar la autonomía que microservicios hacen posible, tenemos que estar
buscando constantemente la posibilidad de delegar la toma de decisiones y el control
de los equipos que poseen los servicios mismos. Este proceso se inicia con abrazar
auto-servicio siempre que sea posible, permitiendo a la gente para desplegar software
en la demanda, por lo que el desarrollo y las pruebas lo más fácil posible, y evitar la
necesidad de equipos separados para llevar a cabo estas actividades.
Asegurar que los equipos son dueños de sus servicios es un paso importante en este
viaje, por lo que los equipos responsables de los cambios que se realizan, a ser
posible incluso hacer que decidan cuándo liberar esos cambios. Haciendo uso de
código abierto interno asegura que las personas pueden hacer cambios en los
servicios de propiedad de otros equipos, aunque recuerda que esto requiere un trabajo
de implementar. Alinear los equipos a la organización para asegurar que la ley de
Conway funciona para usted, y ayudar a su equipo a ser expertos en el dominio de los
servicios de negocios-centrado que están creando. Cuando se necesita alguna
orientación general, tratar de adoptar un modelo de gobierno compartido en el que las
personas de cada equipo comparten colectivamente la responsabilidad de la
evolución de la visión técnica del sistema.
Este principio se puede aplicar a la arquitectura también. Evitar los enfoques como
los sistemas de bus de servicios empresariales o de orquestación, que pueden
conducir a la centralización de la lógica de negocios y servicios mudos. En su lugar,
prefieren coreografía sobre orquestación y middleware mudo, con puntos finales
inteligentes para asegurar que se mantiene la lógica y los datos asociados dentro de
los límites del servicio, lo que ayuda a mantener las cosas cohesiva.
Principios de microservicios | 247
independientemente Deployable
Siempre debemos tratar de asegurar que nuestros microservicios pueden y se
despliegan por sí mismos. Incluso cuando se requieren cambios de última hora,
debemos tratar de coexistir puntos finales ver- Sioned para permitir a nuestros
consumidores cambian con el tiempo. Esto nos permite opti- mizar para la velocidad
de liberación de nuevas características, así como el aumento de la autonomía de los
equipos con estos microservicios asegurándose de que no tienen que orquestar
constantemente sus despliegues. Cuando se utiliza la integración basada en RPC,
evitar la generación de resguardo del cliente / servidor fuertemente unido, como la
promovida por RMI de Java.
Mediante la adopción de un modelo de un servicio-per-host, se reducen los efectos
secundarios que podrían hacer que el despliegue de un servicio a impactar otro
servicio relacionado. Considere el uso de técnicas de liberación azules / verdes o
canario para separar el despliegue de la liberación, lo que reduce el riesgo de un
comunicado que va mal. Utilizar los contratos de consumo impulsado a coger los
cambios de última hora antes de que sucedan.
Recuerde que debe ser la norma, no la excepción, que se puede realizar un cambio en
un solo servicio y lo liberan en la producción, sin tener que implementar cualquier
otro servicio en el bloqueo de paso. Sus consumidores deben decidir cuando se ponen
al día, y hay que adaptarse a este.
aislar fracaso
Una arquitectura microService puede ser más resistente de lo que un sistema
monolítico, pero sólo si entendemos y un plan para fallos en parte de nuestro sistema.
Si no tenemos en cuenta el hecho de que una llamada aguas abajo puede y va a fallar,
nuestros sistemas pueden sufrir fallos en cascada catastrófica, y podríamos
encontrarnos con un sistema que es mucho más frágil que antes.
Cuando se utilizan las llamadas de red, no se trate llamadas remotas como las
llamadas locales, ya que esto ocultará dife- rentes tipos de modo de fallo. Así que
asegúrese de que si usted está utilizando bibliotecas de cliente que la abstracción de
la llamada remota no ir demasiado lejos.
Si mantenemos los principios de antifragility en mente, y esperamos que el fracaso se
producirá en cualquier lugar y en todas partes, estamos en el camino correcto.
Asegúrese de que sus tiempos de espera se establecen apro- tamente. Entender
cuándo y cómo utilizar los mamparos y disyuntores para limitar el otoño-cabo de un
componente que falla. Entender lo que el impacto de cara al cliente será si sólo una
parte del sistema se está comportando mal. Saben cuáles podrían ser las
consecuencias de una partición de la red, y si sacrificar la disponibilidad o la
consistencia en una situa- ción dada es la decisión correcta.
248 | Capítulo 12: Uniendo fuerzas
altamente observable
Nosotros no puede basarse en la observación del comportamiento de una sola instancia
de servicio o el estado de una sola máquina para ver si el sistema está funcionando
correctamente. En su lugar, necesitamos una vista de unión en marcha de lo que está
sucediendo. Utilizar la supervisión semántica para ver si el sistema se está
comportando correctamente, mediante la inyección de transacciones sintéticas en su
sistema para simular el comportamiento del usuario real. Agregar sus registros, y
agregar sus estadísticas, de modo que cuando usted ve un problema se puede
desglosar a la fuente. Y cuando se trata de reproducir problemas desagradables o
simplemente ver cómo el sistema está interactuando en la producción, utilizar los ID
de correlación que permitirá rastrear llamadas a través del sistema.
Cuando no hay que usar microservicios?
A menudo recibo esta pregunta. Mi primer consejo sería que el menos bien a
entender un dominio, más difícil será para usted para encontrar contextos adecuada
delimitadas por sus servicios. Como hemos comentado anteriormente, obtener los
límites de servicio incorrecto puede dar lugar a tener que hacer un montón de
cambios en la colaboración en una operación costosa-servicio-servicio. Así que si
usted está viniendo a un sistema monolítico para el que no entiende el dominio, pasa
algún tiempo a aprender lo que hace por primera vez el sistema, y luego mira a
identificar los límites del módulo de limpieza antes de la división a cabo los
servicios.
el desarrollo de Greenfield también es todo un reto. No es sólo que el dominio es
también probable que sea nueva; es que es mucho más fácil trozo algo que tiene que
algo que no! Así que de nuevo, considere comenzar monolítica primera y romper
cosas cuando estás estable.
Muchos de los retos que va a afrontar con microservicios empeoran con la escala. Si
la mayoría de hacer las cosas de forma manual, es posible estar bien con 1 o 2
servicios, sino 5 o 10? Siguiendo con las prácticas de control de edad en el que basta
con ver las estadísticas como la CPU y la memoria del mismo modo podría funcionar
bien para algunos servicios, pero la mayor colaboración-servicio-servicio lo hace, el
más doloroso esto se convertirá. Usted se encontrará golpear estos puntos de dolor a
medida que agrega más servicios, y espero que los consejos de este libro le ayudará a
ver algunos de estos problemas que vienen, y le dará algunos consejos concretos
sobre cómo tratar con ellos. He hablado antes acerca de REA y la cerda joven
tomando un tiempo para construir las herramientas y prácticas para gestionar
microservicios así, antes de poder utilizarlos en cualquier cantidad grande.
Cuando no hay que usar microservicios? | 249
Las palabras de despedida
arquitecturas MICROSERVICE le dan más opciones y más decisiones que tomar.
ING decisiones MAK- en este mundo es una actividad mucho más común que en los
sistemas más simples, monolíticas. Usted no recibirá todas estas decisiones derecha,
puedo garantizar que. Así, sabiendo que vamos a conseguir algunas cosas mal,
¿cuáles son nuestras opciones? Bueno, yo sugeriría encontrar maneras de hacer cada
decisión pequeña en su alcance; de esa manera, si uno se equivoca, sólo se afecta una
pequeña parte de su sistema. Aprender a aceptar el concepto de la arquitectura
Evolución- ary, donde sus curvas del sistema y flexiona y cambia con el tiempo a
medida que aprende cosas nuevas. No pensar en reescrituras big bang, pero en lugar
de una serie de cambios efectuados en el sistema con el tiempo para mantenerla
flexible.
Esperemos que ahora que he compartido con usted suficiente información y
experiencias para ayudar a decidir si microservicios son para usted. Si lo están,
espero que pienses en esto como un ney distas, no un destino. Ir de forma
incremental. Romper su sistema aparte pieza por pieza, aprender sobre la marcha. Y
acostumbrarse a él: en muchos sentidos, la disciplina para cambiar y evolucionar
continuamente nuestros sistemas es una lección mucho más importante aprender que
cualquier otro que he compartido con ustedes a través de este libro. El cambio es
inevitable. Abrázalo.
250 | Capítulo 12: Uniendo fuerzas
Índice
UNA
test de aceptación, 132
Acceso por referencia,
60 responsabilidad,
202
adaptabilidad, 27
proyecto de Egisto, 100
registros de agregados, 158
sistemas antifragile, 1, 210-215
mamparos, 214
rompedores de circuito, 212
ejemplos de, 210
aumento del uso de,
1 aislamiento, 215
desconexión de carga, 215
tiempos de
espera, 211
sistema de AP
definición del término,
233 vs. sistema CP,
235
La autenticación basada en clave de
API, 177, 181
contenedores de aplicaciones, 118
arquitectos (véase arquitectos de
sistemas) principios de la
arquitectura
desarrollo de, 18
12 factores de Heroku, 18
microservicios principios clave,
245 ejemplo del mundo real, 19
la seguridad de arquitectura, 21,
208 artefactos
imágenes, 113
sistema operativo, 110
plataforma específica, 109
colaboración asíncrona
complejidades de, 57
implementar, 55
vs sincrónica, 42
especificación ATOM,
56
autorización de autenticación, 169-180
definición de términos, 169
de grano fino, 172
servicio-servicio, 173
inicio de sesión único
(SSO), 170 inicio de sesión
único de puerta de enlace,
171 terminología, 170
automatización
beneficios para el despliegue,
121 estudios de caso sobre, 122
autonomía
microservicios y, 3
papel de arquitecto de sistemas en,
27 autoscaling, 230
disponibilidad
en PAC teorema, 232
microservicios clave de principio,
207 sacrificar, 233
si
backends para interfaces (BFFs), 72
bombas de datos de copia
de seguridad, 99 copias de
seguridad, encriptación de,
181 / Despliegue verde
azul, 148
cuellos de botella, 196
contextos acotadas
concepto de, 31
módulos y servicios, 33
anidado, 34
la
descomposición
prematura, 33 compartida
frente a los modelos ocultos,
31 diseño del sistema y, 198
251
Guardafrenos,
187 cambios de
ruptura
evitando, 39
difiriendo, 62
detección precoz de,
63 pruebas quebradizas,
140
fragilidad, 47
construcción de tuberías, 107
mamparos, 214
comunicado de servicio añadido,
108 capacidades de negocio, 34
conceptos de negocio, 36
negocio orientado al análisis, 132
C
almacenamiento en caché
beneficios de, 225
fallos de caché, 228
envenenamiento de caché, 230
lado del cliente, 226
para escrituras, 228
en HTTP, 226
apoderado, 226
lado del servidor, 226
canario de liberación, 149
teorema de la PAC, 232-236
sistemas / CP AP, 235
aplicación de, 236
fundamentos de la, 232
sacrificar la disponibilidad, 233
sacrificar la consistencia, 233
sacrificar tolerancia partición, 234
fallos en cascada, 164
gestión de certificados, 175
Caos del gorila, 211
Caos Mono, 211
arquitectura de la coreografía, 45
rompedores de circuito, 22, 212 mixin
circuit_breaker para Ruby, 214
Clase-responsabilidad-colaboración (CRC),
101
certificados de cliente, 175
bibliotecas de cliente, 59
la caché del cliente, 226
la reutilización de código, 59
arquitecto de codificación, 17
cohesión, 2, 30
Pirámide de prueba de Cohn, 132
colaboración, 27
252| Índice
basada en eventos, 43
solicitar respuesta, 42
Responsabilidad de comandos de consulta de
reparto (CQRS), 224
comete, de dos
fases, 92
comunicación
adaptándose a las vías, 193
protocolos para (SOAP), 8
asincrónica vs sincrónica, 42
compensación de transacciones, 91
del composability, 7
deriva configuración, 113
configuración, el servicio,
115 problema adjunto
confusa, 178 consistencia
en PAC teorema, 232
sacrificar, 233
restricciones, 68
Cónsul, 239
contratos dirigido a los consumidores
(CDC), 144-147 red de entrega de
contenidos (CDN), 226 sistemas de
gestión de contenidos (CMS), 75 entrega
continua (CD), 1, 107
integración continua (IC)
básico, 103
Lista de verificación para, 104
mapeo para microservicios, 105
La ley de Conway
evidencia de, 191
en reversa, 201
declaracion de, 191
resumen de, 203
proceso de coordinación, 92
equipo central, 197
CoreOS, 126
ID de correlación, 162
sistema CP, 235
requisitos interfuncionales (CFR), 151, 206
custodios, 197
imágenes personalizadas, 111
Customer Relationship Management (CRM),
76
clientes, interactuar con inscribir a
nuevos clientes, 40, 43
bases de datos compartidas, 41
re
datos
inserción lote de, 96
durabilidad de, 207
253
cifrado de copia de
seguridad, 181 la
recuperación a través de las
llamadas de servicio, 95
asegurar en reposo, 180
(Véase también la
seguridad) compartida, 86
estática compartida, 85
cifrado de datos,
180 bombas de
datos
apoyo, 99
la recuperación de datos a
través de, 96 evento, 98
el uso de serie, 98
descomposición de la base de datos, 82101 romper relaciones de clave
externa, 84 enfoque gradual para, 100
visión general de, 102
bases de datos de refactorización,
89 la selección de puntos de
separación, 82 la selección de
temporización separación, 101
datos compartidos, 86
datos estáticos
compartidos, 85 mesas
compartidas, 87
límites transaccionales, 89
la integración de bases de
datos, 41 escalamiento de
base de datos
La segregación responsabilidad de mando
en consultas (CQRS), 224
para lecturas, 222
para escrituras, 223
la disponibilidad del servicio frente a la
durabilidad de datos, 222 infraestructura
compartida, 224
directrices de toma de decisiones,
17-20 enfoque personalizado
para, 19 prácticas para, 19
principios para, 18
ejemplo del mundo real, 19
metas estratégicas, 18
técnicas descomposicionales
bases de datos (véase la descomposición
de base de datos) la identificación /
contextos de embalaje, 80
módulos, 10
concepto de la costura, 79
la selección de puntos de
separación, 81 la selección de
temporización separación, 101
bibliotecas compartidas, 9
desacoplamiento, 3, 45
funcionalidad degradantes, 207
en la entrega, 196 despliegue
Índice | 253
artefactos, como imágenes,
113 artefactos, sistema
operativo, 110 artefactos,
específicas de la
plataforma, 109
automatización, 121
/ Despliegue verde azul, 148
la construcción de tuberías, 107
comunicado de servicio añadido,
108 conceptos básicos de
integración continua, 103 lista de
comprobación de integración
continua, 104
integración continua en
microservicios, 105
imágenes personalizadas, 111
definición del entorno,
128 ambientes a tener en
cuenta, 114 servidores
inmutables, 113
interfaces, 127
microservicios vs. sistemas monolíticos,
6, 103
visión general de, 130
separarse de liberación, 148
configuración de servicio,
115
enfoque de virtualización, 122
virtualización, hipervisores, 123
254| Índice
virtualización, tradicional, 123
virtualización, tipo 2, 123
problema adjunto, 178
criterios de diseño, 18, 245-249
(Ver también los principios
arquitectónicos) prácticas de diseño /
entrega
desarrollo de, 19
ejemplo del mundo real, 19
servicio de directorio, 170
DiRT (prueba de recuperación de
desastres), 210 sistemas distribuidos
falacias de, 47, 205
promesas clave de,
7
transacciones distribuidas, 92
servicio de DNS, 237
Estibador, 126
documentación
HAL (Hypertext Idioma de la aplicación),
242 importancia de, 241
sistemas auto-descripción, 242
Pavonearse, 242
Diseño guiado por el dominio, 1
Dropwizard, 22
SECO (Do not Repeat
Yourself), 59 tontos, 137
durabilidad, 207
registros de servicios dinámicos
beneficios de,
238
Cónsul, 239
Eureka, 240
lanzamiento,
241
cuidador del
zoológico, 238
funcionalidad, degradantes, 207
sol
los días de juego, 210
porteros, 197
gobernancia
concepto de, 25
mi
empatía, 27
encriptación,
180 pruebas de
extremo a
extremo
usos apropiados para, 143, 147
Pirámide de prueba de Cohn, 132
creación de, 141
inconvenientes de, 140
ciclo de retroalimentación, 142
implementación de, 138
metaversion, 143
ámbito de aplicación de, 135
tiempo de, 141
criterios de valoración
coexistiendo diferente, 64
la agregación del lado del
servidor, 71 entornos
definición durante el despliegue,
128 consideraciones de
implementación, 114
gerente, 115
módulos de Erlang,
10
Eureka, 240
bombas de datos de
eventos, 98
abastecimiento
acontecimiento, 225
la colaboración basada en eventos, 43
consistencia eventual, 91, 233
arquitectos evolutivos (ver arquitectos de
sistemas) manejo de excepciones, 24
ejemplares, 22
prueba exploratoria, 132
seguimiento) que trata,
205
falsificaciones, 137
equipos basados en características, 195
cortafuegos, 182
pruebas en forma de escamas, 140
relaciones de clave externa, rompiendo, 84
FPM herramienta de gestor de paquetes, 110
F
robots de fracaso, 211
fracasos
en cascada, 164
(Véase también el
Índice | 255
papel de arquitecto de
sistemas en, 27 granularidad, 8
Grafito, 159
H
sistemas habitables, 15
HAL (Hypertext Idioma de la aplicación),
242 Código de mensajes basado en hash
(HMAC), 176 HATEOS principio, 51
beneficios
heterogeneid
ad de, 4
bibliotecas
compartidas y, 9
arquitectura hexagonal,
1
modelos ocultos, 31
alta cohesión, 30
HMAC (código de mensajes basado en
hash), 176 HTTP (Hypertext Transfer
Protocol)
el almacenamiento en caché en, 226
HATEOS principio, 51
HTTP a través de beneficios
256| Índice
REST, 50 HTTP a través de
REST inconvenientes, 54 la
terminación de HTTP, 219
HTTP (S) de autenticación básica, 174
Registro humana, 242
hipermedia, 51
hipervisores, 123
hystrix biblioteca, 22, 214
yo
operaciones idempotente, 215
proveedor de identidad, 170
imágenes
como artefactos, 113
personalizado, 111
servidores inmutables, 113
automatización de la
infraestructura, 1 integración
Acceso por referencia, 60
asíncrono colaboración basada en eventos,
55 interfaz de cliente, 40
DRY (Do not Repeat Yourself), 59
goles a favor, 39
guias para, 78
importancia de, 39
orquestación vs coreografía, 43
extensiones de reactivos, 58
llamadas a procedimientos remotos, 46
REST (Representational State Transfer), 49
servicios como máquinas de estado, 58
bases de datos compartidas, 41
sincrónico vs asíncrono comunica- ción, 42
software de terceros, 73
interfaces de usuario, 67
versiones, 62 las
interfaces
coexistiendo nuevo y viejo, 64
despliegue, 127
establecimiento de normas
para, 21 (Véase también las
interfaces de usuario)
detalle de implementación interna, 40
interna modelo de código abierto, 196
sistemas de detección de intrusión
(IDS), 182 sistemas de prevención de
intrusiones (IPS), 182 aislamiento, 215
arquitectos de TI (ver arquitectos de sistemas)
J
JSON, 53
fichas web JSON (JWT), 176
K
karyon, 22
La autenticación basada en clave, 177
Kibana, 158
L
latencia, 207
Latencia del mono, 211
arquitecturas de capas, 1
bibliotecas
cliente, 59
métricas de servicio, 161
compartido, 9
contenedores de Linux, 124
balanceo de carga, 219
desconexión de carga, 215
llamadas
locales, 47
troncos
agregado, 158
(Véase también el
seguimiento) los
problemas de seguridad,
182
estandarización de, 165
logstash, 158
bajo acoplamiento, 30, 45, 192
METRO
ataques man-in-the-middle, 173
cuadrante de Marick, 131
madurez, 197
tiempo medio entre fallos (MTBF), 150
tiempo medio de reparación (MTTR),
150 intermediarios de mensajes, 55
métrica
bibliotecas para, 161
métricas de servicio, 160
el seguimiento a través de múltiples
servicios, 159 biblioteca métricas, 22
microservicios
aplicación adecuada de, 249
autonomía y, 3, 26
beneficios de, 1
del composability de, 7
definición del término, 2
facilidad de
implementación, 6
inconvenientes de, 11,
249 principios
fundamentales de, 245
alineación de la organización y,
7 orígenes de, 1
intercambiabilidad y, 7
capacidad de resistencia de, 5
de escala y, 5
tamaño y, 2
la heterogeneidad de la
tecnología, 4 vs módulos, 10
frente a la arquitectura orientada a
servicios, 8 vs bibliotecas
compartidas, 9
microservicios en sistemas
antifragile escala, 210
las medidas de seguridad de
arquitectura, 208 autoscaling, 230
el almacenamiento en caché, 225
almacenamiento en caché
de escritura, 228 teorema
de la PAC, 232
Índice | 257
requisitos interfuncionales (CFR), 206
superación de las deficiencias, 205
258| Índice
funcionalidad degradantes, 207
servicios de documentación, 241
registros de servicios
dinámicos, 238 operaciones
idempotente, 215
escalada, 216
bases de datos de escala, 222
sistemas auto-descripción, 242
descubrimiento de servicios, 236
middleware, 56
burlándose frente a tropezar, 137
servicios de modelado
contextos acotados, 31
capacidades de negocio, 34
conceptos de negocio, 36
conceptos clave, 30
módulos y servicios, 33
contextos acotadas anidadas, 34
la descomposición prematura,
33 compartida frente a los
modelos ocultos, 31 límites
técnicos, 36
Descomposición modular, 10
módulos, 33
vigilancia
fallos en cascada, 164
el registro central, 158
complejidades de, 155
ID de correlación, 162
Los resultados se presentan / compartir, 165
seguimiento métrica a través de múltiples
servicios, 159 múltiples servicios / múltiples
servidores, 157 visión general de, 167
informes en tiempo real, 166
semántico, 162
métricas de servicio, 160
solo servicio / varios servidores, 156
solo servicio / servidor único, 156
estandarización de, 165
establecimiento de normas y,
21 sintético, 161
sistemas
monolíticos
bases de código
en, 2
falta de acoplamiento débil cohesión / en, 79
la presentación de informes de bases de
datos en, 93
frente a la arquitectura orientada a
servicios, 8 La ley de Moore, 191
Saltimbanqui, 138
MTBF (tiempo medio entre fallos), 150 MTTR
(tiempo medio de reparación), 150
norte
contextos acotadas anidadas, 34
Índice | 259
segregación de red, 183
requerimientos no funcionales, 151
normalización de la desviación, 140
O
sistemas de aprovisionamiento a la carta, 6
en demanda de virtualización, 1
arquitectura de cebolla, 37
Abrir Web Application Security
Project (OWASP), 187
OpenID Connect, 170, 174
artefactos del sistema operativo,
110 seguridad de los sistemas de
explotación, 183 arquitectura de
la orquestación, 43
alineación de la
organización, 7 estructura
organizativa
La ley de Conway y, 191
efectuar en el diseño de
sistemas, 191 vs suelta
estrechamente unida, 192
servicios de huérfanos, 198
OSGi (Open Source Gateway Initiative),
10 propiedad
compartido, 195
diseño del sistema y, 194
260| Índice
PAGS
Envasador, 112
Pacto, 145
pacto, 146
tolerancia
partición
en PAC teorema, 232
sacrificar, 234
contraseñas, 180
pruebas de rendimiento, 152
plataforma como servicio
(PaaS), 120 artefactos
específicos de la plataforma, 109
Polly para .NET, 214
Ley de Postel, 63
escala predictiva, 230
parte principal, 169
problemas de privacidad, 186
ensayo de las propiedades, 132
el almacenamiento en caché de proxy, 226
R
RabbitMQ, 55
RDBMS (gestión de base de datos relacional
SYS-TEMS), 222
extensiones de reactivos (Rx),
58 escalamiento reactiva, 230
réplicas de lectura, 222
rediseñar, 221
bases de datos de
refactorización, 89 llamadas a
procedimientos remotos, 46-49
ventajas e inconvenientes de, 49
fragilidad, 47
definición del término, 46
las tecnologías
disponibles, 46
acoplamiento de la
tecnología, 47 frente a
las llamadas locales, 47
intercambiabilidad, 7
bases de datos de
informes
bombas de datos de copia
de seguridad, 99
directrices de la bomba de
datos, 96
la recuperación de datos a través
de las llamadas de servicio, 95
bombas de datos de eventos, 98
sistemas de concurso
completo genéricos, 100
enfoque monolítico a, 93
software de terceros, 95
la colaboración de solicitud / respuesta, 42
ingeniería resiliencia, 5, 228
recursos, 49
tiempo de respuesta, 207
REST (Representational State Transfer), 4955 ÁTOMO especificación, 56
concepto de, 49
marcos para, 54
HTTP a través de beneficios
REST, 50 HTTP a través de
REST inconvenientes, 54
formatos de texto, 53
proxy inverso, 226
Riemann, 166
riesgo, la difusión, 217
principio de robustez, 63
Rx (extensiones de
reactivos), 58
almacenamiento), 218 escalada,
216-222
autoscaling, 230
beneficios de, 5
bases de datos, 222
balanceo de carga, 219
razones para, 216
cargas de trabajo de la división, 217
diversificación de riesgos, 217
S
SAML, 170, 174
SAN (redes de área de
Índice | 261
vertical, 217
vs rediseño, 221
Los sistemas basados
en los trabajadores, 220
costuras, el concepto de,
79 seguridad, 169-189
ataques, la defensa de, 182
autorización de autenticación,
169
copias de seguridad, 99, 181
educación / conocimiento de, 187
encriptación, 180
ejemplo de
configuración, 184
verificación externa de,
188 cortafuegos, 182
elemento humano de,
187 importancia de, 169
detección de intrusiones / prevención, 182
almacenamiento de claves, 181
troncos, 182
ataques man-in-the-middle, 173
sistemas operativos, 183
visión general de, 188
contraseñas, 180
problemas de
privacidad, 186
asegurar los datos en
reposo, 180
autentificación / autoriza- ción-servicio-
262| Índice
servicio, 173
selección de la herramienta, 187
nubes privadas virtuales, 183
Desarrollo del ciclo de vida de
seguridad, 187 sistemas autodescripción, 242
monitoreo semántica, 147, 161
versiones semántica, 64
el almacenamiento en caché del lado del
servidor, 226
cuentas de servicio, 175
los límites del servicio, dieciséis
(Ver también los servicios de
modelado), las llamadas de
servicio de recuperación de datos
a través de, 95 configuración de
servicio, 115
descubrimiento de
servicios, 236 la propiedad
de servicio
enfoque integral, 194
compartido, 195
proveedor de servicio, 170
la separación del servicio, puesta en escena, 89
(Véase también la descomposición
de base de datos) plantillas de servicio,
22
pruebas de servicio
Pirámide de prueba de Cohn, 132
implementación de, 136
burlándose frente a
tropezar, 137 servidor
charlatán para, 138 ámbito
de aplicación de, 134
arquitecturas orientadas a servicios
(SOA), concepto de 8
inconvenientes de, 8
reutilización de
funcionalidad en, 7
microservicios frente, 9
servicio-a-host mapeo, 116-121
contenedores de aplicaciones,
118 múltiples servicios por host,
116 plataforma como servicio
(PaaS), 120 servicio solo por
host, 119 terminología, 116
autenticación / autorización de-servicioservicio, 173-180
claves de la API, 177
certificados de cliente, 175
problema adjunto confusa,
178 HMAC a través de HTTP,
176
HTTP (S) de base, 174
ataques man-in-the-middle, 173
SAML / OpenID Connect, 174
sharding, 223
código compartido, 59
datos compartidos, 86
bibliotecas compartidas, 9
modelos compartidos,
31 datos estáticos
compartidos, 85 mesas
compartidas, 87
compartir comportamiento, 42
inicio de sesión único (SSO),
170-172 de pruebas de humo,
148
espías, 137
SSH-multiplexación, 157
certificados SSL, 174
terminación SSL, 219 la
aplicación de las
normas
ejemplares, 22
plantillas de servicio a medida, 22
establecimiento de normas, 20-22
la seguridad de arquitectura, 21
importancia de, 20
interfaces, 21
vigilancia, 21
datos estáticos, 85
Dibujo Aplicación estrangulador, 77,
208 metas estratégicas
ejemplo del mundo real, 19
Índice | 263
comprensión, 18
golpearse contra de burla,
137 Suro, 166
Pavonearse, 242
comunicación sincrónica, 42
monitoreo sintético, 161
diseño de sistemas
rendición de cuentas y, 202
adaptándose a las vías de comunicación,
193 contextos acotados, 198
caso de estudio, 199
ley de Conway, 191 en
la entrega, 196
efecto en la estructura de organización,
201 equipos de características, 195
interna modelo de código abierto,
196 estructura organizativa y, 191
servicios de huérfanos, 198
visión general de, 203
papel de custodios, 197 la
madurez del servicio, 197
la propiedad de servicio, 194
la propiedad de servicios
compartidos, 195 estampación, 198
arquitectos de sistemas
desafíos que enfrenta,
27
directrices para la toma de
264| Índice
decisiones, 17 manejo de
excepciones, 24
gobernancia, 25
responsabilidades de, 13, 24, 27
papel de, 15
los límites del servicio y,
dieciséis la aplicación de las
normas por, 22-23
establecimiento de normas por,
20 por la formación de equipos,
26
por la participación del
equipo, 17 deuda técnica
y, 24
T
mesas, compartida, 87
plantillas de servicio a
medida, 22 formación de
equipos, 26
estructuras de equipo, 198
límites técnicos, 36
deuda técnica, 24
heterogeneidad tecnología, 4
API independiente de la tecnología, 39
tecnología orientada hacia pruebas, 132
plantillas, 22
dobles de prueba, 137
Pirámide de prueba,
132, 144 prueba de
cono de nieve, 136
diseño basado en pruebas
(TDD), 134 pruebas
canario de liberación, 149
consideraciones para, 135
pruebas dirigido a los consumidores, 144
interfuncional, 151
pruebas de extremo a
extremo, 138 MTTR
sobre MTBF, 150
visión general de, 153
pruebas de rendimiento, 152
post-producción, 148
ámbito de aplicación de, 132
seleccionar el número de,
136 monitoreo semántica,
147
separar el despliegue de la liberación, 148
Prueba de la aplicación de servicio, 136
tipos de pruebas, 131
software de terceros, 73-78, 95 la
construcción frente a la compra,
73
sistemas de gestión de contenidos (CMS),
75 Customer Relationship Management
(CRM), 76
personalización de, 74
problemas de
integración, 74 falta de
control sobre, 74 la
presentación de
informes de bases de
datos, 95
Dibujo Aplicación estrangulador,
77 estrecho acoplamiento, 30, 192
el tiempo de vida
(TTL), 237 tiempos de
espera, 211
administradores de transacciones, 92
límites transaccionales, 89-93
actas
compensando, 91
repartido, 92
Transport Layer Security (TLS), 175
De dos fases comete, 92
escriba 2 virtualización, 123
UDDI (Universal Description, Discovery y
Integración), 242
las pruebas unitarias
Pirámide de prueba de Cohn,
132 objetivos de, 134
T
Índice | 265
cuadrante de Marick, 132
ámbito de aplicación de, 134
interfaces de usuario, 67-73
composición API, 68
puertas de enlace de la API, 71
granularidad API, 67
Pirámide de prueba de
Cohn, 132
(Véase también de
extremo a extremo
pruebas) limitaciones, 68
evolución de, 67
composición fragmento, 69
enfoques híbridos, 73
V
Vagabundo, 124
versiones, 62-67
la captura de cambios de última
hora temprana, 63 coexisten
diferentes criterios de valoración,
64 difiriendo cambios de última
hora, 62 múltiples versiones
concurrentes, 66 semántico, 64
la escala vertical, 217
266| Índice
nubes privadas virtuales (VPC), 183
virtualización
hipervisores, 123
tradicional, 123
tipo 2, 123
plataformas de
virtualización
Estibador, 126
contenedores de Linux, 124
Bajo demanda, 1
redes de área de almacenamiento en,
218 Vagabundo, 124
visión, 27
W
Los sistemas basados en los trabajadores, 220
de escritura en segundo cachés, 228
X
XML, 53
Z
Ataque Zed Proxy (ZAP), 187
Zipkin, 163
cuidador del zoológico, 238
Sobre el Autor
Sam Newman es un tecnólogo en ThoughtWorks, donde actualmente divide su
tiempo entre ayudar a los clientes y trabajando como arquitecto de sistemas internos
ThoughtWorks'. Ha trabajado con una variedad de compañías en múltiples dominios
de todo el mundo, a menudo con un pie en el mundo de desarrolladores, y otro en el
espacio de las operaciones de TI. Si usted le preguntó lo que hace, él decía: “Yo
trabajo con la gente para construir mejores sistemas de software.” Ha escrito
artículos, presentado en conferencias, y esporádicamente se compromete en
proyectos de código abierto.
Colofón
Los animales en la portada de microservicios construcción son abejas (del género
Apis). De 20.000 especies conocidas de abejas, sólo siete se consideran las abejas de
miel. Son tinct dis- porque producen miel y tienda, así como la urticaria de
construcción de cera. Apicultura mantener a recoger la miel ha sido una búsqueda
humana durante miles de años.
Las abejas de miel viven en colmenas con miles de personas y tienen una estructura
social muy organizada. Hay tres castas: reina, aviones no tripulados, y el trabajador.
Cada colmena tiene una reina, que sigue siendo fértil para 3-5 años después de su
vuelo de apareamiento, y pone hasta 2.000 huevos por día. Los zánganos son las
abejas macho que se aparean con la reina (y mueren en el acto a causa de sus órganos
sexuales de púas). Las abejas obreras son hembras estériles que llenan muchos
papeles durante su vida, tales como niñera, trabajador de la construcción, tendero,
guardia, empresario de pompas fúnebres, y recolector. Forrajeo abejas obreras se
comunican entre sí por “bailar” en patrones particulares para compartir información
sobre los recursos cercanos.
Las tres castas de la abeja de la miel son similares en apariencia, con las alas, seis
patas y un cuerpo segmentado en una cabeza, tórax y abdomen. Tienen pelos cortos
difusos en un patrón de color amarillo y negro a rayas. Su dieta se compone
exclusivamente de miel, que se crea mediante un proceso de néctar de las flores rico
en azúcar digestión parcial y regurgitar.
Las abejas son cruciales para la agricultura, ya que polinizan los cultivos y otras
plantas con flores, mientras que recogen el polen y néctar. En promedio, cada
colmena de abejas reúne a 66 libras de polen al año. En los últimos años, la
disminución de muchas especies de abejas ha sido motivo de preocupación y se
conoce como Todavía no está claro qué está causando esta mortandad “desorden del
colapso de colonias.”: Algunas teorías incluyen parásitos, el uso de insecticidas, o la
enfermedad, pero no hay medidas preventivas tivos effec- se han encontrado hasta la
fecha.
Muchos de los animales en peligro de extinción cubiertas O'Reilly están; todos ellos
son importantes para el mundo. Para obtener más información sobre cómo puede
ayudar, ir aanimals.oreilly.com.
La imagen de portada es de la historia natural de Johnson. Las fuentes de
presentación son URW Tipo-escritor y Guardián Sans. La fuente del texto es Adobe
Minion Pro; la fuente es encabezado Adobe Myriad condensada; y la fuente de
código es de Dalton Maag Ubuntu Mono.
268| Índice
Descargar
Colecciones de estudio