use read replica for "read"

This commit is contained in:
Hongbo Wu
2024-06-21 14:39:40 +08:00
parent b0d6876e56
commit a1cd611fa7
2 changed files with 39 additions and 32 deletions

View File

@ -23,26 +23,27 @@ export const appDataSource = new DataSource({
max: env.pg.pool.max,
idleTimeoutMillis: 10000, // 10 seconds
},
replication: env.pg.slave
? {
// set the default destination for read queries as the master instance
defaultMode: 'master',
master: {
host: env.pg.host,
port: env.pg.port,
username: env.pg.userName,
password: env.pg.password,
database: env.pg.dbName,
},
slaves: [
{
host: env.pg.slave.host,
port: env.pg.slave.port,
username: env.pg.slave.userName,
password: env.pg.slave.password,
database: env.pg.slave.dbName,
},
],
}
: undefined,
})
if (env.pg.replication) {
appDataSource.setOptions({
replication: {
master: {
host: env.pg.host,
port: env.pg.port,
username: env.pg.userName,
password: env.pg.password,
database: env.pg.dbName,
},
slaves: [
{
host: env.pg.slave.host,
port: env.pg.slave.port,
username: env.pg.slave.userName,
password: env.pg.slave.password,
database: env.pg.slave.dbName,
},
],
},
})
}

View File

@ -19,7 +19,8 @@ export interface BackendEnv {
pool: {
max: number
}
slave?: {
replication: boolean
slave: {
host: string
port: number
userName: string
@ -186,6 +187,12 @@ const nullableEnvVars = [
'NOTION_CLIENT_SECRET',
'NOTION_AUTH_URL',
'SCORE_API_URL',
'PG_REPLICATION',
'PG_SLAVE_HOST',
'PG_SLAVE_PORT',
'PG_SLAVE_USER',
'PG_SLAVE_PASSWORD',
'PG_SLAVE_DB',
] // Allow some vars to be null/empty
const envParser =
@ -225,15 +232,14 @@ export function getEnv(): BackendEnv {
pool: {
max: parseInt(parse('PG_POOL_MAX'), 10),
},
slave: parse('PG_SLAVE_HOST')
? {
host: parse('PG_SLAVE_HOST'),
port: parseInt(parse('PG_SLAVE_PORT'), 10),
userName: parse('PG_SLAVE_USER'),
password: parse('PG_SLAVE_PASSWORD'),
dbName: parse('PG_SLAVE_DB'),
}
: undefined,
replication: parse('PG_REPLICATION') === 'true',
slave: {
host: parse('PG_SLAVE_HOST'),
port: parseInt(parse('PG_SLAVE_PORT'), 10),
userName: parse('PG_SLAVE_USER'),
password: parse('PG_SLAVE_PASSWORD'),
dbName: parse('PG_SLAVE_DB'),
},
}
const server = {
jwtSecret: parse('JWT_SECRET'),