No final de março de 2024, Mike Stonebraker anunciou em um blog o lançamento do DBOS Cloud, “uma plataforma de computação transacional sem servidor, possibilitada por um novo sistema operacional revolucionário, DBOS, que implementa serviços de sistema operacional em um banco de dados distribuído”. Isso parece estranho, para dizer o mínimo, mas faz mais sentido quando você lê a história de origem:

A ideia do DBOS (Sistema Operacional Orientado a Banco de Dados) surgiu há 3 anos com a minha percepção de que o estado que um sistema operacional deve manter (arquivos, processos, threads, mensagens, etc.) aumentou de tamanho em cerca de 6 ordens de magnitude desde que comecei. usando Unix em um PDP-11/40 em 1973. Como tal, armazenar o estado do sistema operacional é um problema de banco de dados. Além disso, o Linux é um código legado atualmente e está tendo dificuldade para progredir. Por exemplo, não existe uma versão multi-nós do Linux, exigindo que as pessoas executem um orquestrador como o Kubernetes. Quando ouvi uma palestra de Matei Zaharia na qual ele disse que o Databricks não poderia usar a tecnologia tradicional de agendamento de sistema operacional na escala em que estava executando e, em vez disso, recorreu a uma solução DBMS, ficou claro que era hora de mover o DBMS para o kernel e construir um novo sistema operacional.”

Se você não conhece Stonebraker, ele é um cientista da computação (e professor) focado em banco de dados desde o início dos anos 1970, quando ele e seus colegas da UC Berkeley, Eugene Wong e Larry Rowe, fundaram a Ingres. Mais tarde, Ingres inspirou o Sybase, que acabou sendo a base do Microsoft SQL Server. Depois de vender o Ingres para a Computer Associates, Stonebraker e Rowe começaram a pesquisar o Postgres, que mais tarde se tornou o PostgreSQL e também evoluiu para o Illustra, que foi adquirido pela Informix.

Ouvi Stonebraker falar sobre Postgres em uma conferência sobre DBMS em 1980. O que tirei dessa palestra, além da imagem de “tambores da selva” pedindo SQL, foi a ideia de que você poderia adicionar suporte para tipos de dados complexos ao banco de dados, implementar novos tipos de índice, estender a linguagem de consulta e adicionar suporte para isso ao analisador e otimizador de consulta. O exemplo que ele usou foi informação geoespacial, e ele explicou um tipo de estrutura de índice que tornaria as consultas geométricas em bancos de dados 2D muito rápidas. (Essa facilidade acabou se tornando PostGIS. A árvore R atualmente usada por padrão nos índices PostGIS GiST não foi inventada até 1984, então Mike provavelmente estava falando sobre o índice quadtree mais antigo.)

Avançando 44 anos, não deveria surpreender ninguém no campo de banco de dados que o DBOS usa uma versão distribuída do PostgreSQL como camada de banco de dados do kernel.

O diagrama do sistema DBOS deixa claro que um banco de dados faz parte do kernel do sistema operacional. O banco de dados distribuído depende de um kernel mínimo, mas fica sob os serviços do sistema operacional em vez de ser executado na camada de aplicativo como faria um banco de dados normal.

Recursos DBOS

DBOS Transact, uma estrutura TypeScript de código aberto, oferece suporte a transações compatíveis com Postgres, orquestração confiável de fluxo de trabalho, serviço HTTP usando GET e POST, comunicação com serviços externos e APIs de terceiros, solicitações idempotentes usando chaves UUID, autenticação e autorização, integração Kafka com semântica exatamente uma vez, testes de unidade e auto-hospedagem. DBOS Cloud, uma plataforma transacional sem servidor para implantação de aplicativos DBOS Transact, oferece suporte à implantação de aplicativos sem servidor, depuração de viagem no tempo, gerenciamento de banco de dados em nuvem e observabilidade.

Vamos destacar algumas das principais áreas de interesse.

Transação DBOS

O código mostrado na captura de tela abaixo demonstra transações, bem como a veiculação HTTP usando GET. Vale a pena ler o código com atenção. São apenas 18 linhas, sem contar as linhas em branco.

A primeira importação (linha 1) traz as classes DBOS SDK que precisaremos. A segunda importação (linha 2) traz o construtor de consultas SQL Knex.js, que trata do envio da consulta parametrizada ao banco de dados Postgres e do retorno das linhas resultantes. O esquema da tabela do banco de dados é definido nas linhas 4 a 8; as únicas colunas são uma name corda e um greet_count inteiro.

Existe apenas um método no Hello aula, helloTransaction. Está embrulhado em @GetApi e @Transaction decoradores, que respectivamente fazem com que o método seja servido em resposta a um HTTP GET solicitação no caminho /greeting/ seguido pelo parâmetro username que você deseja passar e agrupar a chamada do banco de dados em uma transação, para que duas instâncias não possam atualizar o banco de dados simultaneamente.

A string de consulta do banco de dados (linha 16) usa a sintaxe do PostgreSQL para tentar inserir uma linha no banco de dados para o nome fornecido e uma contagem inicial de 1. Se a linha já existir, então o ON CONFLICT trigger executa uma operação de atualização que incrementa a contagem no banco de dados.

A linha 17 usa Knex.js para enviar a consulta SQL ao banco de dados do sistema DBOS e recuperar o resultado. A linha 18 extrai a contagem da primeira linha de resultados e retorna a string de saudação ao programa chamador.

O uso de SQL e um banco de dados para o que parece ser uma API central do sistema na memória, como um contador atômico do Linux ou uma variável interligada do Windows, parece profundamente estranho. No entanto, funciona.

dbos 02

Este código TypeScript para uma classe Hello é gerado quando você executa uma operação de criação de DBOS. Como você pode ver, ele depende dos decoradores @GetApi e @Transaction para servir a função a partir de solicitações HTTP GET e executar a função como uma transação de banco de dados.

Depurador de viagem no tempo DBOS

Quando você executa um aplicativo no DBOS Cloud, ele registra cada etapa e alteração feita (o fluxo de trabalho) no banco de dados. Você pode depurar isso usando o Visual Studio Code e a extensão DBOS Time Travel Debugger. O depurador de viagem no tempo permite depurar seu aplicativo DBOS no banco de dados conforme ele existia no momento em que o fluxo de trabalho selecionado foi executado originalmente.

dbos 03

Para realizar a depuração de viagem no tempo, primeiro comece com um CodeLens para listar fluxos de trabalho de rastreamento salvos. Depois de escolher o que deseja, você pode depurá-lo usando o Visual Studio Code com um plugin ou a partir da linha de comando.

dbos 04

A depuração de viagem no tempo com um fluxo de trabalho salvo se parece muito com a depuração comum no Visual Studio Code. O código que está sendo depurado é a mesma classe Hello que você viu anteriormente.

Início rápido do DBOS

O tutorial DBOS Quickstart requer Node.js 20 ou posterior e um banco de dados PostgreSQL ao qual você pode se conectar, localmente, em um contêiner Docker ou remotamente. Eu já tinha o Node.js v20.9.0 instalado em meu MacBook M1, mas atualizei-o para a v20.12.1 no site do Node.js.

Eu não tinha o PostgreSQL instalado, então baixei e executei o instalador interativo para v16.2 do EnterpriseDB. Este instalador cria um servidor e aplicativos macOS completos. Se eu tivesse usado o Homebrew, ele teria criado aplicativos de linha de comando e, se eu tivesse usado o Postgres.app, teria obtido um aplicativo de barra de menu.

O Quickstart propriamente dito começa criando um diretório de aplicativo DBOS usando Node.js.

martinheller@Martins-M1-MBP ~ % npx -y @dbos-inc/create@latest -n myapp
Merged .gitignore files saved to myapp/.gitignore
added 590 packages, and audited 591 packages in 25s
found 0 vulnerabilities
added 1 package, and audited 592 packages in 1s
found 0 vulnerabilities
added 129 packages, and audited 721 packages in 5s
found 0 vulnerabilities
Application initialized successfully!

Em seguida, você configura o aplicativo para usar seu servidor Postgres e exporta sua senha Postgres para uma variável de ambiente.

martinheller@Martins-M1-MBP ~ % cd myapp
martinheller@Martins-M1-MBP myapp % npx dbos configure
? What is the hostname of your Postgres server? localhost
? What is the port of your Postgres server? 5432
? What is your Postgres username? postgres
martinheller@Martins-M1-MBP myapp % export PGPASSWORD=*********

Depois disso, você cria um banco de dados “Hello” usando Node.js e Knex.js.

martinheller@Martins-M1-MBP myapp % npx dbos migrate
2024-04-09 15:01:42 (info): Starting migration: creating database hello if it does not exist
2024-04-09 15:01:42 (info): Database hello does not exist, creating...
2024-04-09 15:01:42 (info): Executing migration command: npx knex migrate:latest
2024-04-09 15:01:43 (info): Batch 1 run: 1 migrations
2024-04-09 15:01:43 (info): Creating DBOS tables and system database.
2024-04-09 15:01:43 (info): Migration successful!

Feito isso, você cria e executa o aplicativo DBOS localmente.

martinheller@Martins-M1-MBP myapp % npm run build
npx dbos start

> [email protected] build
> tsc

2024-04-09 15:02:30 (info): Workflow executor initialized
2024-04-09 15:02:30 (info): HTTP endpoints supported:
2024-04-09 15:02:30 (info):     GET   :  /greeting/:user
2024-04-09 15:02:30 (info): DBOS Server is running at http://localhost:3000
2024-04-09 15:02:30 (info): DBOS Admin Server is running at http://localhost:3001
^C

Neste ponto, você pode navegar até http://localhost:3000 para testar o aplicativo. Feito isso, você se cadastra no DBOS Cloud e provisiona seu próprio banco de dados por lá.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud register -u meheller
2024-04-09 15:11:35 (info): Welcome to DBOS Cloud!
2024-04-09 15:11:35 (info): Before creating an account, please tell us a bit about yourself!
Enter First/Given Name: Martin
Enter Last/Family Name: Heller
Enter Company: self
2024-04-09 15:12:06 (info): Please authenticate with DBOS Cloud!
Login URL: https://login.dbos.dev/activate?user_code=QWKW-TXTB
2024-04-09 15:12:12 (info): Waiting for login...
2024-04-09 15:12:17 (info): Waiting for login...
2024-04-09 15:12:22 (info): Waiting for login...
2024-04-09 15:12:27 (info): Waiting for login...
2024-04-09 15:12:32 (info): Waiting for login...
2024-04-09 15:12:38 (info): Waiting for login...
2024-04-09 15:12:44 (info): meheller successfully registered!
martinheller@Martins-M1-MBP myapp % npx dbos-cloud db provision iw_db -U meheller
Database Password: ********
2024-04-09 15:19:22 (info): Successfully started provisioning database: iw_db
2024-04-09 15:19:28 (info): {"PostgresInstanceName":"iw_db","HostName":"userdb-51fcc211-6ed3-4450-a90e-0f864fc1066c.cvc4gmaa6qm9.us-east-1.rds.amazonaws.com","Status":"available","Port":5432,"DatabaseUsername":"meheller","AdminUsername":"meheller"}
2024-04-09 15:19:28 (info): Database successfully provisioned!

Finalmente, você pode registrar e implantar seu aplicativo na DBOS Cloud.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud app register -d iw_db
2024-04-09 15:20:09 (info): Loaded application name from package.json: myapp
2024-04-09 15:20:09 (info): Registering application: myapp
2024-04-09 15:20:11 (info): myapp ID: d8806829-c5b8-4df0-8b5a-2d1bf87c3322
2024-04-09 15:20:11 (info): Successfully registered myapp!
martinheller@Martins-M1-MBP myapp % npx dbos-cloud app deploy
2024-04-09 15:20:35 (info): Loaded application name from package.json: myapp
2024-04-09 15:20:35 (info): Submitting deploy request for myapp
2024-04-09 15:21:09 (info): Submitted deploy request for myapp. Assigned version: 1712676035
2024-04-09 15:21:13 (info): Waiting for myapp with version 1712676035 to be available
2024-04-09 15:21:21 (info): Successfully deployed myapp!
2024-04-09 15:21:21 (info): Access your application at https://meheller-myapp.cloud.dbos.dev/
dbos 05

A aplicação “Hello” em execução no DBOS Cloud conta cada saudação. Ele usa o código que você viu anteriormente.

Aplicativos DBOS

O aplicativo “Hello” ilustra alguns dos principais recursos do DBOS Transact e do DBOS Cloud, mas é tão básico que mal chega a ser um brinquedo. O início rápido de programação adiciona mais alguns detalhes e vale a pena analisá-lo. Você aprenderá como usar funções do Communicator para acessar serviços de terceiros (e-mail, neste exemplo), bem como compor fluxos de trabalho confiáveis. Você literalmente interromperá o fluxo de trabalho e o reiniciará sem reenviar o e-mail: os fluxos de trabalho do DBOS sempre são executados até a conclusão e cada uma de suas operações é executada uma vez e somente uma vez. Isso é possível porque o DBOS persiste a saída de cada etapa do seu banco de dados.

Depois de entender o início rápido de programação, você estará pronto para experimentar os dois aplicativos de demonstração do DBOS, que fazer ascender ao nível de brinquedos. Ambas as demonstrações usam Next.js para seus front-ends e ambas usam fluxos de trabalho, transações e comunicadores DBOS.

A primeira demonstração, E-Commerce, é um sistema de compras e processamento de pagamentos na web. Vale a pena ler a seção Under the Covers do README no repositório da demonstração para entender como funciona e como você pode querer atualizá-lo para, por exemplo, usar um provedor de pagamento do mundo real.

A segunda demonstração, YKY Social, simula uma rede social simples e usa TypeORM em vez de Knex.js para seu código de banco de dados. Ele também usa o Amazon S3 para fotos de perfil. Se você realmente quer usar o DBOS, você deve trabalhar com ambos os aplicativos de demonstração.

Um vislumbre tentador

Devo dizer que DBOS e DBOS Cloud parecem muito interessantes. Execução confiável e depuração de viagem no tempo, por exemplo, são bastante desejáveis. Por outro lado, eu não gostaria de construir um aplicativo real em DBOS ou DBOS Cloud neste momento. Tenho muitas perguntas, começando por “Como isso é dimensionado na prática?” e provavelmente terminando com “Quanto custará na escala X?”

Mencionei anteriormente que o código DBOS parece estranho, mas funciona. Eu imagino que qualquer loja de programação que esteja pensando em escrever um aplicativo ficaria desencorajada ou até mesmo repelida pela parte “parece estranho”, já que os desenvolvedores tendem a ser obstinados até que o que estão fazendo não funcione mais.

Também devo salientar que a implementação atual do DBOS está muito longe do diagrama do sistema que você viu no início desta revisão. Onde está o kernel mínimo? DBOS atualmente é executado em macOS, Linux e Windows. Nenhum desses são kernels mínimos. DBOS Cloud atualmente roda em AWS. Novamente, não é um kernel mínimo.

Então, no geral, DBOS é um vislumbre tentador de algo que pode acabar se tornando legal. É novo e brilhante e vem de pessoas inteligentes, mas levará algum tempo até que possa se tornar um sistema convencional.

Custo: Gratuito com limites de uso; os planos pagos exigem que você entre em contato com o departamento de vendas.

Plataforma: macOS, Linux, Windows, AWS.