Por que o SQLite é tão bom para o edge

May 03 2023
Todo mundo já sabe que o SQLite é ótimo. Este artigo torna o elogio muito mais específico - ele explica por que nós, os desenvolvedores da libSQL, pensamos que o SQLite é uma ótima opção para trazer seus dados para o limite.
Pena na borda - interpretação de craiyon.com

Todo mundo já sabe que o SQLite é ótimo. No entanto, este artigo torna o elogio muito mais específico — ele explica por que nós, os desenvolvedores da libSQL , pensamos que o SQLite é uma ótima opção para trazer seus dados para o limite .

é leve

A indústria de software tem o hábito de oscilar entre super e subestimar produtos com um pequeno consumo de memória. Foi um fator importante nos dias em que a RAM do desktop era contada em kilobytes, mas foi negligenciada quando o hardware se tornou mais barato e mais poderoso. A tendência voltou quando começamos a escrever software para dispositivos móveis com RAM limitada — até que os fabricantes continuaram a empacotá-los com gigabytes de RAM e armazenamento também. Agora, ambientes de funções serverless como Fermyon Spin e Cloudflare Workers, que exigem que seus aplicativos sejam o mais compactos possível. A razão para isso é simples: se você puder empacotar o dobro de instâncias de seu aplicativo em um único servidor, também reduzirá os custos de hardware aproximadamente pela metade. Como o SQLite se encaixa na imagem? É simplesmente muito mais leve do que produtos similares, como o Postgres.

No momento da redação deste artigo, o limite de tamanho binário do Cloudflare Worker para implantações é de 5 MiB após a compactação . Vamos ver como SQLite e Postgres se encaixam no limite:

Claro, o Postgres é muito mais pesado devido a todo o seu código de rede, extensões, utilitários e assim por diante. Mas o fato permanece - você pode espremer ~ 10 instâncias do SQLite em uma máquina no lugar de uma única instalação do Postgres e, em alguns ambientes, isso conta!

É rápido

Velocidade é obviamente um termo relativo, mas o SQLite é realmente uma biblioteca de banco de dados altamente otimizada. É quase impossível compará-lo com sistemas de gerenciamento de banco de dados em rede como MySQL ou Postgres, porque o SQLite é uma biblioteca que opera em um arquivo local - ele ignora todos os custos incorridos pela rede, camadas de serialização e desserialização, autenticação, autorização e muito mais .

Ainda assim, faz sentido avaliar o desempenho de um banco de dados que você deseja usar. O SQLite vem com um utilitário útil chamado speedtest1 , perfeito para obter uma visão geral rápida do desempenho do banco de dados com sua configuração:

$ ./speedtest1 --size 5
 100 - 2500 INSERTs into table with no index.......................    0.006s
 110 - 2500 ordered INSERTS with one index/PK......................    0.009s
 120 - 2500 unordered INSERTS with one index/PK....................    0.010s
 130 - 25 SELECTS, numeric BETWEEN, unindexed......................    0.007s
 140 - 10 SELECTS, LIKE, unindexed.................................    0.008s
 142 - 10 SELECTS w/ORDER BY, unindexed............................    0.007s
 145 - 10 SELECTS w/ORDER BY and LIMIT, unindexed..................    0.004s
 150 - CREATE INDEX five times.....................................    0.005s
 160 - 500 SELECTS, numeric BETWEEN, indexed.......................    0.001s
 161 - 500 SELECTS, numeric BETWEEN, PK............................    0.001s
 170 - 500 SELECTS, text BETWEEN, indexed..........................    0.002s
 180 - 2500 INSERTS with three indexes.............................    0.003s
 190 - DELETE and REFILL one table.................................    0.003s
 200 - VACUUM......................................................    0.006s
 210 - ALTER TABLE ADD COLUMN, and query...........................    0.000s
 230 - 500 UPDATES, numeric BETWEEN, indexed.......................    0.001s
 240 - 2500 UPDATES of individual rows.............................    0.002s
 250 - One big UPDATE of the whole 2500-row table..................    0.001s
 260 - Query added column after filling............................    0.000s
 270 - 500 DELETEs, numeric BETWEEN, indexed.......................    0.002s
 280 - 2500 DELETEs of individual rows.............................    0.003s
 290 - Refill two 2500-row tables using REPLACE....................    0.009s
 300 - Refill a 2500-row table using (b&1)==(a&1)..................    0.004s
 310 - 500 four-ways joins.........................................    0.005s
 320 - subquery in result set......................................    0.003s
 400 - 3500 REPLACE ops on an IPK..................................    0.002s
 410 - 3500 SELECTS on an IPK......................................    0.003s
 500 - 3500 REPLACE on TEXT PK.....................................    0.002s
 510 - 3500 SELECTS on a TEXT PK...................................    0.003s
 520 - 3500 SELECT DISTINCT........................................    0.002s
 980 - PRAGMA integrity_check......................................    0.009s
 990 - ANALYZE.....................................................    0.001s
       TOTAL.......................................................    0.124s

É configuração zero

Indiscutivelmente, a principal vantagem do SQLite é que você não precisa gastar dezenas de horas tentando configurar um sistema distribuído para começar a usá-lo. Na verdade, você realmente não precisa de nada, nem mesmo de um disco rígido, para começar a prototipar. Seu ambiente não possui armazenamento persistente? Sem problemas: o SQLite executará com prazer um banco de dados na memória para você. Isso se traduz em experiência de desenvolvedor superior. O foco principal da libSQL é a capacidade de iniciar rapidamente e prototipar seu projeto 100% localmente e enviá-lo para a nuvem apenas ao implantar na produção.

é sólido como uma rocha

O SQLite é respaldado por um extenso conjunto de testes , reivindicando 100% de cobertura de ramificação, em vários aspectos e configurações:

  • verificações de correção
  • testes de erro de E/S
  • Fuzzing
  • Testes de regressão
  • Testes de falha/perda de energia
  • Testes de memória restrita

Infelizmente, uma boa parte deste conjunto de testes é de código fechado ( estamos trabalhando nisso ). Ainda assim, o software é considerado universalmente testado em batalha, pois alimenta tudo, desde smartphones a aeronaves e muito mais. É importante poder confiar seus dados ao banco de dados — evite corrupção, perda de dados, podridão de bits e todos os outros tipos de coisas desagradáveis ​​que podem acontecer. E embora seja impossível escapar ileso de todas essas situações, a cobertura adequada do teste é a melhor medida preventiva para começar.

É repleto de recursos

Não se deixe enganar por seu tamanho compacto - SQLite é carregado com recursos. Você sabia que pode pedir a data de hoje com uma simples consulta?

SELECT date('now');

SELECT date('now', 'start of month');

SELECT date('now', 'start of month', '+7 days');

SELECT date('now', 'start of month', '+7 days', 'weekday 3');

SELECT date('now', 'start of month', '+7 days', 'weekday 3', 'utc');

O mecanismo de extensão também é digno de nota. Embora a base do SQLite seja relativamente pequena e robusta, ela pode ser facilmente estendida com infinitas funcionalidades. Extensões de código aberto (por exemplo, sqlean ) variam de funções matemáticas adicionais, por meio de estruturas de dados complexas, suportando diferentes formatos de armazenamento, integração de IA como embeddings ou pesquisa vetorial, replicação, CRDT e inúmeros outros recursos.

A libSQL também estende a interface vanilla SQLite com funções definidas pelo usuário do WebAssembly , o que oferece aos usuários ainda mais flexibilidade.

Pode ser Wasm!!

O SQLite, assim como o libSQL, pode ser compilado em um módulo Wasm conciso — apenas 390 KiB compactado, menos de 900 KiB de tamanho não compactado. Ele pode executar um mecanismo SQL completo na memória, mas isso não é tudo! Ele também é capaz de manter os dados no localStorage do seu navegador, ou OPFS — Origin Private File System — que é uma abordagem moderna para fornecer um sistema de arquivos privado para aplicativos da Web. Você pode experimentar a demonstração para ter uma ideia de como funciona .

Mas o WebAssembly vai muito além dos navegadores, e o SQLite também. Versões recentes compilam para WASI — uma interface de sistema modular para WebAssembly. Isso abre todo um novo mundo de possibilidades, tornando o SQLite viável para ambientes de borda que executam funções sem servidor na forma de módulos Wasm — Fermyon Spin , Cloudflare Workers , scale.sh .

Qual é o próximo?

O SQLite tem um grande potencial para o edge. Nosso fork — libSQL — é tanto de código aberto quanto de contribuição aberta, e pretendemos evoluí-lo para atender a muito mais casos de uso do que o SQLite foi originalmente projetado, incluindo ambientes de ponta — como Turso, nosso banco de dados nativo de ponta . Somos um esforço comunitário, então sinta-se encorajado a se tornar um colaborador. Ah, e nos dê uma estrela no GitHub!