Sobes.tech
Junior — Middle

Ինչպե՞ս եք իրականացնում հարցումների կրկնօրինակը և ինչ փորձ եք կարող կիսել այս գործընթացում։

sobes.tech AI

Պատասխան AI-ից

Golang կոնտեքստում հարցումների կրկնօրինակումն սովորաբար կապված է բեռի բաշխման հետ մի քանի սերվերների կամ տվյալների բազաների միջև՝ թերությունների դիմաց դիմակայելու և կատարողականությունը բարձրացնելու համար: Առաջատար մոտեցումներից մեկը պրոքսի սերվեր կամ բեռի հավասարակշռիչ օգտագործելն է, որը կրկնօրինակում է հարցումները մի քանի կրկնօրինակների վրա:

Իմ փորձից, ես իրականացրել եմ հարցումների կրկնօրինակում ծրագրի մակարդակով, երբ ընթերցման հարցումները ուղղվում էին տվյալների բազայի կրկնօրինակներին, իսկ գրելու հարցումները՝ հիմնական սերվերին: Դրա համար, Go-ում, ես օգտագործել եմ ինտերֆեյսներ և "պահոց"-ի ձևանմուշը՝ տվյալների մուտքի տրամաբանությունը ամփոփելու և հարցումները ուղղելու համար ճիշտ տեղ:

Նմուշ՝ ընթերցման համար կրկնօրինակի ընտրության պարզեցված օրինակ:

 type DB interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    Exec(query string, args ...interface{}) (sql.Result, error)
}

// Հիմնական սերվեր գրելու համար
var masterDB DB
// Կրկնօրինակներ ընթերցման համար
var replicaDBs []DB

func QueryRead(query string, args ...interface{}) (*sql.Rows, error) {
    // Պարզ ռազմավարություն՝ պատահական ընտրություն
    replica := replicaDBs[rand.Intn(len(replicaDBs)))]
    return replica.Query(query, args...)
}

func ExecWrite(query string, args ...interface{}) (sql.Result, error) {
    return masterDB.Exec(query, args...)
}

Կարևոր է նաև հաշվի առնել տվյալների համահունչությունը և կրկնօրինակումների ուշացումը՝ որպեսզի խուսափել հնացած տվյալներ ստանալուց կրկնօրինակներից ընթերցելիս։