Recomendaciones para Cloud Firestore

Usa estas recomendaciones como una referencia rápida cuando compiles una aplicación que use Cloud Firestore.

ID de documento

  • No uses . y .. en los ID de documento.
  • No uses barras diagonales (/) en los ID de documento.
  • No uses ID de documento que aumenten monótonamente, como los siguientes ejemplos:

    • Customer1, Customer2, Customer3
    • Product 1, Product 2, Product 3

    Estos ID secuenciales pueden generar hotspots que afectan la latencia.

Nombres de campos

  • No uses los siguientes caracteres en los nombres de campos, ya que requieren escapes adicionales:

    • . (punto)
    • [ (corchete izquierdo)
    • ] (corchete derecho)
    • * (asterisco)
    • ` (acento grave)

Índices

  • No uses demasiados índices. Una cantidad excesiva de índices puede aumentar la latencia de escritura y los costos de almacenamiento de las entradas de índice.

  • Ten en cuenta que indexar campos con valores que incrementan monótonamente, como las marcas de tiempo, puede generar hotspots que afectan la latencia de las aplicaciones con tasas altas de lectura y escritura.

Exenciones de índices

En la mayoría de las apps, puedes usar la indexación automática y los vínculos de mensajes de error para administrar tus índices. Sin embargo, es posible que quieras agregar exenciones de campo único en los siguientes casos:

Caso Descripción
Campos de string grandes

Si tienes un campo de string que suele tener valores de string largos que no usas para realizar consultas, exime al campo de la indexación a fin de reducir los costos de almacenamiento.

Tasas altas de escritura en una colección que tiene documentos con valores secuenciales

Si indexas un campo que aumenta o disminuye secuencialmente entre los documentos de una colección, como una marca de tiempo, la tasa máxima de escritura en la colección es de 500 operaciones de escritura por segundo. Si no realizas consultas basadas en campos con valores secuenciales, puedes eximir al campo de la indexación para pasar ese límite.

Por ejemplo, en un caso práctico de IoT con una tasa alta de escritura, es posible que una colección de documentos con un campo de marca de tiempo se acerque al límite de 500 operaciones de escritura por segundo.

Campos grandes de arreglo o de mapa

Los campos grandes de arreglo o de mapa pueden acercarse al límite de 20,000 entradas de índice por documento. Si no realizas consultas basadas en un campo grande de arreglo o de mapa, debes excluir el campo de la indexación.

Operaciones de escritura y lectura

  • No escribas en un documento más de una vez por segundo. Para obtener más información, consulta Actualizaciones en un solo documento.

  • Usa operaciones por lotes en lugar de operaciones individuales para las escrituras y eliminaciones. Estas son más eficientes, ya que realizan varias operaciones con la misma sobrecarga que una operación individual.

  • Usa llamadas asíncronas en vez de síncronas cuando sea posible. Las llamadas asíncronas minimizan el impacto en la latencia. Por ejemplo, considera una aplicación que necesite el resultado de una consulta y de la búsqueda de un documento antes de procesar una respuesta. Si la búsqueda y la consulta no tienen una dependencia de datos, no es necesario esperar de manera síncrona hasta que finalice el primer proceso para iniciar el segundo.

  • No uses desplazamientos; usa cursores. Usar un desplazamiento solo evita que se muestren los documentos omitidos a tu aplicación, pero aún se recuperan internamente. Los documentos omitidos afectan la latencia de la consulta, y tu aplicación se factura por las operaciones de lectura necesarias para recuperarlos.

Diseña para la escala

En las siguientes recomendaciones, se describe cómo evitar situaciones que generen problemas de contención.

Actualizaciones en un solo documento

No debes actualizar un solo documento más de una vez por segundo. De lo contrario, tu app experimentará problemas de contención, como aumentos de latencia y tiempos de espera, entre otros errores.

Tasas altas de lectura, escritura y eliminación en un rango pequeño de documentos

Evita las tasas altas de lectura o escritura en documentos que se encuentren cerca lexicográficamente. De lo contrario, tu aplicación experimentará errores de contención. Este problema se conoce como generación de hotspots, y tu aplicación puede sufrirlos si realiza alguna de las siguientes acciones:

  • Crea documentos nuevos a una tasa muy alta y asigna sus propios ID que incrementan monótonamente.

    Cloud Firestore asigna los ID de documento con un algoritmo de dispersión. Si creas documentos nuevos con ID automáticos, no deberías encontrar hotspots durante las operaciones de escritura.

  • Crea documentos nuevos a una tasa alta en una colección que tiene pocos documentos.

  • Crea documentos nuevos con un campo que incrementa monótonamente, como una marca de tiempo, a una tasa muy alta.

  • Borra documentos de una colección a una tasa alta.

  • Escribe en la base de datos a una tasa muy alta sin aumentar el tráfico de forma gradual.

Acelera el tráfico

Debes acelerar el tráfico de manera gradual en las colecciones nuevas o en los documentos que se encuentren cerca lexicográficamente. Esto permite que Cloud Firestore tenga tiempo suficiente para preparar los documentos según el aumento de tráfico. Te recomendamos que empieces con un máximo de 500 operaciones por segundo en una colección nueva. Luego, puedes incrementar el tráfico un 50% cada 5 minutos. Por ejemplo, puedes usar este programa de aceleración para incrementar tu tráfico de lectura a 740,000 operaciones por segundo después de 90 minutos. Asimismo, puedes acelerar el tráfico de escritura, pero ten en cuenta los límites estándar de Cloud Firestore. Asegúrate de que las operaciones se encuentren distribuidas de manera uniforme en todo el rango de claves. Esto se conoce como la regla “500/50/5”.

Migra el tráfico a una colección nueva

Una aceleración gradual es muy importante si migras el tráfico de la app de una colección a otra. Una forma sencilla de controlar esta migración es leer la colección antigua, y, si el documento no existe, leer la colección nueva. Sin embargo, esto podría causar un aumento repentino del tráfico de los documentos que se encuentran cerca lexicográficamente en la colección nueva. Es posible que Cloud Firestore no pueda preparar de manera eficiente la colección nueva para el aumento del tráfico, en especial si contiene pocos documentos.

Es posible que ocurra un problema similar si cambias los ID de muchos documentos que están en la misma colección.

La mejor estrategia para migrar el tráfico a una colección nueva depende de tu modelo de datos. A continuación, se muestra un ejemplo de estrategia que se conoce como lecturas paralelas. Deberás determinar si esta estrategia es eficaz para tus datos y tener en cuenta el impacto del costo de las operaciones paralelas durante la migración.

Lecturas paralelas

Para implementar lecturas paralelas mientras migras el tráfico a una colección nueva, lee primero el documento de la colección antigua. Si no existe, léelo de la colección nueva. Una tasa alta de lecturas de documentos que no existen puede causar una generación de hotspots, por lo que debes asegurarte de aumentar la carga gradualmente en la colección nueva. Una estrategia mejor es copiar el documento antiguo a la colección nueva y, luego, borrarlo. Acelera las lecturas paralelas de manera gradual para asegurarte de que Cloud Firestore pueda controlar el tráfico hacia la colección nueva.

Una estrategia útil para acelerar gradualmente las lecturas o escrituras hacia una colección nueva es usar un hash determinista del ID de usuario a fin de seleccionar un porcentaje aleatorio de usuarios que tratan de escribir documentos nuevos. Asegúrate de que el resultado del hash del ID de usuario no se encuentre sesgado por tu función o el comportamiento del usuario.

Mientras tanto, ejecuta un trabajo por lotes que copie todos tus datos de los documentos antiguos a la colección nueva. Este trabajo debe evitar las operaciones de escritura en los ID de documento secuenciales para prevenir la generación de hotspots. Cuando se complete el trabajo por lotes, solo podrás leer la colección nueva.

Una versión mejorada de esta estrategia consiste en migrar lotes pequeños de usuarios a la vez. Primero, agrega un campo al documento del usuario que realice un seguimiento del estado de la migración de ese usuario. Luego, selecciona un lote de usuarios que desees migrar según un hash del ID de usuario. Por último, usa un trabajo por lotes a fin de migrar los documentos de ese lote de usuarios y lecturas paralelas para los usuarios que estén en el proceso de migración.

Nota: Ten en cuenta que no es fácil revertir el proceso, a menos que realices operaciones de escritura dobles de las entidades antiguas y nuevas durante la fase de migración. Esto incrementará los costos incurridos por Cloud Firestore.

Evita el acceso no autorizado

Evita las operaciones no autorizadas en tu base de datos con las reglas de seguridad de Cloud Firestore. Por ejemplo, usar reglas permite evitar una situación en la que un usuario malicioso descargue reiteradamente toda tu base de datos.

Obtén más información sobre cómo usar las reglas de seguridad de Cloud Firestore.

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.