Quando o NoSQL não é o vilão
Super Disclaimer
Toda ferramenta tem seu ponto ideal de uso e hoje não estou vindo criticar o modelo relacional e endeusar o modelo NoSQL. Mas sim compartilhar um artigo interessante que eu estava lendo sobre sincronização entre dispositivos usando um banco de dados NOSQL chamado PouchDB
História:
Desde 2020 eu venho acompanhando um canal no youtube chamado Dev as Life que pertence a um Japones chamado Takuya Matsuyama.
Este Japonês tem o seu próprio Saas com modelo de assinatura paga chamado Inkdrop que aliás ele está mantendo novamente sozinho.
E apesar de ter assistido esse canal muitas vezes inclusive me incentivando a deixar meu preconceito com Javascript para trás e tentar aprender um pouco sobre a linguagem, eu nunca havia lido seus posts no medium. Quando vi pela primeira vez foi como abrir a caixa de pandora.
O determinado post
Dentro do medium, eu estava lendo sobre "como eu deixei de ter meta financeira para meu SaaS" quando ele bateu 1000 assinantes (para quem não sabe, ele cobra o mínimo de 10 dólares por mês), "Como eu fiz o electron ficar 1000ms mais rápido" ... e outras coisas assim, até chegar ao post que me surpreendeu How i Develop an app that runs and syncs on both desktop and mobile platforms alone.
Ok, ele exagerou um pouco porque usou um monte de ferramenta open-source para fazer isso. Mas o ponto em questão que me surpreendeu foi o uso do PouchDB que é um NoSQL que eu nunca vi, nem senti o cheiro. Diferente de MariaDB, MySQL, Postgres, MongoDB, MemCached até o falecido Redis que são nomes que você vê como um gato pingado em código alheio por ai.
Mas veja o que ele diz sobre o pouchDB no determinado post, já vou mandar traduzido para facilitar a leitura.
Apache CouchDB é um banco de dados orientado a documentos (NoSQL) que possui API JSON baseada em HTTP e oferece suporte à sincronização multimestre. Possui uma GUI baseada na web chamada Fauxton que permite gerenciar bancos de dados e documentos facilmente. PouchDB é um banco de dados JavaScript inspirado no CouchDB, que pode ser sincronizado com ele. Primeiro, criei a versão desktop e não me importei com plataformas móveis porque presumi que o PouchDB funciona tão bem em dispositivos móveis porque está escrito em JavaScript e parece já haver algumas opções . Se não funcionar, eu poderia construir meu próprio módulo de banco de dados cliente, pois o CouchDB é RESTful.
O motivo pelo qual escolhi o CouchDB em vez de outro PaaS (Platform-as-a-Service) que oferece suporte à sincronização de dados entre dispositivos como o Firebase é porque eu precisava de suporte flexível de indexação do lado do cliente. Há 3 anos, quando comecei este projeto, o firestore ainda não era tão flexível para realizar isso. O PouchDB parecia promissor, pois suporta MapReduce do lado do cliente para construir índices e possui um módulo de pesquisa de texto completo . Além disso, existe um DBaaS para CouchDB chamado Cloudant , que pode dimensionar elasticamente a taxa de transferência e o armazenamento de forma independente. Como não tenho vontade de operar servidores, comecei a usar o Cloudant logo no início. Atualmente estou operando o CouchDB no AWS EC2 porque descobri que a carga do servidor é basicamente estável e não tão pesada como os serviços BtoC do que eu esperava e o Cloudant era muito lento e desconfortável para gerenciar no IBM Cloud.
No geral, estou feliz com o CouchDB e o PouchDB até agora.
Interessante, não é? eu achei ainda mais porque o Inkdrop tem a filosofia de Offline things first. Ou seja, ele não necessita que você fique 100% conectado para fazer suas coisas.
Você pode editar algo do celular offline, outro no notebook, outro num mac, outro num linux ... e a partir do momento que se conecta a internet, todos os dispositivos se sincronizam e os dados são compartilhados entre eles.
Vendo o github do pouchDB
Após ler este post, eu fui procurar o PouchDB no github e quando encontrei, procurei pontos que possam ser interessantes arquiteturalmente no código então vamos dar uma olhada e antes que perguntem sim, o PouchDB possui muitos testes 🏆
1º O pouchDB é uma coleção de vários node-packages que interagem ou não entre si. O que torna muito enxuto quando você quer fazer algo simples e não precisa da estrutura completa.
2º O pouchDB possui suporte a replicação, md5 e merge mas isso não foi tão interessante quanto a forma que se escreve com o pouchDB
PouchDB Example:
Tirado diretamente no Site Oficial, este é como você utilizaria o PouchDB na sua aplicação:
var db = new PouchDB('dbname');
db.put({
_id: '[email protected]',
name: 'David',
age: 69
});
db.changes().on('change', function() {
console.log('Ch-Ch-Changes');
});
db.replicate.to('http://example.com/mydb');
Se isso te lembra o prisma, fique tranquilo me lembra também
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: '[email protected]',
},
})
console.log(user)
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
Se colocar um do lado do outro, nem parece ter diferença.
Concluindo
Vou deixar o post que me fez pesquisar mais sobre o PouchDB aqui em baixo.
Espero ter atiçado um pouco mais sua curiosidade sobre o assunto. Obrigado por ler até aqui