Casey Analiza la Caída de AWS | The Standup

TThe PrimeTime
Computing/SoftwareManagementInternet Technology

Transcript

00:00:00Este episodio del stand up va a ser muy especial porque Casey va a hacer la introducción.
00:00:05Casey, ¿de qué vamos a hablar hoy?
00:00:09Hola a todos y bienvenidos al stand up.
00:00:13El podcast número 45,
00:00:166 mejor de tecnología en Spotify según lo más reciente algo.
00:00:23Cierto..
00:00:29En fin, disculpen.
00:00:30Hoy en el stand up, quería tratar algo.
00:00:33Voy a hablar sobre la caída de AWS que ocurrió en octubre,
00:00:38pero lo hago porque quería hablar de algo más grande,
00:00:43que es la idea de realmente entender algo versus decir que entiendes algo..
00:00:49O sea,
00:00:49una de las cosas que pasa mucho,
00:00:52especialmente creo que a las personas que están comenzando en su carrera de programación,
00:00:58como si eres un programador junior o algo así,
00:01:01estás llegando.
00:01:02Y sé que esto era cierto en mi caso,
00:01:04es que quieres parecer que sabes cosas,
00:01:07¿no?
00:01:08Como que no quieres parecer que no entiendes lo que está pasando.
00:01:12Entonces hay mucha presión externa,
00:01:14esté realmente ahí o no,
00:01:16sientes que deberías decir que entendiste algo o fingir que entiendes algo,
00:01:21incluso si está un poco confuso o no lo captaste del todo..
00:01:26Y aunque no fuera tu culpa,
00:01:28como incluso si la cosa no se explicó bien o no incluyó información importante,
00:01:33igual tienes el incentivo de básicamente actuar como si supieras qué era,
00:01:38¿verdad?
00:01:39Porque simplemente te hace parecer más inteligente o algo así,
00:01:43o al menos no te hace parecer junior,
00:01:45¿no?
00:01:46Y entonces una de las cosas que al menos yo descubrí a medida que fui creciendo y programando,
00:01:52tuve más experiencia en programación y cosas así,
00:01:55es que hoy en día casi pido demasiado que me expliquen las cosas.
00:01:59Como que no me importa en absoluto parecer tonto..
00:02:03Estoy tipo, espera un momento, regresa.
00:02:05Como que no entendí esa parte.
00:02:06Como, ¿qué quieres decir con esto?
00:02:08O como, ¿qué significa ese término o lo que sea?
00:02:10Porque ahora simplemente ya no me importa eso..
00:02:12Como que no me preocupa tanto.
00:02:14Y quiero saber realmente porque he tenido mucha experiencia programando donde creí que sabía algo o fingí que sabía algo y me pasó factura..
00:02:22Estoy tipo, quiero saber realmente.
00:02:24Como quiero estar seguro de que cuando tengo una explicación de un bug o creo que sé la razón de una ralentización de rendimiento,
00:02:31siempre en el fondo de mi cabeza,
00:02:33pienso,
00:02:33si no he llegado realmente al fondo de esto,
00:02:36podría ser algo más.
00:02:37Podría ser,
00:02:38podría ser que la verdadera causa aún esté escondida ahí.
00:02:41Y simplemente no lo sé porque no lo he revisado completamente.
00:02:44Simplemente,
00:02:45sigo adelante porque es conveniente o lo que sea..
00:02:48Y la razón por la que quería hablar sobre la caída de DynamoDB es porque recientemente ha habido una serie de caídas de alto perfil.
00:02:56Hubo una grande que tumbó Google y resultó que fue algo donde no manejaron bien un campo vacío,
00:03:02¿verdad?
00:03:03O sea,
00:03:03en su programación,
00:03:04la forma en que estaban programando,
00:03:07fue tipo,
00:03:07vale,
00:03:08tenemos esta cosa.
00:03:09Cargamos un JSON y si no hay nada en el JSON,
00:03:12simplemente desreferenciamos un puntero nulo o algo así,
00:03:15¿no?
00:03:16Fue literalmente eso, ¿entiendes?
00:03:18Y luego hubo una con CrowdStrike donde básicamente tumbaron el mundo entero con pantallas azules.
00:03:24Y esa,
00:03:24dieron una explicación muy buena,
00:03:26fue realmente una buena explicación.
00:03:28Dijeron,
00:03:29hacemos cierta cosa de dimensionamiento de arrays y teníamos demasiadas reglas.
00:03:34Así que desbordó el array, ¿no?
00:03:36Y estas fueron bastante buenas cuando dieron lo que llaman RCAs o análisis de causa raíz,
00:03:41¿verdad?
00:03:42Cuando dijeron, aquí está por qué caímos.
00:03:44Cuando las leí,
00:03:45no sentí que hubiera muchas preguntas sin respuesta en mi mente.
00:03:49Tal vez no sabía literalmente la línea de código que,
00:03:52porque quizás no publicaron literalmente el fragmento de código,
00:03:56pero me dieron suficiente como para decir,
00:03:59vale,
00:03:59entiendo cómo alguien escribió este código y entiendo la estupidez que hicieron,
00:04:04¿no?
00:04:05Tipo, vale, no hagas eso.
00:04:06Lo entiendo.
00:04:07Y estoy totalmente conforme..
00:04:10Con el de DynamoDB, porque salió en este podcast, ¿verdad?
00:04:15Hablamos de ello cuando ese tipo en el Guitar Center, ¿no?
00:04:19Fue tipo, escuché a alguien hablando en el pub, ¿verdad??
00:04:24Sí.
00:04:25Increíble.
00:04:25Aquí vemos al escurridizo programador,
00:04:27una criatura simple que pasa la mayor parte de su tiempo trabajando solo,
00:04:31a menudo en la oscuridad,
00:04:32pero ¿qué es esto?
00:04:33Alguien está equivocado en internet.
00:04:35Nuestro programador entra en acción,
00:04:37alcanzando velocidades máximas de 120 palabras por minuto antes de que un destello de un sitio web en modo claro..
00:04:42El enemigo natural de estos amantes del código aturde a nuestro amigo.
00:04:45La persecución ha sido cancelada.
00:04:47Tendremos que atraparlos la próxima vez.
00:04:49Cuando no están en sus computadoras,
00:04:51pueden pasar horas dibujando símbolos toscos,
00:04:53algo que llaman pizarras.
00:04:54Los investigadores han descubierto miles de dialectos,
00:04:57a menudo con más de una docena usados en una sola oficina.
00:04:59Sin embargo,
00:05:00ningún lingüista ha descifrado aún cuál es su propósito..
00:05:03Criaturas vanidosas,
00:05:04sus cuerpos han evolucionado durante milenios para poder sentarse en posturas inusuales mientras se miran a sí mismos en línea.
00:05:11Esto suele durar muchas horas usando la excusa de que están esperando una revisión de código,
00:05:17pero presionados sobre por qué están tan inactivos.
00:05:20Y finalmente,
00:05:20después de un largo día de lograr muy poco,
00:05:23nuestros guerreros del teclado se preparan para dormir.
00:05:26Una lectura rápida y se apagan las luces..
00:05:29Buenas noches, pequeño programador.
00:05:30Entonces, ¿cómo duermo tan bien por la noche?
00:05:33Bueno, tengo Sentry para ayudarme a aplastar esos bugs.
00:05:37Y no estoy,
00:05:37no estoy hablando de pequeños bichos diminutos de Dakota del Sur que mueren en el invierno.
00:05:44Estoy hablando de grandes y malos bichos de la selva.
00:05:47Y no les tengo miedo a ninguno,
00:05:49por cierto,
00:05:50solo que puedo aplastar esos bugs con Seer de Sentry.
00:05:54Así que estaba un poco más motivado con ese para ir tipo,
00:05:58vale,
00:05:58déjame ver cuánta información han publicado.
00:06:01Y había leído,
00:06:02ya había leído después,
00:06:04tenían un resumen donde publicaron un RCA y fue muy vago.
00:06:08El RCA realmente no explicaba mucho.
00:06:10Luego noté que publicaron una presentación completa en re:Invent en diciembre,
00:06:15o bueno,
00:06:16no sé si re:Invent fue en diciembre,
00:06:18pero el video se subió en diciembre de la presentación de re:Invent donde cubrieron esta caída..
00:06:26Así que fui y vi todo eso.
00:06:28Y después de haber leído todo el RCA y visto la presentación completa,
00:06:33todavía me quedé pensando.
00:06:35No veo una explicación real del bug aquí, ¿verdad?
00:06:38O sea,
00:06:39estoy tratando de averiguar cuál fue el bug real y simplemente nunca se explicó..
00:06:45Entonces,
00:06:46lo que quería hacer era simplemente hablar de eso,
00:06:48repasar por qué no creo que explicaron cuál era el error y usarlo como ejemplo de que no creo que la gente debería simplemente decir: "Ah,
00:06:55vale,
00:06:55ya entiendo cuál era el error".
00:06:57Porque la gente me ha respondido diciendo: "Oh,
00:06:59déjame explicarte cuál era el error".
00:07:01Y luego explican las mismas cosas.
00:07:03Y yo digo: "Ese no es el error".
00:07:04¿Verdad?
00:07:05Entonces todo el mundo se ve incentivado a decir:
00:07:07"Lo entiendo porque lo leí"
00:07:09.
00:07:09Es como,
00:07:10no,
00:07:10si no puedes decirme cuál era el error real,
00:07:12entonces no hemos terminado aquí.
00:07:14¿Verdad??
00:07:14Deberíamos tener esa explicación más completa.
00:07:16Entonces,
00:07:17¿todo lo que estoy diciendo tiene sentido razonable?
00:07:19Sí.
00:07:19Primero que nada,
00:07:20solo quiero decir que sabía exactamente lo que estabas diciendo,
00:07:23Casey..
00:07:23Desde el principio, ¿verdad?
00:07:26Fue como de inmediato.
00:07:28Tú dijiste: "Vale, sé exactamente lo que estás diciendo.
00:07:32Sin preguntas de mi parte.
00:07:34Sin obstáculos.
00:07:36Gracias a todos.
00:07:37Estoy genial.".
00:07:39Los veo mañana, chicos.
00:07:40Ya saben, no hay problema.
00:07:42Solo quiero decir que me gusta mucho escuchar a Casey hablar en el podcast cuando lo escucho en Spotify,
00:07:48pero también justo ahora,
00:07:50podría escucharte hablar durante una hora.
00:07:52Gran reconocimiento también para Spotify.
00:07:55Justo iba a decir,
00:07:56iba a decir,
00:07:56especialmente cuando escuchas en Spotify,
00:07:59la calidad es increíble.
00:08:00También obtienes los extras adicionales, ¿verdad?
00:08:03Obtienes toda la charla antes y después del extra real.
00:08:07Empezamos a publicar versiones más largas en Spotify que son más del extra.
00:08:11Sí.
00:08:12Contenido menos fuera de tema,
00:08:13pero un poco más de cháchara en Spotify porque la audiencia en vivo se queda con la cháchara..
00:08:19Pueden entrar aquí.
00:08:20Pueden escuchar sobre Trash y su adicción a Pokémon,
00:08:23que probablemente ni siquiera conoces porque no estabas,
00:08:25estabas escuchando esto en YouTube,
00:08:27¿verdad?
00:08:27No vas a poder escuchar todas las cosas divertidas.
00:08:30Eso es una propuesta difícil de vender para los primeros 10 minutos de un video de YouTube.
00:08:34Es una venta muy difícil para un video de YouTube.
00:08:36Tipo:
00:08:37"Voy a ver a cuatro tipos hablar de algo que ni siquiera entiendo."
00:08:40Y se llama DynamoDB".
00:08:41Sí..
00:08:41Ya que estamos comenzando el podcast,
00:08:42tal vez deberíamos presentar a Adam.
00:08:44Ah, sí.
00:08:44Es un muy buen punto..
00:08:45No hemos hecho ninguna presentación en absoluto.
00:08:47Hola.
00:08:48Cuéntanos un poco sobre por qué estás en el podcast hoy..
00:08:50Porque estoy en la casa de TJ,
00:08:52razón número uno,
00:08:54la razón número uno por la que TJ requiere que todas las personas que visitan su casa estén en el podcast.
00:09:01Ha sido incómodo en un par de ocasiones.
00:09:04Sí.
00:09:05Ajá.
00:09:05¿Quién eres realmente??
00:09:07Aparte de ser un héroe de AWS.
00:09:09Ni siquiera eso.
00:09:10No fui héroe de AWS.
00:09:12Está bien..
00:09:13Expulsado del grupo de superhéroes.
00:09:15¿Cómo funciona eso?
00:09:16Simplemente no te renuevan..
00:09:18Fui héroe por un período y decidieron: "Oh, tú...".
00:09:21¿Es como algo de pago.
00:09:23¿Pagas para ser héroe?.
00:09:24No, no, simplemente ya no me importaba realmente.
00:09:27Nunca hablaba de ello.
00:09:28Así que dijeron: "Tal vez ya no es un héroe".
00:09:30Ahora es un villano.
00:09:31Casey parece que es parte de algún misterio de asesinato.
00:09:35Está parado ahí.
00:09:35Oh, amigo.
00:09:36Estamos a punto de conseguir, eh, como el, ¿cómo es?
00:09:39Nick Hill.
00:09:39¿Cómo se llama la persona que hace todos los dibujos en la pizarra y luego aparece?
00:09:44Casey Muratori.
00:09:45Ese es en el que estás pensando.
00:09:46Muratori.
00:09:47¿Es Muratori o es Muratori?
00:09:48Dios mío.
00:09:49Estás a punto de hacer visuales, ¿verdad?
00:09:51Así que sé que este es el mejor podcast..
00:09:54Literalmente, este es el mejor en el que participar.
00:09:58Se pronuncia Muratori en mi familia.
00:10:00Como casi si hubiera una Y ahí,
00:10:02como Muratori,
00:10:03pero eso es correcto.
00:10:05Realmente no tiene mucho sentido porque es en italiano,
00:10:08es un nombre italiano.
00:10:10Y en italiano sería Muratori o Muratori..
00:10:13No tiene sentido.
00:10:14Entonces, cómo se convirtió en Mur, no tengo idea.
00:10:18Fue algo italoamericano, como algo de inmigrantes que pasó.
00:10:22Supongo.
00:10:23No lo sé.
00:10:24Bien.
00:10:24Entonces, esto es efectivamente lo que dijeron..
00:10:28Tienen estas cosas llamadas puntos finales de API,
00:10:32pero los llaman así,
00:10:33¿verdad?
00:10:33Y estas son las direcciones de dominio.
00:10:36Como si buscas en DNS,
00:10:38es el nombre que vas a buscar para saber a quién se supone que debes enviar tus solicitudes de DynamoDB.
00:10:45Y estas cosas, supongo, se ven así..
00:10:47Y Adam probablemente puede confirmar esto porque él es,
00:10:52o era,
00:10:52un héroe.
00:10:53Se ven como, Oh, está atrasado.
00:10:56Sí.
00:10:56Estamos unos segundos atrasados porque nuestro video desapareció en River.
00:11:01Oh, ahí está.
00:11:02Entonces se ven como dynamodb.use-east-1.api.aws o algo así.
00:11:06Y supongo que depende de si estás usando IPv6 o IPv4.
00:11:10Tienen nombres diferentes según las cosas o si estás usando algo específico,
00:11:15como mencionaron que los gobiernos usan uno diferente o lo que sea.
00:11:20Así que estos nombres son como nombres que básicamente hardcodeas,
00:11:25supongo,
00:11:25en tu aplicación donde dices,
00:11:27cuando necesito hacer algo con DynamoDB,
00:11:30voy a solicitar esto.
00:11:31¿Tiene sentido.
00:11:32¿Y suena correcto, Adam.
00:11:34Porque yo no uso cosas de AWS.
00:11:36Sí?
00:11:37Sí?
00:11:37Sí.
00:11:38Está bien..
00:11:38Entonces,
00:11:39ya sabes,
00:11:39tú solicitas algo como esto y vas a enviar perfectamente.
00:11:42Quiero decir, sé lo que está diciendo.
00:11:45Sí.
00:11:45Entonces eso te va a redirigir a algún lugar porque obviamente no hay como una sola máquina que vaya a manejar todo el tráfico de DynamoDB en el universo entero.
00:11:55Incluso si lo subdivides por región,
00:11:58lo cual puedes ver aquí,
00:11:59se supone que debes elegir una región.
00:12:02Supongo que no lo envías a alguna dirección principal.
00:12:05Lo envías a una dirección regional o tal vez haya una dirección principal que puedes usar que lo resolverá.
00:12:12No lo sé..
00:12:13Pero de todos modos,
00:12:14en algún momento estás hablando con esto y esto necesita apuntar efectivamente a un esquema de balanceo de carga.
00:12:21Así que se supone que esta cosa apunta efectivamente a lo que ellos llamaron un árbol DNS..
00:12:27Aunque nunca realmente explicaron la naturaleza de árbol en absoluto.
00:12:31Sonaba más como un array ponderado,
00:12:33si quieres,
00:12:33donde simplemente decías,
00:12:34aquí hay un montón de máquinas y vas a elegir esas máquinas basándote en pesos que establecemos para poder balancear la carga,
00:12:41¿verdad?
00:12:42Entonces,
00:12:42si una máquina se atrasa,
00:12:44tal vez establecemos su peso más bajo.
00:12:46Y si una máquina parece algo vacía,
00:12:47establecemos su peso más alto.
00:12:49Y entonces lo llamaron un árbol.
00:12:51Así que asumo que es un árbol.
00:12:52Nunca explicaron cuál era la parte del árbol,
00:12:55pero se supone que este nombre debe apuntar.
00:12:57¿Puedo interrumpir por un segundo??
00:13:00Por cierto,
00:13:00alguien sí obtuvo su promoción a L6 basándose en ese árbol.
00:13:03Así que creo que la próxima vez deberías averiguar qué es ese árbol.
00:13:06Porque eso significó mucho para alguien.
00:13:08Bien.
00:13:09Hubo un paquete y cosas de ingenieros sucedieron.
00:13:11Estoy de acuerdo.
00:13:12El árbol probablemente es importante.
00:13:13Es solo que no es importante para el bug.
00:13:15E incluso eso,
00:13:16así que diré que no había necesidad de que explicaran el árbol..
00:13:19Así que estoy bien con que se hayan saltado qué está haciendo el árbol.
00:13:23Pero tengo una pregunta rápida también..
00:13:25Sí.
00:13:26¿Se llama árbol porque es un análisis de causa raíz o no??
00:13:29No más bromas.
00:13:30Estamos demasiado fuera de tema.
00:13:32Lo siento.
00:13:32Lo siento.
00:13:33Entonces de todos modos,
00:13:35se supone que esto debe apuntar a eso..
00:13:37Y eso,
00:13:38ese tipo de,
00:13:38este esquema de balanceo de carga básicamente de entradas DNS y la forma en que describieron esto en su presentación es que usarían algo como,
00:13:47digamos,
00:13:47plan uno 45 punto dynamo DB,
00:13:49como DDB punto AWS,
00:13:50¿verdad?
00:13:50Ahora bien,
00:13:51esta es la raíz de ese árbol,
00:13:53supongo,
00:13:53no análisis de causa raíz,
00:13:55sino como este árbol,
00:13:56esto contendría,
00:13:57esto es el registro de nivel superior de un montón de registros que le permiten hacer su balanceo de carga.
00:14:03Y asumo que route 53 tiene esta capacidad de balanceo de carga.
00:14:06Estoy leyendo entre líneas de la presentación.
00:14:09No lo dijeron explícitamente,
00:14:11pero asumo que route 53,
00:14:12a través del cual están haciendo todo esto,
00:14:15ya sabes,
00:14:15que es su propia cosa de DNS,
00:14:17permite que ese balanceo de carga ocurra simplemente configurando cosas aquí que dicen cómo debería funcionar el balanceo de carga en este momento.
00:14:25Y luego seleccionará la máquina correcta basándose en algún tipo de aleatorización en los pesos o lo que sea.
00:14:32Ahora,
00:14:32lo que dijeron fue que este nombre,
00:14:34que realmente existe.
00:14:35Y aparentemente hay un árbol o algo así.
00:14:38Este nombre es uno que simplemente usaron para la presentación.
00:14:41Nunca usaron realmente un nombre legible para humanos para este plan,
00:14:45como el uno 45 que he escrito aquí o lo que sea.
00:14:48En realidad era un hash de algo.
00:14:50Así que realmente sería como,
00:14:52ya sabes,
00:14:52cero a F E uno,
00:14:53dos,
00:14:54ya sabes,
00:14:54nueve a o algo así,
00:14:55¿verdad?
00:14:56Es en realidad lo que estaría ahí.
00:14:58Entonces,
00:14:58si fueras y miraras,
00:14:59no verías un nombre legible para humanos,
00:15:02o al menos en ese momento,
00:15:03no lo verías,
00:15:04supongo que no verías como plan uno 45.
00:15:06Solo verías eso.
00:15:07Y entonces la idea era, está bien, un usuario va a usarlo.
00:15:11Consultan este nombre,
00:15:12route 53 los dirigirá como hacia aquí.
00:15:14Y esta cosa es algún tipo de árbol de balanceo de carga que route 53 puede usar que te permitirá llegar a donde necesitas ir.
00:15:21Correcto.
00:15:22Eventualmente te darán una máquina real a la que puedes enviar tráfico.
00:15:26Nuevamente, no describieron nada de eso.
00:15:28Así que no tengo idea de cómo funciona nada de eso.
00:15:31Nunca he tocado ni usado route 53.
00:15:33Así que no tengo idea,
00:15:34pero simplemente asumiremos que eso sucede porque no importa para este bug..
00:15:41Tenemos un héroe de AWS.
00:15:43Así que si estás confundido,
00:15:44siempre puedes preguntarle a Adam y él puede tener más información.
00:15:48Quiero decir, sí, adelante..
00:15:50Bueno,
00:15:51route 53 tiene muchas formas diferentes en las que puedes dividir el tráfico.
00:15:54Así que sí, ponderado es una de ellas.
00:15:55Y eso suena como lo que describieron..
00:15:57Entonces,
00:15:58de alguna manera configuraron estos registros con eso.
00:16:00Y simplemente no dijeron cómo,
00:16:01pero algo,
00:16:02algo en formato de árbol hizo eso.
00:16:03Mi suposición es que hay como un ponderado,
00:16:05como el árbol tiene como ponderado,
00:16:07como hay un par de pesos en la parte superior que se ramifican a más pesos o algo así,
00:16:10porque eso es más fácil de manejar para él porque hay muchos de ellos o algo..
00:16:14Quién sabe.
00:16:14De todos modos, no tengo idea.
00:16:16El punto es,
00:16:16esto es lo que se supone que debe estar sucediendo normalmente..
00:16:20Ahora,
00:16:20la razón por la que esto se llama plan 145 aquí,
00:16:23aunque en realidad hubiera sido algún código hash,
00:16:26pero se refieren a él como plan 145 es que el balanceo de carga,
00:16:30como te puedes imaginar,
00:16:31tiene que ser algo continuo porque las máquinas de DynamoDB están haciendo cosas todo el tiempo.
00:16:37Se están sobrecargando más.
00:16:38Hay máquinas que se caen o se estrellan o quién sabe qué,
00:16:42¿verdad??
00:16:43Podría estar ocurriendo, estar fuera de línea.
00:16:46Se puede agregar nueva capacidad.
00:16:48Y entonces estas cosas tienen que actualizarse constantemente,
00:16:52todo el tiempo.
00:16:53Así que este punto de acceso principal de la API al que te conectas,
00:16:58constantemente tiene que ajustar ese árbol al que está apuntando.
00:17:03Y la forma en que lo hacen es crear otro árbol,
00:17:06el árbol al que van a moverse,
00:17:08¿verdad?
00:17:08Crean como, ya sabes, el plan 146 o algo así.
00:17:12Y crean todo el árbol aquí.
00:17:13Y luego cuando están listos,
00:17:15como cuando este árbol está terminado,
00:17:18toman este,
00:17:19ya sabes,
00:17:19este registro aquí,
00:17:21y en lugar de que apunte a ese,
00:17:23lo apuntan a este otro,
00:17:24¿verdad?
00:17:25Así que crean el nuevo,
00:17:27y se mueven a él simplemente cambiando ese nombre.
00:17:30Ahora,
00:17:31por alguna razón,
00:17:32y esta razón no está realmente explicada..
00:17:36La forma en que han configurado ese proceso es que lo dividen en dos partes.
00:17:41Hay algo llamado planificador,
00:17:43que básicamente determina cómo debería verse el nuevo árbol.
00:17:46Así que puedes imaginar que hay una máquina llamada planificador.
00:17:50Y no sé si es una máquina real o si es solo un proceso ejecutándose en alguna máquina que está ejecutando otras cosas,
00:17:58quién sabe.
00:17:58Pero hay algo llamado planificador.
00:18:00Y por lo que pude entender,
00:18:02solo hay uno,
00:18:03lo que significa que solo hay un planificador que está ahí sentado y determina cómo debería verse el nuevo plan al que vamos a cambiar..
00:18:13Y está constantemente haciendo esto.
00:18:16Así que genera el plan 145,
00:18:18luego genera el plan 146,
00:18:20luego genera el 147,
00:18:21148,
00:18:229,
00:18:2210,
00:18:23ya sabes,
00:18:24bla,
00:18:24bla,
00:18:25bla,
00:18:25bla,
00:18:26bla,
00:18:26¿verdad?
00:18:27Y simplemente sigue produciendo planes por toda la eternidad,
00:18:32porque ese es su trabajo.
00:18:34Ahora bien, aparentemente nunca los crea en realidad.
00:18:38Su trabajo no es crearlos nunca en Route 53.
00:18:42Es solo determinar cómo serían si alguien los pusiera en Route 53.
00:18:47Luego tienen tres promulgadores..
00:18:50Estos promulgadores obtienen el plan del planificador y lo ponen en Route 53.
00:19:06¿Tiene sentido esto?
00:19:07Ahora bien,
00:19:08un planificador,
00:19:09según tengo entendido,
00:19:10tres promulgadores.
00:19:11No hubo ninguna explicación de por qué sería así.
00:19:14Dijeron que la razón por la que hay tres promulgadores es porque se supone que es tolerante a fallos,
00:19:20como si uno de ellos se cae o algo.
00:19:21Pero nunca explicaron por qué entonces no necesitarías tres planificadores,
00:19:26porque si el planificador se cae,
00:19:27entonces los promulgadores no tienen nada que promulgar.
00:19:31Así que realmente no tenía mucho sentido.
00:19:33Así que no hubo una explicación en la presentación de por qué esta estructura se ve de la forma en que se ve.
00:19:39No es realmente tan importante para el error que se vea así,
00:19:42aunque en cierta forma sí lo es,
00:19:44como veremos más adelante.
00:19:45Así que me pareció un poco extraño el hecho de que no justificaran esto,
00:19:49pero está bien.
00:19:50Entonces, con suerte eso tiene sentido.
00:19:52Tenemos un planificador.
00:19:54Tenemos tres promulgadores.
00:19:55Los promulgadores están todos tratando de promulgar este plan.
00:19:59Ahora bien,
00:19:59lo que sucede aquí es que por,
00:20:01nuevamente,
00:20:02razones que lo único que dijeron en la presentación fue que hace que sea más fácil razonar al respecto.
00:20:07Esta es la única información al respecto.
00:20:10Dijeron que hace que sea más fácil razonar al respecto.
00:20:13Porque hace que sea más fácil razonar al respecto,
00:20:15estos promulgadores usan serialización.
00:20:18Así que en lugar de simplemente tratar de crear registros,
00:20:21y si los registros ya están ahí,
00:20:23simplemente no crearlos o algo,
00:20:24en otras palabras,
00:20:25tengo tres personas ejecutándose..
00:20:29Todos queremos crear,
00:20:31ya sabes,
00:20:31digamos este registro de nivel superior,
00:20:34plan146.ddb.aws,
00:20:35¿verdad?
00:20:36Todos estamos tratando de hacer eso.
00:20:38Uno de nosotros lo hace primero.
00:20:40La siguiente persona intenta hacerlo,
00:20:42y ya está ahí o algo así,
00:20:44¿verdad?
00:20:44Todos estamos tratando de crear el mismo registro.
00:20:47Así que en teoría,
00:20:48podríamos simplemente tener tres personas golpeando aleatoriamente cualquier parte del plan en la que estén tratando de trabajar,
00:20:56y en teoría debería funcionar,
00:20:58¿no?
00:20:58Y de alguna manera tuve la impresión,
00:21:01aunque no lo dijera explícitamente,
00:21:03tuve la impresión por parte del presentador de que estaría de acuerdo con lo que acabo de decir,
00:21:09es decir,
00:21:09que podrían haberlos dejado ejecutarse arbitrariamente y estaría o debería estar bien.
00:21:14Pero,
00:21:15dijo,
00:21:15usan serialización para facilitar el razonamiento.
00:21:18Lo que eso significa es que en lugar de que estos ejecutores simplemente golpeen así,
00:21:23lo que hacen en cambio es intentar adquirir un bloqueo para cualquier endpoint que estén tratando de actualizar.
00:21:30En otras palabras,
00:21:31si esta persona está tratando de actualizar una de estas cosas,
00:21:35y tuve la impresión de que era si estás tratando de actualizar esta,
00:21:39pero podría haber sido si estás tratando de actualizar esta,
00:21:43o podría haber sido en ambas.
00:21:44Nunca dijeron realmente al 100%,
00:21:46si mal no recuerdo,
00:21:47exactamente dónde estaba ocurriendo el bloqueo.
00:21:50Pero el bloqueo ocurre cuando dicen,
00:21:52está bien,
00:21:53voy a crear un bloqueo que es un registro DNS.
00:21:56Y al usar el hecho de que Route 53 tiene la idea de una operación atómica,
00:22:00que es,
00:22:01ya sabes,
00:22:01puedo hacer dos cosas y si ambas no tendrían éxito,
00:22:04entonces no hará ninguna de ellas..
00:22:08Básicamente crearon un sistema de bloqueo que bloquea a través de Route 53.
00:22:13Así que los registros DNS de Route 53 son en realidad el registro de bloqueo,
00:22:17si eso tiene sentido.
00:22:19¿Puedo hacer una pregunta rápida?
00:22:20Sí.
00:22:21¿Dijiste que hace esto a través de serialización?
00:22:24No entiendo muy bien qué significa eso.
00:22:26Porque pensaba que la serialización es solo convertir de una memoria a una representación de memoria diferente de algo.
00:22:33Lo siento, serialización diferente.
00:22:35Sí, eso es serialización.
00:22:37En este caso,
00:22:38nos referimos literalmente a serialización temporal,
00:22:41lo que significa que querían que estos ejecutores tuvieran algún tipo de manera en la que organizaran su comportamiento en un orden en lugar de ser simplemente arbitrario.
00:22:51Y la forma en que lo hicieron fue mediante bloqueo.
00:22:54Entonces lo que sucederá es,
00:22:55en lugar de que esta persona simplemente haga lo que sea que vaya a hacer,
00:23:00como,
00:23:00está bien,
00:23:01voy a,
00:23:01terminé esto,
00:23:02ahora voy a apuntar a este tipo al plan 146.
00:23:05En lugar de hacer eso,
00:23:06intenta adquirir un bloqueo en esto,
00:23:08¿verdad?
00:23:09Y si no obtiene el bloqueo, no hará el cambio.
00:23:11Entonces solo uno de estos ejecutores puede estar en el proceso de actualizar esto en un momento dado.
00:23:17¿Tiene eso sentido?
00:23:19Ajá.
00:23:19Ahora otra vez,
00:23:20exactamente qué estaban tratando de hacer con eso nunca se explicó.
00:23:24Solo dijeron que facilita el razonamiento y lo dejaron ahí.
00:23:27Así que no sé por qué pensaron que esto era una mejora.
00:23:31Y curiosamente, es lo que termina descubriendo el error.
00:23:34Entonces no fue una mejora.
00:23:36Si acaso, probablemente fue malo.
00:23:37Pero entonces Casey,
00:23:39¿estás diciendo que no tienen como,
00:23:41no tienen una buena razón para estar diciendo vamos a hacer que los ejecutores funcionen casi como uno a la vez?
00:23:47¿Por qué tienen, por qué tienen tres ejecutores?
00:23:50No lo entiendo.
00:23:51O sea, ¿por qué no tienen simplemente uno?
00:23:54Simplemente no dicen eso.
00:23:55No sabemos por qué.
00:23:56Y no explicaron del todo,
00:23:58como,
00:23:58realmente no escuché una explicación de cómo tienes tres ejecutores concurrentes.
00:24:03Esperas que puedan caerse, por eso tienes tres..
00:24:07Correcto.
00:24:08Pero están tomando un bloqueo.
00:24:09Entonces,
00:24:10¿qué pasa si este tipo toma el bloqueo y luego se cae??
00:24:13O sea, tampoco escuché una explicación para eso.
00:24:16Así que todo esto me resultó muy confuso.
00:24:19Como que,
00:24:19yo,
00:24:20yo,
00:24:20yo no me estoy quejando de ello como parte de lo que estamos hablando aquí,
00:24:24porque no es importante para el tema en cuestión.
00:24:27Pero como presentación, tuve muchísimas preguntas.
00:24:30Tipo,
00:24:31me quedé pensando,
00:24:32no entiendo por qué hiciste nada de esto para ser completamente honesto.
00:24:36¿Verdad?
00:24:36Y tal vez eso,
00:24:37de nuevo,
00:24:38parte de ello podría ser simplemente que no uso servicios de AWS.
00:24:41Puede que algunas de estas cosas serían obvias si eres alguien que usa regularmente Route 53 o algo así,
00:24:47estarías como,
00:24:48ah,
00:24:49es porque los bloqueos se pueden configurar con un tiempo de espera o sea,
00:24:53no sé.
00:24:54¿Verdad?
00:24:54Pero bueno, sí, entonces están haciendo eso.
00:24:57Y lo que termina pasando para,
00:24:58para esto,
00:24:59lo que descubre el error es que lo que termina pasando es que estos ejecutores,
00:25:03cuando no obtienen el bloqueo,
00:25:05simplemente hacen como un retroceso,
00:25:07¿verdad?
00:25:08Básicamente van a estar como,
00:25:09está bien,
00:25:10déjame esperar e intentaré de nuevo.
00:25:12Entonces un ejecutor,
00:25:13este ejecutor intenta obtener el bloqueo,
00:25:16pero alguien más ya tiene el bloqueo.
00:25:18Así que simplemente espera un poco.
00:25:20Intenta obtener el bloqueo de nuevo.
00:25:22Eso es lo que va a pasar.
00:25:23¿Verdad?
00:25:24Y lo que dijeron que pasó fue que llegaron a un caso patológico,
00:25:28entre comillas,
00:25:28donde uno de los ejecutores está,
00:25:30ya sabes,
00:25:31ha ejecutado algún plan.
00:25:32Y ese plan, digamos que era bastante viejo.
00:25:35Creo que usaron 110 como ejemplo que utilizaron.
00:25:38Entonces ejecutó el plan 110.
00:25:39Y quiere apuntar,
00:25:40ya sabes,
00:25:41es como,
00:25:41tengo que configurar la API para que apunte a mi 110,
00:25:44intenta obtener el bloqueo para actualizar dynamodb.use.one o lo que sea,
00:25:49y falla porque alguien más está ejecutando el plan 111 o algo así.
00:25:52¿Verdad.
00:25:53O el plan 109 podría haber sido un plan anterior.
00:25:56Entonces los otros ejecutores lo están haciendo?
00:25:58No puede hacerlo.
00:25:59Retrocede.
00:26:00¿Verdad?.
00:26:02Y recuerda este ejecutor aquí, estamos en 110.
00:26:05Está intentando, realmente quiere ejecutarlo..
00:26:07Intenta de nuevo.
00:26:08Alguien más tiene el bloqueo.
00:26:09Ahora intenta de nuevo, todavía bloqueado.
00:26:11Esta persona está estancada en 110,
00:26:13intentando desesperadamente ejecutar.
00:26:15No puede hacerlo.
00:26:15Al parecer esto simplemente pasó tantas veces que los otros ejecutores y el planificador simplemente está generando nuevos planes todo este tiempo.
00:26:22¿Verdad??
00:26:23Los otros ejecutores,
00:26:24llegan hasta como 145 o algo así y 146,
00:26:27están ejecutando planes que están como muy adelante de 110.
00:26:30¿Verdad?
00:26:31Y este tipo todavía está estancado porque simplemente por mala suerte nunca obtiene el bloqueo.
00:26:37¿Verdad?
00:26:37Finalmente,
00:26:38en algún momento después de que el plan 145 ya haya sido ejecutado y apuntado por algún otro ejecutor y todo eso,
00:26:45el plan 110,
00:26:46este ejecutor todavía intentando hacerlo finalmente obtiene el bloqueo.
00:26:50O sea, es como, sí.
00:26:51Y entonces dice, está bien, ahora estamos apuntando a 110.
00:26:55Sí.
00:26:55¿Verdad??
00:26:58Así que ahora está en un plan súper viejo y obsoleto,
00:27:00pero esto realmente no debería ser un problema.
00:27:02¿Verdad??
00:27:03Porque eventualmente la próxima vez que algún ejecutor tenga algo,
00:27:06va a ser un plan mucho más reciente.
00:27:07Simplemente ejecutarán el plan,
00:27:09ya sabes,
00:27:09146 o siete u ocho o lo que sea.
00:27:11Y lo volveremos a apuntar hacia esto y estaremos de vuelta a un plan actualizado.
00:27:14Así que todos tendrán simplemente un mal balanceo de carga por unos minutos,
00:27:18pero luego estará bien.
00:27:19¿Verdad?
00:27:19Sí tuvieron un mal balanceo de carga durante al menos unos minutos..
00:27:22¿Verdad?
00:27:23Sí.
00:27:23Cierto.
00:27:24Bueno, es mucho peor que eso.
00:27:26Eso es lo que se suponía que debía pasar.
00:27:29¿Verdad??
00:27:30Lo que significa que así es como esperarían que esto funcionara también.
00:27:34De acuerdo.
00:27:35El problema es que ellos,
00:27:36tampoco querían que Route 53 se congestionara con todos estos registros.
00:27:41Porque si simplemente los dejaban ahí,
00:27:43eventualmente después de,
00:27:44ya sabes,
00:27:45tres meses,
00:27:45tienes como 8 mil millones de registros que metiste en Route 53 por cada,
00:27:50ya sabes,
00:27:50cada par de minutos estás metiendo este gran árbol de pesos y todo eso.
00:27:54Pensaron,
00:27:55está bien,
00:27:55en algún momento simplemente deberíamos limpiar estos planes..
00:28:00Así que los enactors también buscan planes que tengan más de cierta antigüedad.
00:28:05Y si tienen más de cierta antigüedad, los eliminan.
00:28:09Entonces, lo que pasó fue que apuntaban al plan 110.
00:28:13Este enactor finalmente obtiene el bloqueo.
00:28:16Apunta al 110.
00:28:17Otro enactor dice, oh, vaya, 110, tío, eso es muy antiguo.
00:28:21Deberíamos deshacernos de eso y lo elimina.
00:28:24Así que ahora el DynamoDB us-east-1.api.aws está apuntando a un registro que no se puede resolver.
00:28:30Cierto.
00:28:31Es solo algo,
00:28:32en realidad,
00:28:33de nuevo,
00:28:33no se vería como plan 110.
00:28:35Se vería como OAFE129A, algún hash, punto, cierto, DDB.aws.
00:28:39Pero está apuntando a ese nombre.
00:28:41Y si preguntas por ese nombre, no obtienes nada..
00:28:46Entonces,
00:28:47lo que sucedería en ese punto es que todos los que intentaban obtener un endpoint para enviar cosas recibirían un nombre que no se puede resolver,
00:28:55básicamente.
00:28:55Cierto.
00:28:56Y realmente no sé qué pasa en Route 53 cuando eso ocurre,
00:28:59pero básicamente estarías recibiendo algo que o no podrías usar o simplemente galimatías como IP,
00:29:04quién sabe.
00:29:05Pero fuera lo que fuera,
00:29:06si intentabas usarlo realmente,
00:29:08no ibas a obtener una respuesta.
00:29:10Cierto..
00:29:10Interesante.
00:29:11¿Es esto porque AWS no usa suficiente Rust?
00:29:13Porque obviamente es un bug de use-after-free.
00:29:16Y entonces creo que Rust habría resuelto eso, ¿verdad?
00:29:19Si reescribieras Route 53 completamente en Rust,
00:29:22obviamente,
00:29:23todos estos problemas no estarían ahí.
00:29:25No,
00:29:25para ser específico,
00:29:27creo que en la presentación sí dijeron,
00:29:29no sobre Rust,
00:29:30pero sí dijeron qué pasaría específicamente,
00:29:32que creo que cuando preguntabas por esta cosa o bien esta cosa o esta cosa,
00:29:36no sé a cuál se referían,
00:29:38porque no puedo recordarlo bien,
00:29:40recibirías algo que dice no se encontraron registros.
00:29:43Así que ese es el resultado final de lo que pasaría,
00:29:46ya sea al preguntar por esto o por aquello,
00:29:48no estoy seguro,
00:29:49pero simplemente recibirías no se encontraron registros.
00:29:52Eso es lo que habrías recibido cuando intentabas llamar a esa API.
00:29:56Así que cualquier biblioteca que estuvieras usando para usar DynamoDB simplemente diría,
00:30:01hey,
00:30:02no se encontraron registros,
00:30:03tío.
00:30:04Lo siento.
00:30:05Cierto.
00:30:05Entonces esto,
00:30:06si le preguntas a alguien en internet,
00:30:08cierto,
00:30:09todos están como,
00:30:10sí,
00:30:10explicaron el bug.
00:30:11Ese es el bug.
00:30:12El bug es que hubo esta condición de carrera, cierto.
00:30:15Todos,
00:30:15porque todos,
00:30:16tan pronto como dices condición de carrera,
00:30:19el cerebro de todos se apaga.
00:30:20Dicen, oh, está bien, bueno, fue una condición de carrera.
00:30:24Hecho.
00:30:24Nada que ver aquí, ¿cierto?
00:30:26Entonces dicen, es una condición de carrera.
00:30:28Lo explican.
00:30:29Es como, no, no lo explicaron.
00:30:31Porque si piensas en lo que pasaría aquí,
00:30:33inmediatamente después de esto,
00:30:35todos están recibiendo esto,
00:30:37es un nuevo enactor.
00:30:38Un nuevo enactor simplemente enactaría uno nuevo, ¿cierto?
00:30:41Y entonces el bug, cierto, es ¿por qué no ocurrió eso?
00:30:44Ese es el RCA real que quería ver es ¿por qué el siguiente enactor no vino a arreglarlo?
00:30:49¿Puedo plantear algo más?
00:30:51¿No sería también un bug?
00:30:52Tipo,
00:30:53¿por qué escribir un registro tan antiguo que debería eliminarse inmediatamente?
00:30:57Bueno,
00:30:58fue porque fue que este tipo lo había escrito hace bastante tiempo.
00:31:02Y fue el peso.
00:31:03Bueno,
00:31:03quiero decir,
00:31:04si estás preguntando,
00:31:05¿por qué no escribieron enactors con mejor código?
00:31:08Sí, eso es bastante genial..
00:31:11Vale, justo.
00:31:12Parece que si estás actualizando a algo que debería eliminarse inmediatamente,
00:31:16¿no es como que eso se siente como el problema ahí mismo?
00:31:19Has hecho algo mal mucho antes.
00:31:21Sí,
00:31:21aunque realmente no arregla la estructura teórica de esta cosa,
00:31:25una simple verificación en este tipo cuando después de terminar de esperar por el bloqueo,
00:31:30tal vez debería verificar si está a punto de establecer esto en algo que él eliminaría si estuviera ejecutando su código de eliminación es probablemente una buena medida de seguridad.
00:31:39Pero sí, así que 100% de acuerdo con él.
00:31:42Vale,
00:31:42pero un enactor trabajó muy,
00:31:44muy duro para obtener ese registro.
00:31:46Esperando mucho tiempo.
00:31:47Oh, va a tener sus tarjetas Pokémon..
00:31:49Nadie jamás esperó.
00:31:50Así que solo déjalo escribir el registro.
00:31:53Vale.
00:31:53Entonces, quiero escuchar sobre eso..
00:31:56Desafortunadamente,
00:31:57si miras la presentación y miras el RCA,
00:32:01no aparece por ningún lado.
00:32:03La presentación al menos tiene un pequeño fragmento de 12 segundos donde sí dice dónde estaría aproximadamente el error.
00:32:14Así que déjame explicar qué es eso.
00:32:17Entonces,
00:32:18lo que aparentemente ocurre junto con esto es que cuando haces DynamoDB us-east-one,
00:32:26pero cuando apuntas eso a tu plan,
00:32:29también haces otra operación al mismo tiempo.
00:32:33Y esa operación es establecer el rollback..
00:32:40Creo que es DD.
00:32:41¿Es DDB punto rollback punto AWS?
00:32:45No recuerdo exactamente qué es aquí..
00:32:49Hay un registro de rollback.
00:32:51Establece ese registro en lo que sea que fuera el plan antiguo.
00:32:55Entonces,
00:32:55si estuviéramos aquí apuntando al 145,
00:32:58y ahora vamos a apuntar al 110,
00:33:00¿verdad?,
00:33:00estos viejos actores,
00:33:02como que me estoy moviendo al 110,
00:33:04intenta establecerlo,
00:33:05tomar cualquiera que fuera este nombre,
00:33:08ahora mismo,
00:33:09y mover ese nuevo,
00:33:10ese nombre,
00:33:11que habría sido el plan 145,
00:33:13moverlo para que la dirección de rollback apunte al plan antiguo.?
00:33:18Exacto.
00:33:18Y esto es solo para depuración.
00:33:20O,
00:33:20ya sabes,
00:33:21básicamente es solo para facilitar las cosas al operador,
00:33:24¿verdad??
00:33:24Si quieren volver al plan anterior o algo así,
00:33:27o si simplemente quieres saber cuál era el plan anterior,
00:33:30puedes verlo aquí,
00:33:32¿verdad?
00:33:32Esa es la primera parte de cómo,
00:33:34de lo que dijeron sobre el fallo.
00:33:36Quiero señalar una cosa aquí: esto tampoco tenía sentido para mí.
00:33:40Porque pensé,
00:33:40está bien,
00:33:41me estás diciendo que estas cosas se actualizan cada minuto o algo así.
00:33:45¿De qué sirve tener uno de esos?
00:33:47Tipo,
00:33:48para cuando hayas iniciado sesión,
00:33:50ya se ha actualizado del que querías revertir a alguna cosa nueva.
00:33:54Ese es en realidad el plan que no quieres porque todo se cayó,
00:33:57¿verdad?
00:33:58O sea, ¿cierto?
00:33:59Si tú,
00:33:59tú no quieres esto,
00:34:00solo quieres estos nombres en una lista.
00:34:02Para poder decir, ¿cuál era a las 12:30?
00:34:05Ese, ¿verdad?
00:34:06Así que esto no tenía ningún sentido para mí.
00:34:08Literalmente no tengo idea de por qué esto sería bueno alguna vez,
00:34:12¿verdad?
00:34:13No parecía que fuera a hacer lo que realmente quieres,
00:34:16que es poder marcar un punto en el tiempo y decir,
00:34:19necesitamos volver a la 1 de la tarde porque todo se fue al carajo después de eso,
00:34:23¿verdad??
00:34:26De todos modos, eso no tenía sentido para mí.
00:34:29Pero de nuevo, no exactamente está ahí el error.
00:34:31Así que no pregunté por qué,
00:34:33solo estoy diciendo,
00:34:34está bien,
00:34:35eso es lo que tenía que hacer.
00:34:36Y solo puede retroceder una versión es lo que estás diciendo.
00:34:39Sí, aunque los otros árboles sí existen.
00:34:41Así que fácilmente podrías con solo saber cuál era el nombre.
00:34:45Entonces todo esto es,
00:34:46es poner un nombre legible por humanos en algo que casi seguramente no te importa.
00:34:50Exacto.
00:34:51Pero realmente no pueden almacenar tantas cosas..
00:34:54Casey,
00:34:54no creo que realmente puedan poner como,
00:34:56no sé,
00:34:57Adam,
00:34:57como esto,
00:34:58no tienen mucha escala ahí,
00:34:59¿verdad?
00:35:00Tipo, son muchas líneas.
00:35:01Si fuera yo,
00:35:02simplemente habría hecho esto una marca de tiempo.
00:35:05Si eso es lo que querías, ¿verdad?
00:35:07Habría dicho,
00:35:07¿cuándo apuntó el planificador o cuándo esta persona apuntó a esta cosa?
00:35:11Como cuando obtuviste el bloqueo,
00:35:13cambias este nombre a la marca de tiempo,
00:35:15y actualizas esto en una sola operación atómica.
00:35:18Entonces simplemente sabes que si quiero volver a la 1 de la tarde,
00:35:21solo busco la que tenía la marca de tiempo,
00:35:24ya sabes,
00:35:24la marca de tiempo más antigua,
00:35:26no posterior a ese momento..
00:35:28Y eso es lo que estábamos ejecutando en ese momento.
00:35:30Eso es lo que yo habría hecho.
00:35:31Exacto.
00:35:32Pero no sé.
00:35:32Así que no tengo idea de por qué hicieron esto.
00:35:34Hicieron lo que hicieron.
00:35:35Yo, ya sabes, tal vez podría tener perfecto sentido.
00:35:37De nuevo, no tengo conocimiento de su sistema.
00:35:39Todas estas cosas, tienen perfecto sentido..
00:35:41Así que realmente no estoy,
00:35:42solo estoy diciendo que no las entiendo.
00:35:43No sé, podrían no ser malas ideas, ¿verdad??
00:35:45Podrían ser buenas ideas,
00:35:46si entendieras el resto del sistema.
00:35:48Así que como sea,
00:35:49entonces lo que dicen,
00:35:51y esto es todo lo que obtenemos,
00:35:52es esta operación,
00:35:53es decir,
00:35:54configurar el rollback para que apunte al plan antiguo que estaba siendo,
00:35:58ya sabes,
00:35:58que en este caso en realidad habría sido más nuevo en algunos casos,
00:36:02¿verdad?
00:36:03Así que no es realmente el plan apuntado anteriormente,
00:36:06que puede ser más antiguo,
00:36:07puede ser más nuevo.
00:36:08Realizar esa actividad..
00:36:11Si ese plan ya no existiera,
00:36:13es decir,
00:36:13si hubiera sido eliminado así,
00:36:15entonces el enactor se detiene permanentemente.
00:36:19Así que cada vez,
00:36:20una vez que llegas a un estado donde dynamodb.usc es ese,
00:36:24¿verdad.
00:36:25Hacemos toda la secuencia de pasos que dijimos aquí?
00:36:29Este plan se elimina..
00:36:31Así que ahora esto está apuntando a un nombre inválido,
00:36:34como irresoluble,
00:36:34no podemos resolver plan plan dash 110,
00:36:36que en realidad es algún código hexadecimal.
00:36:38Pero sea lo que sea eso, ya no podemos resolverlo..
00:36:41Una vez que ese estado es verdadero,
00:36:43la próxima vez que un enactor viene e intenta hacerlo apuntar a un nuevo plan,
00:36:49cualquiera que sea ese nuevo plan,
00:36:51no puede,
00:36:51cuando realmente llega hasta aquí e intenta establecer el rollback,
00:36:56eso lo hará fallar permanentemente.
00:36:58Por lo tanto,
00:36:59los tres enactors ahora se detendrán porque eventualmente los tres intentarán ejecutar un nuevo plan.
00:37:06Intentarán establecer primero el rollback para apuntar a cualquiera que fuera el plan anterior,
00:37:12encontrarán que no hay ningún plan ahí.
00:37:15Y eso aparentemente es simplemente un fallo crítico.
00:37:18Oh, eso es una locura.
00:37:19Pensé que los tres enactors estaban supuestos a hacer que tuviera redundancia.
00:37:25Ahora,
00:37:25de nuevo,
00:37:26es por esto que me pongo de mal humor con la gente en línea que está respondiendo.
00:37:31Están como, fue una condición de carrera.
00:37:34No fue una condición de carrera.
00:37:36La condición de carrera no es necesaria para esto.
00:37:39La condición de carrera es solo por qué terminaste con este nombre siendo irresoluble.
00:37:45Pero si no hubieras tenido el código que hizo esto mal,
00:37:49simplemente habría funcionado..
00:37:52Nunca te habrías enterado.
00:37:53Habrías tenido una interrupción momentánea de un minuto en DynamoDB o algo así,
00:37:58pero supongo que hay interrupciones de un minuto en DynamoDB de vez en cuando.
00:38:02Eso no es noticia global..
00:38:04Lo que es noticia global es tirarlo permanentemente,
00:38:07que es lo que pasó aquí.
00:38:08Y hasta que un humano real vaya y descubra esto,
00:38:10lo reinicie,
00:38:11ponga estos enactors en funcionamiento otra vez,
00:38:13simplemente se fue.
00:38:14Está fuera permanentemente.
00:38:16Así que potencialmente horas.
00:38:17Y fue lo suficientemente largo,
00:38:18supongo,
00:38:19en este caso para luego tener fallas en cascada.
00:38:21Nunca habrías tenido eso.
00:38:23Es solo una interrupción momentánea.
00:38:24Si algunas personas obtuvieron momentáneamente un nombre irresoluble o sin registros,
00:38:29entonces simplemente lo intentarían de nuevo.
00:38:31Eso es usualmente como con DNS,
00:38:32eso es como tu teléfono,
00:38:33pasaste por un túnel.
00:38:34Eso es todo lo que habría sido..
00:38:37Así que quiero saber ¿cómo se veía el código aquí?
00:38:40¿Cómo escribiste algo que si esto no fuera un nombre válido,
00:38:44lo cual ni siquiera sería al inicio,
00:38:46es decir,
00:38:47si estuvieras iniciando este sistema y el operador no lo hubiera preconfigurado,
00:38:52no estaría apuntando a nada.
00:38:53Ese es el caso predeterminado con el que pensarías que empezarías.
00:38:57Así que si vas a hacer esto,
00:38:59pensarías que simplemente manejarías ese caso porque la dirección de rollback simplemente podría no apuntar a nada.
00:39:06Solo toma lo que sea esto.
00:39:08Si no es nada, establece la dirección de rollback en nada..
00:39:12Hecho.
00:39:12Así que hay algo realmente extraño sobre la forma en que escribieron este código.
00:39:17Y eso es lo que debería haber estado en el RCA.
00:39:20Ese es todo el bug para mí.
00:39:21Esto es solo decorado para cómo terminamos teniendo esta cosa apuntando a nada.
00:39:26El mismo bug habría ocurrido si alguien hubiera eliminado accidentalmente este registro.
00:39:31Como algún operador estaba simplemente como,
00:39:33ups,
00:39:34mierda,
00:39:34lo puse en nada..
00:39:35Este mismo bug habría sucedido según la presentación.
00:39:38Así que la causa raíz no es la condición de carrera.
00:39:41La condición de carrera es un aparte.
00:39:43¿Tiene sentido?
00:39:44Pregunta rápida.
00:39:45Así que estoy legítimamente pensando en esto.
00:39:48Y eso significa que la cosa que establece el rollback probablemente asume algún tipo de struct con un montón de memoria o algo que ha sido pasado,
00:39:56hace algún tipo de acceso.
00:39:57Explota.
00:39:58¿O crees que este es el mismo estilo de bug,
00:40:00que es la única línea que tumbó Cloudflare,
00:40:03que es que simplemente asumen que está ahí y lo desenvuelven??
00:40:07Está en Rust.
00:40:08Es Rust con seguridad de memoria.
00:40:10Lo desenvuelve, explota..
00:40:13Realmente no lo sé.
00:40:14Mi suposición,
00:40:14como en mi cabeza,
00:40:15estaba pensando,
00:40:16¿cuál es esa cosa que veo que la gente hace muchas veces y siempre me pregunto,
00:40:20por qué harías esto?
00:40:21Pero es simplemente porque es la forma en que aprendieron a programar.
00:40:25Y estaba pensando que,
00:40:26si estuvieras escribiendo en uno de esos lenguajes que les gusta lanzar excepciones para condiciones de error,
00:40:32este sería un gran ejemplo de eso.
00:40:34Entonces,
00:40:35si tuvieras algo donde dijeras,
00:40:36oh,
00:40:37fui a buscar el registro DNS al que apunta esta cosa..
00:40:40Y normalmente en un entorno de programación sensato,
00:40:43nadie lanza una excepción ahí.
00:40:45Si no obtienen nada, simplemente devuelven nada.
00:40:47Y luego cuando la persona va a establecer ddb.robot.js,
00:40:50simplemente lo establecen en nada,
00:40:52que es el comportamiento correcto.
00:40:53Como que nada fluye,
00:40:54literalmente el valor nada fluye correctamente a través de este flujo.
00:40:58Entonces,
00:40:58si lo estuvieras escribiendo para ser,
00:41:00dado que es un servicio fundamental básico,
00:41:03asumiendo que intentabas escribir algo tolerante a fallos,
00:41:06nunca harías algo como lanzar una excepción.
00:41:08Así que en mi cerebro,
00:41:09estoy pensando,
00:41:10apuesto a que lo que sucede aquí es que cuando pides este registro,
00:41:13simplemente usan alguna llamada de biblioteca o algo que lanza una excepción cuando el registro no existe.
00:41:19Y simplemente lanzó una excepción y el actor terminó.
00:41:21Esa es mi suposición.
00:41:22Y podría estar muy equivocado al respecto porque solo estoy adivinando a lo loco.
00:41:26Pero por eso quiero ver el RCA.
00:41:28¿Qué fue.
00:41:29Podría ser exactamente las cosas de las que hablaba Trash.
00:41:32Quiero decir,
00:41:32podrían ser las cosas de las que hablaba Prime?
00:41:35Podrían ser las cosas que acabo de decir.
00:41:37Podría ser cualquier cosa.
00:41:38Y quiero saberlo porque ahí es donde estaría la verdadera educación aquí.
00:41:42Evitar esta condición de carrera es completamente irrelevante.
00:41:45Esta condición de carrera podría haber vivido ahí.
00:41:48Y aunque era importante eventualmente arreglarlo,
00:41:50para evitar esas extrañas interrupciones de cinco segundos una vez al año o algo así,
00:41:54en realidad no es lo que más queremos aprender.
00:41:57Lo que más queremos aprender es no escribir esta cosa.
00:42:00Y ni siquiera sabemos qué era esta cosa.
00:42:02Entonces, ¿cómo la evitamos.
00:42:03Por eso creo que fue un mal RCA.
00:42:05¿Tiene sentido?
00:42:05Sí.
00:42:06Sí?
00:42:06Está bien.
00:42:07¿En qué está escrita la mayor parte de AWS, Adam?.
00:42:11Era Java.
00:42:12Iba a decir que alguien del chat dijo Scala.
00:42:15Dijeron que trabajaron en AWS durante siete años y que la mayor parte está escrita en Scala.
00:42:22Bueno, eso es técnicamente Java con pasos adicionales.
00:42:27Y eso los enfurecerá sin fin.
00:42:29Así que eso es realmente todo para mí..
00:42:34Esto fue algo donde pensé,
00:42:35no siento que haya visto la explicación.
00:42:37Y en realidad siento que es importante escucharla porque había una mala práctica de programación en el fondo de todo esto.
00:42:42Y quiero saber qué era,
00:42:43especialmente porque ayuda a personas como yo cuando,
00:42:46ya sabes,
00:42:46en realidad no hago mucha educación en arquitectura en este momento,
00:42:49pero en algún momento probablemente me gustaría hacer algo de eso porque creo que hay mucha mala arquitectura por ahí.
00:42:55Así que intento prestar atención a estas cosas.
00:42:57Como,
00:42:57¿cuáles son los tipos de errores arquitectónicos que comete la gente?
00:43:00Y apuesto a que este fue uno de ellos.
00:43:02Cierto.
00:43:02Y me gustaría saberlo.
00:43:03Me gustaría saberlo..
00:43:04Sí.
00:43:05Creo que lo que esperaría es al menos un ejemplo simple y reproducible de por qué explotó,
00:43:10como un pequeño fragmento de código completo.
00:43:13Y esto es algo que mencionaste antes,
00:43:15sobre cómo abordamos este tipo de cosas.
00:43:17Si estoy revisando el código de alguien y veo algo que parece raro,
00:43:21siempre hago mi mejor esfuerzo por crear mi propio entorno de prueba y comprobar mi teoría.
00:43:26Y luego les muestro el código tipo: esto es por qué probablemente está mal,
00:43:31aquí hay un paso pequeño,
00:43:32simple y reproducible.
00:43:34Así que esperaría algo así.
00:43:35Y eso también me ayuda a entenderlo realmente.
00:43:38Porque mucha gente,
00:43:39como dijiste,
00:43:40verá algo que se ve raro,
00:43:41pero no saben por qué se ve raro,
00:43:43pero no puedo quedarme ahí.
00:43:45Tengo que construirlo y entenderlo.
00:43:47Eso es lo que esperaría.
00:43:48Y ya sabes,
00:43:49como dije,
00:43:49las interrupciones de CrowdStrike y Google me parecieron mejores porque te decían: mira,
00:43:55fue una desreferencia de puntero nulo aquí,
00:43:57o fue un acceso fuera de límites del array porque pensábamos que solo habría 20 y pusimos 21 en el archivo de configuración.
00:44:04Y entonces sé exactamente qué tipo de código,
00:44:07ya sabes,
00:44:08está causando ese tipo de problema.
00:44:10Y además,
00:44:10además,
00:44:11retomando un comentario anterior,
00:44:12literalmente,
00:44:13hasta donde sé,
00:44:14todos los que programan en Rust solo lo hacen para que ocasionalmente,
00:44:18cuando ven algo así,
00:44:19puedan decir: bueno,
00:44:21si lo hubieran escrito en Rust,
00:44:22no habría pasado.
00:44:23Ni siquiera les dieron suficiente información para hacer ese comentario..
00:44:29Probablemente igual lo hicieron,
00:44:31para ser justos,
00:44:32pero no les dieron la información.
00:44:34Así que tienes que dar una regla que debería seguirse en los RCA: tienes que darles a los Rustáceos suficiente información para que,
00:44:41si así lo eligen,
00:44:42puedan decir correctamente que se habría prevenido en Rust..
00:44:46Y esto, no tenemos eso.
00:44:48No sabemos si esto se habría prevenido en Rust..
00:44:51No tenemos ni idea.
00:44:52Probablemente no, pero no lo sabemos.
00:44:55Bueno,
00:44:55Casey,
00:44:56sí tenemos bastantes probabilidades porque probablemente nunca se habría lanzado.
00:45:01Así que lo habría prevenido..
00:45:03Cierto.
00:45:03Tendríamos cero actores en producción porque todavía estaríamos diseñando los actores de conjunto.
00:45:09Sí..
00:45:09CloudFlare hace un trabajo realmente bueno en esto también.
00:45:13Van y muestran un montón de líneas de código y dicen: esto es exactamente lo que está pasando,
00:45:18aunque el problema esté arriba,
00:45:20esta es la línea que explotó debido a todas estas condiciones previas.
00:45:24Eso era yo burlándome de Rust con el unwrap,
00:45:27que en realidad no era el verdadero problema.
00:45:30Pero ya sabes, todas estas cosas ocurren.
00:45:32Así que hacen un trabajo realmente bueno.
00:45:34Me sorprende lo mal que lo ha hecho AWS en este caso.
00:45:38Y lo otro también es que ahora me hace,
00:45:40me hace innecesariamente sospechoso de ustedes,
00:45:43¿verdad??
00:45:44Cuando leo esto, pienso: ¿estás ocultando algo?
00:45:46¿Realmente no descubriste cuál era el error?
00:45:48Hablaste todo el tiempo sobre esta condición de carrera,
00:45:50pero incluso desde tu propia presentación,
00:45:52puedo darme cuenta de que la condición de carrera realmente no era importante.
00:45:56Eso fue solo,
00:45:56eso fue solo lo que llevó a que el registro se estableciera en nada,
00:45:59pero ¿a quién le importa,
00:46:00verdad?
00:46:01Es como algo que está bien poner en el RCA como una explicación de por qué este error ocurrió ahora,
00:46:05en lugar de en otro momento,
00:46:07pero no es el error.
00:46:07Así que me parece extraño.
00:46:09Cuando veo un RCA que no habla sobre el error,
00:46:11ahora desconfío.
00:46:11¿Verdad?
00:46:12E innecesariamente,
00:46:13porque si realmente lo encontraste,
00:46:14solo dímelo,
00:46:15y ahora sé que lo encontraste.
00:46:16¿Verdad?
00:46:16Entonces es como,
00:46:17creo que también es un impulso de confianza para las personas que están mirando desde afuera y quieren saber,
00:46:22¿pueden confiar en esta cosa de DynamoDB?
00:46:24Si parece que realmente encontraste el error,
00:46:26tengo un poco más de confianza en ti.
00:46:27Si parece que no tienes idea de cuál era el error,
00:46:30o no pareces entender cuál era el error,
00:46:31entonces estoy,
00:46:32eso me preocupa más.
00:46:33Y por eso creo que esa es también otra razón para hacer esto en tu RCA..
00:46:37Esto, esto proporciona confianza a tus clientes.
00:46:40Tal vez por eso también despidieron a Adam como héroe de AWS..
00:46:43Tal vez todo está conectado.
00:46:44Podría ser.
00:46:45No querían que él expusiera estos secretos sucios..
00:46:48Sí.
00:46:48Sabía demasiado.
00:46:49Sabía demasiado.
00:46:50¿Podrías dar un,
00:46:51podrías dar un resumen rápido de tres minutos de la tienda de guitarras?
00:46:56¿Qué era eso, qué estaba revelando?
00:46:58Porque estoy tratando de recordar qué era,
00:47:00porque involucraba como un tipo de punto único de falla que también estuvo aquí para esta falla.
00:47:06Así que no sé cómo reconciliar las dos cosas.
00:47:09Y por supuesto no tenemos idea.
00:47:11No tenemos idea si alguno nos está diciendo la verdad ahora,
00:47:14¿verdad?
00:47:15Porque este fue un RCA tan malo,
00:47:17no tengo idea si es correcto o no,
00:47:19pero sí,
00:47:19la contraseña era wishbone 12,
00:47:21creo..
00:47:22Ahí lo tienes.
00:47:23Siempre intentan matarme.
00:47:24Ese es mi recuerdo de todos modos..
00:47:26Entonces sí,
00:47:27esa historia era que,
00:47:28que había una,
00:47:29había una cosa que estaba diseñada para copiar configuraciones.
00:47:33Y esa cosa se había vuelto rebelde y no podía detenerse.
00:47:36Era como,
00:47:37simplemente estaba copiando configuraciones totalmente incorrectamente y necesitaba ser como arreglada o reparada o algo así.
00:47:45Y no tenemos más información porque fue una conversación escuchada por casualidad.
00:47:50¿Verdad?
00:47:50Entonces, ¿eso concuerda con esto?
00:47:53Bueno,
00:47:53un poco,
00:47:54porque esos enactors sí suenan como el tipo de cosa que estaría ejecutando una copia de configuración,
00:48:00pero por otro lado,
00:48:01no es realmente una configuración para máquinas.
00:48:04Es como una entrada DNS es una entrada DNS.
00:48:07No es, no es realmente una configuración.
00:48:09Así que diría que las dos historias no coinciden tan bien..
00:48:14¿Y por eso es otra razón por la que esperaba que este RCA fuera un poco más creíble,
00:48:19porque quería saber con certeza que la historia era falsa.
00:48:22Y todavía realmente no lo sé,
00:48:24basándome en lo malo que es este RCA.
00:48:26¿Y si,
00:48:26y si la herramienta que el tipo escribió para copiar las configuraciones es literalmente el enactor?
00:48:32Como que simplemente lo pusieron en producción y él,
00:48:35y como que no lo han cambiado en siete años.
00:48:37Esa fue mi forma de conectar los puntos.
00:48:40Hubo,
00:48:40él es como: chicos,
00:48:41escribí eso como una forma para que yo probara cosas en mi entorno local.
00:48:45Y ustedes simplemente decidieron hacer tres enactors y ponerlos uno al lado del otro en prod.
00:48:51No sé, ¿cómo pasó esto?
00:48:52Yo no..
00:48:53Tengo preguntas alternativas.
00:48:54Sí.
00:48:55Alternativamente, ¿es el rollback?
00:48:56Porque ese es el que hizo la copia de tipo,
00:48:58oye,
00:48:59aquí está el anterior.
00:49:00Cierto.
00:49:00Y entonces voy a copiar el anterior.
00:49:02Luego se genera este problema de null.
00:49:04Y simplemente el script nunca lo encontró o el conocimiento se vuelve incontrolable y comienza a escribir una y otra y otra y otra vez hasta el punto en que no puedes,
00:49:12no puedes hacer nada.
00:49:13No lo sé.
00:49:14Todo lo que sé es que,
00:49:15por lo que puedo deducir de su explicación,
00:49:17basándome solo en lo que estaban proporcionando,
00:49:20sigo pensando que la condición de carrera ni siquiera es relevante porque,
00:49:23de nuevo,
00:49:24literalmente una actualización accidental al endpoint de Route 53 habría derribado a los tres y a los actores inmediatamente.
00:49:30Porque según ellos,
00:49:31todo lo que se requiere para detenerlos es si el,
00:49:33si el endpoint apunta a un nombre no resoluble,
00:49:36eso es todo lo que necesitas.
00:49:37Y entonces,
00:49:37si eso es realmente cierto,
00:49:39literalmente un error tipográfico de un operador podría haber derribado todo esto,
00:49:43sin necesidad de condición de carrera.
00:49:45Cierto.
00:49:45Y entonces,
00:49:46de nuevo,
00:49:46el RCA simplemente no hace un buen trabajo convenciéndome de que han hablado sobre cuál fue el error real,
00:49:52porque puedo pensar en tantas formas en que podrías haber desencadenado exactamente esto mismo que no involucran esta condición de carrera de la que pasaste todo el RCA diciéndome que era el error,
00:50:01pero no creo que lo sea.
00:50:03Así que gracias,
00:50:03Casey,
00:50:04por darnos esa presentación increíble.
00:50:06De hecho,
00:50:06estoy genuinamente en furia verde de celos por ese instrumento de escritura que sea.
00:50:10Tengo que averiguar cómo configurar lo que tienes.
00:50:13Esa cosa es fantástica..
00:50:15Gracias a todos por ver.
00:50:16Yo,
00:50:16eh,
00:50:17para aquellos que lo vieron en vivo,
00:50:18espero que hayan disfrutado la charla previa y probablemente un poco de la charla posterior.
00:50:23Si desean escuchar la versión extendida y todas las interacciones divertidas,
00:50:26que no son parte de la historia principal,
00:50:28vayan a Spotify para el podcast completo,
00:50:30que es solo nosotros hablando sobre,
00:50:32no sé qué basura está comiendo y bocadillos y tal,
00:50:34el nombre más charla,
00:50:35más charla de nuevo,
00:50:36y también Casey,
00:50:37TJ y Trash..
00:50:42Errores en mi pantalla, café terminal y viviendo el sueño.

Key Takeaway

Casey Muratori analiza la caída de AWS DynamoDB para demostrar que la verdadera causa raíz fue un error de lógica en el manejo de excepciones y rollbacks, más allá de la condición de carrera citada oficialmente.

Highlights

Casey Muratori cuestiona la validez de los Análisis de Causa Raíz (RCA) oficiales cuando no explican el error de programación subyacente.

Se detalla el sistema de balanceo de carga de DynamoDB basado en registros DNS y 'árboles' de pesos para gestionar el tráfico regional.

La arquitectura de actualización utiliza un 'planificador' único y tres 'promulgadores' (enactors) que sincronizan cambios mediante bloqueos en Route 53.

El fallo masivo se originó cuando un enactor procesó un plan obsoleto que fue eliminado por otro proceso, dejando un endpoint apuntando a un registro inexistente.

La interrupción se volvió permanente porque los tres enactors fallaron críticamente al intentar realizar un 'rollback' hacia un registro DNS que ya no era resoluble.

Casey argumenta que la verdadera causa raíz no fue una condición de carrera, sino una mala práctica de programación que no manejaba excepciones al buscar registros.

Se resalta la importancia de la transparencia técnica para generar confianza en los clientes y educar a la comunidad de desarrolladores.

Timeline

Introducción y la Filosofía de 'Entender Realmente'

El episodio comienza con Casey Muratori introduciendo el tema central: la diferencia entre pretender entender algo y comprenderlo profundamente. Casey reflexiona sobre la presión que sienten los programadores junior para aparentar conocimiento y cómo, con la experiencia, ha aprendido a pedir explicaciones exhaustivas sin temor a parecer tonto. Explica que en el desarrollo de software, no llegar al fondo de un bug puede permitir que la verdadera causa permanezca oculta y cause problemas futuros. Esta mentalidad es el motor de su análisis crítico sobre los informes técnicos de grandes empresas tecnológicas. Destaca que la honestidad intelectual es fundamental para la resolución efectiva de problemas en sistemas complejos.

Comparación de RCA: Google, CrowdStrike y AWS

Casey compara los análisis de causa raíz (RCA) de fallos recientes de alto perfil, mencionando que los de Google y CrowdStrike fueron satisfactorios porque explicaron el error técnico específico. En el caso de Google, fue un puntero nulo por un JSON vacío, y en CrowdStrike, un desbordamiento de array por exceso de reglas. Sin embargo, critica el RCA de DynamoDB de AWS por ser vago y no proporcionar una explicación real del error de código tras leer el resumen y ver la presentación de re:Invent. El grupo discute la dinámica del podcast, la calidad del audio en Spotify y presentan a Adam, un ex-héroe de AWS. Esta sección establece el escepticismo de Casey hacia la versión oficial de Amazon sobre su interrupción de servicio.

Arquitectura de Balanceo de Carga en DynamoDB

Se explica técnicamente cómo DynamoDB utiliza endpoints de API regionalizados y un sistema de registros DNS para distribuir el tráfico. Casey utiliza una pizarra para ilustrar cómo Route 53 gestiona un 'árbol' de balanceo de carga, posiblemente basado en pesos para dirigir las solicitudes a diferentes máquinas. Aunque AWS no detalló la estructura exacta del árbol, se asume que permite una distribución dinámica según la carga y disponibilidad del hardware. Adam, basándose en su experiencia, confirma que Route 53 permite segmentar el tráfico de esta manera ponderada. Comprender esta infraestructura es vital para identificar dónde ocurrió la desconexión que provocó la caída del servicio.

El Proceso de Actualización: Planificadores y Enactors

El sistema de AWS utiliza un proceso de actualización constante donde un 'planificador' genera nuevos esquemas de balanceo de carga (planes) continuamente. Existen tres 'promulgadores' (enactors) encargados de aplicar estos planes en Route 53, supuestamente para ofrecer redundancia y tolerancia a fallos. Casey cuestiona por qué se utiliza un mecanismo de bloqueo (locking) a través de Route 53 para serializar las operaciones, argumentando que esto complica el sistema innecesariamente. Los enactors intentan adquirir un bloqueo atómico antes de actualizar un endpoint para evitar conflictos entre ellos. Esta estructura de 'serialización temporal' para facilitar el razonamiento técnico terminó siendo, irónicamente, el escenario donde se manifestó el fallo.

La Condición de Carrera y el Error de 'Use-After-Free'

Casey describe el escenario patológico donde un enactor quedó estancado intentando aplicar un plan antiguo (plan 110) mientras otros avanzaban hasta planes mucho más recientes. Debido a la mala suerte con los bloqueos, el enactor finalmente aplicó el plan 110 justo después de que otro proceso de limpieza lo eliminara de Route 53 por antigüedad. Esto resultó en que el endpoint principal apuntara a un hash DNS que ya no existía, provocando que las consultas devolvieran 'no se encontraron registros'. Casey identifica esto como un comportamiento similar a un bug de 'use-after-free' en memoria, pero aplicado a registros de red. Los usuarios de DynamoDB empezaron a recibir errores de resolución de nombres, deteniendo todo el tráfico hacia la base de datos.

El Fallo Crítico en el Mecanismo de Rollback

La sección más crítica explica por qué la caída fue permanente y no una interrupción momentánea de pocos minutos. El sistema de AWS tiene un paso obligatorio de configurar un registro de 'rollback' que apunta al plan anterior cada vez que se aplica uno nuevo. Cuando los enactors intentaron corregir la situación apuntando a un plan nuevo, fallaron catastróficamente porque el 'plan anterior' (el 110 eliminado) no era resoluble. Casey teoriza que el código probablemente lanzó una excepción no controlada al no encontrar el registro DNS, lo que detuvo permanentemente a los tres enactors. Sin enactors funcionando, el sistema quedó en un estado de fallo total que requirió intervención humana manual para reiniciarse.

Conclusión: Mala Práctica de Programación y Confianza

En el cierre, Casey sostiene que la causa raíz no fue la condición de carrera, sino una arquitectura de código frágil que no gestionaba correctamente los valores nulos o registros inexistentes. Argumenta que un sistema robusto debería haber manejado la ausencia de un plan de rollback como un valor vacío en lugar de un fallo crítico del proceso. Critica que AWS oculte estos detalles, ya que ver el código real o un ejemplo reproducible educaría a otros ingenieros para evitar errores similares. La falta de transparencia en el RCA reduce la confianza de los clientes, sugiriendo que AWS podría no haber entendido totalmente su propio error. Finalmente, el grupo bromea sobre el uso de Java y Rust antes de cerrar el episodio invitando a la audiencia a Spotify.

Community Posts

View all posts