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