Sesiones

Descripción general sobre las sesiones

En esta página, se describe el concepto avanzado de sesiones en Cloud Spanner, incluidas las prácticas recomendadas para crear una biblioteca cliente, usar las API de REST o RPC o las bibliotecas cliente de Google.

Una sesión representa un canal de comunicación con el servicio de base de datos de Cloud Spanner. Una sesión se usa para realizar transacciones que leen, escriben o modifican datos en una base de datos de Cloud Spanner. Cada sesión se aplica a una única base de datos.

Las sesiones solo pueden ejecutar una transacción a la vez. Las operaciones de lectura, escritura y consultas independientes usan una transacción a nivel interna y se tienen en cuenta para el límite de una transacción.

Beneficios de rendimiento de una caché de sesión

Crear una sesión es costoso. Para evitar el costo de rendimiento cada vez que se realiza una operación de base de datos, los clientes deben mantener una caché de sesión, que es un conjunto de sesiones disponibles listas para usarse. La caché debe almacenar las sesiones existentes y mostrar el tipo de sesión correspondiente cuando se lo solicite, así como controlar la limpieza de las sesiones que no se usan. Para ver un ejemplo de cómo implementar una caché de sesión, consulta el código fuente de una de las bibliotecas cliente de Cloud Spanner, como la biblioteca cliente de Go o la biblioteca cliente de Java.

Se espera que las sesiones duren mucho tiempo, por lo que, después de usar una sesión para una operación de base de datos, el cliente debe devolver la sesión a la caché a fin de que se vuelva a usar.

Prácticas recomendadas para crear una biblioteca cliente o usar REST/RPC

A continuación, se describen las prácticas recomendadas para implementar sesiones en una biblioteca cliente de Cloud Spanner o con el fin de usar sesiones con las API de REST o RPC.

Crea y ajusta el tamaño de la caché de la sesión

A fin de determinar el tamaño óptimo de la caché de la sesión para un proceso de cliente, establece el límite inferior destinado a la cantidad de transacciones simultáneas esperadas y establece el límite superior destinado a la prueba inicial, como 100. Si el límite superior no es adecuado, auméntalo. Aumentar la cantidad de sesiones activas implica el uso de recursos adicionales en el servicio de la base de datos de Cloud Spanner, por lo que si no se limpian las sesiones que no se usan, puede disminuir el rendimiento. Para los usuarios que trabajan con la API de RPC, recomendamos no tener más de 100 sesiones por canal de gRPC.

Administra sesiones borradas

Hay tres formas de borrar una sesión:

  • Un cliente puede borrar una sesión.
  • El servicio de base de datos de Cloud Spanner puede borrar una sesión cuando esta está inactiva durante más de 1 hora.
  • El servicio de base de datos de Cloud Spanner puede borrar una sesión si la sesión tiene más de 28 días.

Los intentos de usar una sesión borrada darán como resultado NOT_FOUND. Si se genera, crea y usa una sesión nueva, agrega la nueva sesión a la caché y quita la sesión borrada de esta.

Mantén en funcionamiento una sesión inactiva

El servicio de base de datos de Cloud Spanner se reserva el derecho a descartar una sesión que no se usa. Si necesitas sí o sí mantener en funcionamiento una sesión inactiva, por ejemplo, si se espera un aumento significativo en el uso de la base de datos a corto plazo, entonces puedes evitar que se descarte la sesión. Realiza una operación poco costosa, como la ejecución de la consulta de SQL SELECT 1 para mantener en funcionamiento la sesión. Si tienes una sesión inactiva que no es necesaria para un uso a corto plazo, permite que Cloud Spanner la descarte y cree una nueva la próxima vez que necesites una.

Un caso para mantener en funcionamiento las sesiones es controlar la demanda máxima normal en la base de datos. Si el uso intensivo de bases de datos ocurre todos los días de 9:00 a.m. a 6:00 p.m., debes mantener algunas sesiones inactivas en funcionamiento durante ese tiempo, ya que es probable que sean necesarias durante el uso máximo. Después de las 6:00 p.m., puedes permitir que Cloud Spanner descarte las sesiones inactivas. Antes de las 9:00 a.m. todos los días, crea algunas sesiones nuevas a fin de que estén listas para la demanda esperada.

Otro caso es si tienes una aplicación que usa Cloud Spanner, pero debe evitar la sobrecarga de conexión cuando lo hace. Puedes mantener un conjunto de sesiones en funcionamiento para evitar la sobrecarga de conexión.

Oculta detalles de sesión del usuario de la biblioteca cliente

Si estás creando una biblioteca cliente, no expongas las sesiones al consumidor de la biblioteca cliente. Proporciona al cliente la posibilidad de realizar llamadas a la base de datos sin la complejidad de crear y mantener sesiones. Para ver un ejemplo de una biblioteca cliente que oculta los detalles de la sesión del consumidor de la biblioteca cliente, consulta la biblioteca cliente de Cloud Spanner para Java.

Soluciona errores para escribir transacciones que no son idempotentes

Las transacciones de escritura sin protección de reproducción pueden aplicar mutaciones más de una vez. Si una mutación no es idempotente, una mutación que se aplica más de una vez podría provocar un error. Por ejemplo, una inserción puede fallar con ALREADY_EXISTS, incluso si la fila no existía antes del intento de escritura. Esto podría ocurrir si el servidor de backend confirmó la mutación, pero no pudo comunicar el resultado exitoso al cliente. En ese caso, se podría intentar otra vez la mutación, lo que provocaría el error ALREADY_EXISTS.

A continuación, se indican algunas formas posibles de solucionar esta situación cuando implementas tu propia biblioteca cliente o usas la API de REST:

  • Estructura las escrituras para que sean idempotentes.
  • Usa escrituras con protección de reproducción.
  • Implementa un método que ejecute la lógica “upsert”: inserta una nueva o actualiza la existente.
  • Soluciona el error en nombre del cliente.

Mantén conexiones estables

A fin de obtener el mejor rendimiento, la conexión que usas para alojar una sesión debe permanecer estable. Cuando la conexión que aloja una sesión cambia, Cloud Spanner puede anular la transacción activa en la sesión y causar una pequeña carga adicional en tu base de datos mientras actualiza los metadatos de la sesión. No hay problema si algunas conexiones cambian de forma esporádica, pero debes evitar situaciones que podrían cambiar una gran cantidad de conexiones al mismo tiempo. Si usas un proxy entre el cliente y Cloud Spanner, debes mantener la estabilidad de conexión para cada sesión.

Supervisa las sesiones activas

Puedes usar el comando ListSessions para supervisar sesiones activas en tu base de datos desde la línea de comandos, con la API de REST o la API de RPC. Con ListSessions, se muestran las sesiones activas de una base de datos determinada. Esto es útil si necesitas buscar la causa de una pérdida de sesión. Una pérdida de sesión es un incidente en el que se crean sesiones, pero no se devuelven a una caché de sesión para volver a usarse.

ListSessions te permite ver los metadatos de tus sesiones activas, incluso cuándo se creó una sesión y cuándo se usó por última vez. Si analizas estos datos, te guiarán en la dirección correcta para solucionar problemas de sesiones. Si la mayoría de las sesiones activas no tienen un approximate_last_use_time reciente, esto podría indicar que tu aplicación no está volviendo a usar las sesiones de forma correcta. Consulta la sección sobre la referencia de la API de RPC para obtener más información sobre el campo approximate_last_use_time.

Consulta la referencia de la API de REST, la referencia de la API de RPC o la referencia de la herramienta de línea de comandos de gcloud para obtener más información sobre el uso de ListSessions.

Prácticas recomendadas para usar bibliotecas cliente de Google

A continuación, se describen las prácticas recomendadas con el fin de usar las bibliotecas cliente de Google para Cloud Spanner.

Configura la cantidad de sesiones

En general, no recomendamos modificar la cantidad predeterminada de sesiones usadas por las bibliotecas cliente.

Si tienes una carga de trabajo especial, recomendamos establecer el límite inferior destinado a la cantidad de transacciones simultáneas esperadas y establecer el límite superior destinado a la prueba inicial, como 100. Si el límite superior no es adecuado, auméntalo. Aumentar la cantidad de sesiones activas implica el uso de recursos adicionales en el servicio de la base de datos de Cloud Spanner, por lo que si no se limpian las sesiones que no se usaron, puede que disminuya el rendimiento. También recomendamos tener más de 100 sesiones por canal de gRPC.

Administra la fracción de sesiones de escritura

Para la mayoría de las bibliotecas cliente, Cloud Spanner reserva una parte de las sesiones destinada a las transacciones de lectura y escritura llamada fracción de sesiones de escritura. Si tu app usa todas las sesiones de lectura, Cloud Spanner usa las sesiones de lectura y escritura, incluso para las transacciones de solo lectura. Las sesiones de lectura y escritura requieren una spanner.databases.beginOrRollbackReadWriteTransaction. Si el usuario tiene la función de IAM spanner.databaseReade , la llamada fallará y Cloud Spanner mostrará el siguiente mensaje de error:

generic::permission_denied: Resource %resource% is missing IAM permission:
spanner.databases.beginOrRollbackReadWriteTransaction

Para las bibliotecas cliente que mantienen una fracción de las sesiones de escritura, puedes establecer la fracción de las sesiones de escritura.

C++

Todas las sesiones de C++ son iguales. No hay sesiones de solo lectura o lectura y escritura.

C#

Aunque la biblioteca cliente para C# realiza un seguimiento a fin de saber si una sesión se usó por última vez en una transacción de lectura o de lectura y escritura, el conjunto de sesiones de lectura y de lectura y escritura no es fijo. Una fracción de las sesiones de escritura no se aplica al grupo de sesiones y, por lo tanto, no hay ninguna API para cambiarla.

Go

La fracción de sesiones de escritura predeterminada para Go es 0.2. Puedes cambiar la fracción con el campo WriteSessions de SessionPoolConfig.

Java

La fracción de sesiones de escritura predeterminada para Java es 0.2. Puedes cambiar la fracción con el método setWriteSessionsFraction. En el siguiente ejemplo de código, se muestra cómo establecer la fracción:

SpannerOptions.Builder builder = SpannerOptions.newBuilder();
builder.setWriteSessionsFraction(0);
SpannerOptions options = builder.build();
spanner = options.getService();

Cuando se usa Java, Cloud Spanner muestra el error cuando llamas a la singleUseReadOnlyTransaction() y no hay sesiones de lectura disponibles.

Node.js

La fracción de sesiones de escritura predeterminada para Node.js es 0 (cero). Puedes cambiar la fracción con el campo escrituras.

PHP

Todas las sesiones de PHP son iguales. No hay sesiones de solo lectura o lectura y escritura.

Python

Python admite cuatro tipos de conjuntos de sesiones diferentes que puedes usar para administrar las sesiones de lectura y de lectura y escritura.

Ruby

La fracción de sesiones de escritura predeterminada para Ruby es 0.3. Puedes cambiar la fracción con el método de inicialización client.