postgresql를 쓰는 이유
먼저 aws의 람다보다 cloudflare의 workers가 더 저렴하고 콜드 스타트에 걸리는 시간도 적다고 해서 workers를 쓰기로 했다.
workers에는 workers KV 라는 key-value 기반의 저장장소를 제공하지만 쿼리문을 쓰는 데이터베이스가 아니라서 한계가 있다. 그래서 외부 디비와 연결하려고 시도했지만 문제는 workers가 http 프로토콜만 지원해서 몽고디비와 같은 디비와 직접적으로 연결할 수 없다.
최근에 mongodb atlas 와 prisma 연동 가이드글이 블로그에 올라왔다. atlas는 내 생각에는 좀 비쌌다. 저렴하게 서버리스 인프라를 돌리자는 컨셉과 부합하지 않아서 몽고디비는 클라우드서버에 올리고 prisma로 연동해서 쓰기로 했다.
prisma는 TCP를 프록시해주는 prisma data proxy 라는 서비스를 써서 연결해야 하는데 자동으로 트랜지션 옵션이 켜져서 retryWrites 옵션 에러가 났다. 검색해보니 replica set 을 구성하라고 하는데 vultr 클라우드 서버에 올린 내 standalone 몽고db에 적용이 잘 안됨..
그냥 쉬운방법 찾고자 검색하다 디지털오션에서 managed database 제품에 몽고db 호스팅 발견했다. 근데 replica set는 노드를 3개 써야 해서 각각 15달러씩 매달 45달러 비용이 들어서 포기. 좀 비싸다. 그리고 옆에 postgresql 호스팅 15달러가 있어서 그냥 prisma에 한번 붙여봤더니 잘 되더라. postgresql을 잘 모르지만 쓰기로 했다.
문제점
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request: Request): Promise<Response> {
let start = Date.now();
const allUsers = await prisma.user.findMany();
let end = Date.now();
return new Response(
`request method: ${request.method}! \n ${JSON.stringify(
allUsers
)}\n start: ${start} / end: ${end} / diff: ${end - start}`
);
}
스크린샷
prisma 쿼리 조회하기 전과 후를 타이머로 재봤는데 조금 느리다. workers는 콜드스타트 지연이 거의 없는데 prisma data proxy가 콜드스타트 지연이 확실히 있는듯.
스크린샷에 보이는 2.3초와 같이 첫 오픈 시에 1~2초의 딜레이가 생긴다. 그 후에는 200~600정도 밀리초가 걸리는데 이것도 빠른 건 아닌 것 같다. prisma proxy data의 리전이 유럽, 미국서부 밖에 없어서 미국으로 잡아서 그런가? 이후 다른 지역 리전이 추가되면 나아질 수도.
시간을 너무 버려서 그냥 여기까지만 하고 쓰기로 했다. 주로 사이드로 앱을 만들 것 같아서 스플래쉬 화면 이 돌아갈 때 콜드 스타트 지연이 완료될텐데 큰 문제가 없을 수도
깃헙 예제 -
Loading Comments...