Перейти к содержимому

Escribí DynamoDB en Go y descubrí que no habla el mismo idioma que S3

Golandia

0:00 / 0:00

Escribí DynamoDB en Go y descubrí que no habla el mismo idioma que S3

201 просмотр · 7 дней назад
Golandia
4,7 тыс. подписчиков
201 просмотр · 7 дней назад
Respuesta rápida: no comparten protocolo, y casi nadie lo sabe porque el SDK lo tapa. S3 dice qué quieres con el método y la ruta (PUT /fotos/gato.txt). DynamoDB manda SIEMPRE un POST a «/» con el cuerpo en JSON y la operación metida en una cabecera: X-Amz-Target: DynamoDB_20120810.PutItem. Dos servicios de la misma nube y dos diseños distintos — porque S3 es de 2006 y DynamoDB de 2012, cuando Amazon ya había elegido otro estilo. Episodio 2 de la serie «Escribe tu propia nube en Go»: añado DynamoDB al mismo binario del episodio 1, en el MISMO puerto. 762 líneas nuevas, 1.201 en total, y la CLI oficial de Amazon habla con él sin enterarse. Lo que verás: · El enrutador que reparte entre los dos servicios: 14 líneas mirando una cabecera. Y por qué el criterio tiene que ser afirmativo («¿esto es DynamoDB?») y no por descarte, que se rompe callado con el tercer servicio. · 🥇 Los números viajan como CADENA: {"N":"42.5"}. No es un descuido — así no pasan por el float de ningún lenguaje. Se enseña un identificador de 20 dígitos volviendo intacto. · El puente en Go: attributevalue.MarshalMap convierte tu struct al formato con tipos y al revés, con una etiqueta por campo. · La clave se elige UNA VEZ: partición y orden. Y eso decide qué consultas van a existir. · 🥇 Sobre la clave de partición SOLO hay igualdad. No existe «los clientes que empiecen por a», y al implementarlo entiendes que no es capricho: es el precio de que buscar por clave cueste lo mismo con mil filas que con mil millones. · Escribir el analizador de KeyConditionExpression, y la trampa bonita: partir el texto por AND no vale, porque BETWEEN lleva su propio AND dentro. · 🥇 EL FALLO QUE ME COSTÓ REESCRIBIR UNA FUNCIÓN: si ordenas por la cadena con la que indexas, el 10 va antes que el 9. No revienta nada: devuelve 200 y la página equivocada. De ahí sale la regla de guardar las fechas en ISO-8601. · La escritura condicional (attribute_not_exists), que es la ÚNICA herramienta de concurrencia que da DynamoDB, llegando como ConditionalCheckFailedException. · Cómo se falla en este protocolo: el campo __type del JSON, y cómo el SDK lo convierte en un tipo de error de Go que puedes preguntar con errors.As. · El registro del servidor con los dos idiomas seguidos: de GET /fotos?list-type=2 a POST / [PutItem]. · ⛔ Y lo que NO hay: índices secundarios, UpdateItem, transacciones, streams, paginación real ni FilterExpression. Un doble de pruebas vale por lo que no hace — y lo que no implementa lo dice a gritos, no en verde. Preguntas relacionadas: · ¿Por qué DynamoDB manda todo por POST a «/»? Porque usa el estilo JSON con la operación en la cabecera X-Amz-Target, que Amazon estandarizó después de S3. · ¿Por qué los números de DynamoDB van entre comillas? Para no pasar por el punto flotante del lenguaje que los lea. Un identificador de 20 dígitos vuelve intacto. · ¿Se puede buscar por prefijo en la clave de partición? No. Solo igualdad exacta. El prefijo (begins_with) sí funciona, pero sobre la clave de ORDEN. · ¿Cuál es la diferencia entre Query y Scan? Query busca por la clave y cuesta lo mismo siempre; Scan lee la tabla entera y crece con tus datos. Entorno citable: golang:1.26 (en Docker), aws-cli 2.36.5, aws-sdk-go-v2/service/dynamodb. Las pruebas corren en contenedor porque el Application Control de esta máquina bloquea a ratos el binario de test, y de regalo ahí sí hay detector de carreras. 21 pruebas en verde, todas por el SDK oficial. Capítulos: 00:00 Dos servicios de la misma nube, dos protocolos 01:26 Un puerto, dos servicios: 14 líneas 02:01 El elemento: los números viajan como cadena 02:56 La clave se elige una vez y no se cambia 03:48 Query solo sabe de la clave 04:36 Escribir el analizador de la expresión 05:20 El fallo que me costó reescribir: el orden 06:22 Escritura condicional y Scan 07:09 Fallar bien en este protocolo 07:54 La CLI oficial, y los dos idiomas en un registro 08:28 Las pruebas en Docker y el detector de carreras 09:03 Lo que esto no es 09:43 Lo que viene: SQS, SigV4 y Lambda #Go #Golang #AWS #DynamoDB #NoSQL