Announcing D1: Our first SQL database

En 2017, anunciamos Cloudflare Workers, que permite a los desarrolladores acceder a los procesos en nuestra red. Nos entusiasmaban las posibilidades que abría, pero enseguida nos dimos cuenta de que la mayoría de las aplicaciones del mundo real son con estado. Desde entonces, hemos ofrecido KV, Durable Objects y R2, que brindan a los desarrolladores acceso a varios tipos de almacenamiento.

Hoy nos complace anunciar D1, nuestra primera base de datos SQL.

Si bien la espera para conseguir acceso a la versión beta no debería ser larga, empezaremos a habilitarla a partir de junio (regístrate aquí), estamos encantados de compartir algunos de los detalles de lo que está por venir.

Descubre D1, la base de datos diseñada para Cloudflare Workers

D1 se ha desarrollado en SQLite, que no solo es la base de datos más universal utilizada por miles de millones de dispositivos al día, sino que también es la primera base de datos sin servidor. ¿Te sorprende? SQLite era una herramienta tan avanzada para su tiempo que se apodó "sin servidor" antes de que el término adquiriera connotación con los servicios gestionados en la nube, y en un principio significaba literalmente "sin integración de un servidor".

Dado que el propio Workers se ejecuta entre el servidor y el cliente, y se inspira en la tecnología desarrollada para el cliente, SQLite parecía la opción perfecta para nuestra primera incursión en el ámbito de las bases de datos.

Entonces, ¿qué puedes desarrollar con D1? La respuesta es "¡casi todo!", lo que apenas deja margen para que dispares tu imaginación, así que ¿quieres ver una demostración?

Demostración D1: Northwind Traders

Puedes ver una demostración de D1 aquí: northwind.d1sql.com.

Si te preguntas "¿Quiénes son Northwind Traders?", responderemos el "¡Hola, mundo!" de las bases de datos, por así decirlo. Una base de datos de ejemplo que Microsoft proporcionaba junto a Microsoft Access para utilizarla como su propio tutorial. Apareció por primera vez hace 25 años, en 1997, y encontrarás muchos ejemplos de su uso en Internet.

Se trata de una aplicación empresarial típica, con un esquema realista y muchas claves externas, a través de un gran número de tablas diferentes — una representación atemporal de los datos.

¿Cuándo se envió el último pedido de queso Cabrales y en qué barco estaba? Puedes averiguarlo al instante. ¿Alguien ha llamado para pedir Chai? Menos mal que Exotic Liquids aún tiene 39 unidades en stock, por solo 18 USD cada una.

Te invitamos a jugar, explorar y responder a cualquier pregunta que tengas sobre el negocio de Northwind Trading Co.

La demostración de Northwind Traders también cuenta con un panel de control en el que puedes encontrar detalles y métricas sobre las consultas SQL en D1 que se realizan en segundo plano.

¿Qué puedes desarrollar con D1?

Volviendo a nuestra pregunta inicial antes de la demostración, ¿qué puedes desarrollar con D1?

Aunque no estés ejecutando Northwind Traders Co, es probable que estés ejecutando un software muy similar en algún lugar. Incluso en el núcleo del servicio de Cloudflare hay una base de datos. Una base de datos SQL incluye tablas, vistas materializadas y un sinfín de procedimientos almacenados. Cada vez que un cliente interactúa con nuestro panel de control, acaba cambiando de estado en esa base de datos.

La realidad es que las bases de datos están en todas partes. Están dentro del navegador web en el que estás leyendo esto, dentro de todas las aplicaciones de tu teléfono, y en el almacenamiento de tus transacciones bancarias, reservas de viajes, aplicaciones corporativas, etc. Nuestro objetivo con D1 es ayudarte a crear desde la API hasta aplicaciones enriquecidas y eficaces, incluidos sitios de comercio electrónico, software de contabilidad, soluciones SaaS y CRM.

Incluso puedes combinar D1 con Cloudflare Access y crear cuadros de mando internos y herramientas de administración que están protegidas de forma segura para que solo las personas de tu organización puedan tener acceso a ellas. Realmente tienes el mundo a tus pies.

La experiencia del desarrollador con D1

Hablaremos de las capacidades y de las futuras funciones más adelante, pero en el fondo, el punto fuerte de D1 es la experiencia del desarrollador, que te permite pasar de la nada a una aplicación completa al instante. Piensa en una herramienta que hayas utilizado y que haya hecho que el desarrollo parezca pura magia, eso es exactamente lo que queremos que se sienta al desarrollar con Workers y D1.

Para que te hagas una idea, esto es lo que se ve al empezar con D1.

Crea tu primera base de datos D1

Con D1, podrás crear una base de datos con solo unos clics, definir las tablas, insertar o cargar algunos datos, sin necesidad de memorizar ningún comando a menos que lo necesites.

Por supuesto, si la línea de comandos es lo tuyo, a principios de esta semana anunciamos una versión nueva y mejorada de Wrangler 2, la mejor herramienta para gestionar e implementar tus Workers, y pronto también tu herramienta para implementar D1. Wrangler también vendrá con soporte nativo de D1, para que puedas crear y gestionar bases de datos con unos sencillos comandos:

Accede a D1 desde tu Worker

Adjuntar D1 a tu Worker es tan fácil como crear un nuevo enlace. Cada base de datos D1 que adjuntes a tu Worker, se adjuntará con su propio enlace en el parámetro env:

export default {
  async fetch(request, env, ctx) {
    const { pathname } = new URL(request.url)
    if (pathname === '/num-products') {
      const { result } = await env.DB.get(`SELECT count(*) AS num_products FROM Product;`)
      return new Response(`There are ${result.num_products} products in the D1 database!`)
    }
  }
}

O, como ejemplo un poco más complejo, puedes pasar con seguridad parámetros de la URL a la base de datos utilizando un enrutador y consultas parametrizadas:

import { Router } from 'itty-router';
const router = Router();

router.get('/product/:id', async ({ params }, env) => {
  const { result } = await env.DB.get(
    `SELECT * FROM Product WHERE ID = $id;`,
    { $id: params.id }
  )
  return new Response(JSON.stringify(result), {
    headers: {
      'content-type': 'application/json'
    }
  })
})

export default {
  fetch: router.handle,
}

¿Qué puedes esperar de D1?

Ante todo, queremos que puedas desarrollar con D1, sin tener que preocuparte por el coste.

En Cloudflare, no creemos en la retención de los datos, por lo que D1, al igual que R2, no tendrá tarifas de salida. Nuestro plan es fijar el precio de D1 de forma similar a como fijamos el precio de nuestros productos de almacenamiento, facturando el almacenamiento base más las escrituras, las lecturas y las listas de acciones realizadas.

Pero, de nuevo, no queremos que nuestros clientes se preocupen por el coste o por lo que ocurre si su negocio crece y necesitan más almacenamiento o aumenta su actividad. Queremos que puedas crear aplicaciones tan sencillas o complejas como puedas soñar. Nos aseguraremos de que D1 cueste menos y su rendimiento sea mejor que el de otras soluciones centralizadas comparables. La promesa de procesos sin servidor y de una red global como la de Cloudflare es el rendimiento y la reducción del coste gracias a nuestra arquitectura.

Aquí tienes un pequeño avance de las funciones de D1.

Replicación de lectura

Con D1, queremos facilitar el almacenamiento de todo el estado de tu aplicación en un solo lugar, para que puedas realizar consultas arbitrarias en todo el conjunto de datos. Este enfoque es lo que hace que las bases de datos relacionales sean tan potentes.

Sin embargo, no creemos que potente deba ser sinónimo de complicado. La mayoría de las bases de datos relacionales son enormes y monolíticas, y configurar la replicación no es baladí, por lo que, en general, la mayoría de los sistemas se diseñan de forma que todas las lecturas y las escrituras fluyan hacia una única instancia. D1 adopta un enfoque diferente.

Con D1, queremos quitarte de encima la configuración y aprovechar la red global de Cloudflare. D1 creará clones de solo lectura de tus datos, cerca de donde estén tus usuarios, y los mantendrá constantemente actualizados con los cambios.

Procesamiento por lotes

Muchas operaciones de una aplicación no generan una sola consulta. Si tu lógica se ejecuta en un Worker cerca de tu usuario, pero cada una de estas consultas se debe ejecutar en la base de datos, enviarlas una a una a través de la red es muy ineficiente.

La API de D1 incluye el procesamiento por lotes. Dondequiera que puedas enviar una única sentencia SQL, también puedes proporcionar una matriz de ellas, lo que significa que solo necesitas un único viaje de ida y vuelta HTTP para realizar varias operaciones. Esto es perfecto para las transacciones que necesitan ejecutar y confirmar de forma atómica.

async function recordPurchase(userId, productId, amount) { 
  const result = await env.DB.exec([
    [
      `UPDATE users SET balance = balance - $amount WHERE user_id = $user_id`,
      { $amount: amount, $user_id: userId },
    ],
    [
      'UPDATE product SET total_sales = total_sales + $amount WHERE product_id = $product_id',
      { $amount: amount, $product_id: productId },
    ],
  ])
  return result
}

Proceso integrado

Pero vamos más allá. Con D1, será posible definir parte de tu código de Worker que se ejecute directamente junto a la base de datos, lo que te ofrecerá un control total y el máximo rendimiento posible. Cada solicitud llega primero a tu Worker cerca de tus usuarios, pero dependiendo de la operación, puede pasar a otro Worker implementado junto a una réplica o a tu instancia D1 primaria para completar su trabajo.

Copias de seguridad y redundancia

Hay pocas cosas tan críticas como los datos almacenados en la base de datos de tu aplicación principal, por lo que D1 guardará automáticamente instantáneas de tu base de datos en R2, el servicio de almacenamiento en la nube de Cloudflare, a intervalos regulares, con un proceso de restauración de un solo clic. Y, como nos basamos en el almacenamiento redundante de Durable Objects tu base de datos se puede trasladar físicamente según sea necesario, lo que permite la autorrecuperación en segundos, incluso de la más catastrófica de las interrupciones.

Importar y exportar datos

Aunque D1 ya es compatible con la API de SQLite, lo que te facilita la escritura de tus consultas, es posible que también necesites datos para ejecutarlas. Si no estás creando una aplicación totalmente nueva, es posible que quieras importar un conjunto de datos existente de otra fuente o base de datos, por lo que trabajaremos para que puedas traer tus propios datos a D1.

Asimismo, una de las ventajas de SQLite es su portabilidad. Si tu aplicación tiene un entorno dedicado a la fase de preparación, por ejemplo, podrás clonar una instantánea de esos datos en tu máquina local para desarrollarla. Y pronto añadiremos más flexibilidad, como la capacidad de crear una nueva base de datos con un conjunto de datos de prueba para cada nueva solicitud de incorporación de cambios de tu proyecto Pages.

¿Y ahora qué?

Esto no sería un anuncio de Cloudflare si no concluyéramos con un "¡esto es solo el principio!", ¡y es cierto! Estamos realmente entusiasmados con todas las posibilidades que abre nuestra base de datos en nuestra red global.

¿Ya estás pensando en lo que vas a desarrollar con D1 y Workers? Nosotros también. Danos tus datos y te daremos acceso tan pronto como podamos. ¡Te mandaremos una invitación para que te registres a la versión beta a partir de junio!