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.
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.
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.
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/
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.