Documentation
¶
Overview ¶
Package dbresolver provides an explicit read/write split over Bun: writes go to the primary, reads are spread round-robin across replicas. Routing is explicit (Reader/Writer) because Bun query hooks are observational and cannot redirect a query's connection.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Resolver ¶
type Resolver struct {
// contains filtered or unexported fields
}
Resolver routes database access to a primary and read replicas.
Example ¶
Send writes to the primary and reads to replicas (round-robin).
package main
import (
"database/sql"
"fmt"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
"github.com/rahmadafandi/fibr/dbresolver"
)
func open(name string) *bun.DB {
sqldb, _ := sql.Open(sqliteshim.ShimName, "file:"+name+"?mode=memory&cache=shared")
return bun.NewDB(sqldb, sqlitedialect.New())
}
// Send writes to the primary and reads to replicas (round-robin).
func main() {
r := dbresolver.New(open("primary"), open("replica1"), open("replica2"))
defer r.Close()
// Writes: r.Writer().NewInsert()... Reads: r.Reader().NewSelect()...
fmt.Println(r.Writer() != nil, r.Reader() != nil)
}
Output: true true
func New ¶
New returns a Resolver. Writes use primary; reads round-robin across replicas (falling back to primary when none are given).
Click to show internal directories.
Click to hide internal directories.