es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transacción del almacén de datos – alcanzando el límite de escritura de entidades.

El problema

Usando el paquete cloud.google.com/go/datastore de golang para crear una transacción, realizar una serie de getMulti y putMulti, al confirmar esta transacción me encuentro con un error de límite de escritura de entidad.


2021/12/22 09:07:18 err: error de RPC: código = InvalidArgument desc = no se pueden escribir más de 500 entidades en una sola llamada

La pregunta

¿Mi pregunta es cómo se crea una transacción con más de 500 escrituras?

Aunque deseo que mi operación sea atómica, no logro resolver este error de límite de escritura para una transacción y el conjunto de consultas se ejecutan sin problemas cuando las pruebo en un emulador, escribiendo en lotes de 500.

Lo que he intentado

por favor excusen el pseudo código, pero intento entender lo que he hecho
Todo en uno


transaction, err := datastoreClient.NewTransaction(ctx)
transaction.PutMulti(allKeys, allEntities)
transaction.commit()
// err demasiadas entidades escritas en una sola llamada

En lotes en un intento de evitar el límite de escritura

transaction, err := datastoreClient.NewTransaction(ctx)
transaction.PutMulti(first500Keys, first500Entities)
transaction.PutMulti(second500Keys, second500Entities)
transaction.commit()
// err demasiadas entidades escritas en una sola llamada

Un simple putmulti regular también falla

datastoreClient.PutMulti(ctx,allKeys, allEntities)
// err demasiadas entidades escritas en una sola llamada

Lo que funciona

Escribir no atómico en el datastore

datastoreClient.PutMulti(ctx,first500Keys, first500Entities)
datastoreClient.PutMulti(ctx,second500Keys, second500Entities)

Aquí está el código real que utilicé para escribir, ya sea como transacción en lotes o como putMulti regular
“`
for i := 0; i < (len(allKeys) / 500); i++ {
var max int = (i + 1) * 500
if len(allKeys) < max {
max = len(allKeys) % 500
}</p>

<pre><code> _, err = svc.dsClient.PutMulti(ctx, allKeys[i*500:max], allEntities[i*500:max])
if err != nil {
return
}
}
</code></pre>

“`

Donde estoy perdido

Entonces, en un esfuerzo por mantener mi trabajo atómico, ¿hay algún método para confirmar una transacción que tenga más de 500 entidades escritas en ella?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no existe una manera de realizar una transacción con más de 500 escrituras en el paquete cloud.google.com/go/datastore . Esta es una limitación establecida por Google Cloud Datastore y no se puede anular.

    Ya has probado las soluciones alternativas más comunes, como dividir las escrituras en lotes, pero parece que incluso ese enfoque no funciona para ti. Podrías considerar usar un sistema de base de datos diferente que no tenga esta limitación si la atomicidad es crucial para tu caso de uso.

    Si es imprescindible usar Datastore, podrías dividir tu transacción en varias transacciones más pequeñas, cada una manejando un subconjunto más reducido de entidades. De esta manera se preservaría la atomicidad de tu operación general evitando el límite de escritura. Sin embargo, este enfoque podría añadir complejidad adicional y disminuir el rendimiento de tu código.

    Otra opción sería intentar reducir el número de entidades que necesitas escribir en Datastore. Podrías optimizar tus consultas, buscar formas de reutilizar entidades o incluso considerar la desnormalización de tus datos. Este enfoque requeriría una planificación e implementación cuidadosas, pero podría proporcionar una solución que no dependa de superar el límite de escritura.

Comments are closed.