Rumah > pembangunan bahagian belakang > Golang > Penjelasan terperinci tentang kunci yang diedarkan dan transaksi yang diedarkan bagi rangka kerja Gin

Penjelasan terperinci tentang kunci yang diedarkan dan transaksi yang diedarkan bagi rangka kerja Gin

WBOY
Lepaskan: 2023-06-22 09:14:08
asal
1479 orang telah melayarinya

Dengan pembangunan berterusan dan lelaran aplikasi Internet, seni bina yang diedarkan semakin menjadi model pembangunan arus perdana. Dalam sistem teragih, kunci teragih dan transaksi teragih ialah dua konsep yang sangat penting, yang boleh meningkatkan prestasi serentak dan ketekalan data sistem dengan berkesan. Sebagai rangka kerja Web berprestasi tinggi, rangka kerja Gin juga menyediakan beberapa penyelesaian yang sangat berguna untuk kunci yang diedarkan dan transaksi yang diedarkan.

1. Pengetahuan asas tentang rangka kerja Gin

Rangka kerja Gin ialah rangka kerja Web dengan kelajuan dan prestasi sebagai matlamat reka bentuk utamanya Ia berdasarkan bahasa Golang dan mempunyai reka bentuk API yang elegan prestasi cemerlang. Apabila menggunakan rangka kerja Gin, kami boleh mendapatkan permintaan HTTP dan parameter tindak balas melalui gin.Konteks, dan kami juga boleh menggunakan beberapa perisian tengah untuk melaksanakan fungsi biasa, seperti pengelogan, pengesahan, pengehadan semasa, dsb.

2. Pelaksanaan kunci teragih

Dalam sistem teragih, kerana berbilang nod mengakses sumber yang sama pada masa yang sama, masalah konkurensi akan berlaku. Untuk menyelesaikan masalah ini, kami boleh menggunakan kunci teragih untuk memastikan hanya satu nod boleh mengakses sumber pada masa yang sama.

Rangka kerja Gin menyediakan beberapa penyelesaian kunci teragih yang sangat berguna. Yang lebih biasa ialah kunci teragih yang dilaksanakan berdasarkan Redis. Redis ialah pangkalan data dalam memori berprestasi tinggi yang menyediakan beberapa operasi atom, seperti SETNX (tetapkan jika tidak wujud), EXPIRE (tetapkan masa tamat tempoh), dsb., yang boleh melaksanakan kunci teragih dengan mudah.

Di bawah kami menggunakan contoh mudah untuk menunjukkan cara menggunakan Redis untuk melaksanakan kunci teragih. Katakan kita ingin melaksanakan tugasan dengan akses serentak yang tinggi Setiap kali nod mengakses tugasan, ia perlu memperoleh kunci yang diedarkan untuk memastikan tugas itu tidak akan diproses oleh nod lain pada masa yang sama.

func taskHandler(c *gin.Context) {
    key := "lock_key"
    lockExpire := time.Second * 10
    
    // 获取redis连接
    redisClient := redis.NewClient(&redis.Options{
        Addr: "localhost:6379",
        Password: "",
        DB: 0,
    })

    // 获取分布式锁
    lockSuccess, err := redisClient.SetNX(key, "lock_value", lockExpire).Result()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "code": -1,
            "msg": "failed to get lock",
            "data": "",
        })
        return
    }
    
    // 如果获取锁失败
    if !lockSuccess {
        c.JSON(http.StatusInternalServerError, gin.H{
            "code": -2,
            "msg": "lock is being held by other node",
            "data": "",
        })
        return
    }

    // 处理任务
    // ...

    // 释放分布式锁
    _, err = redisClient.Del(key).Result()
    if err != nil {
        log.Printf("failed to release lock: %v", err)
    }

    c.JSON(http.StatusOK, gin.H{
        "code": 0,
        "msg": "success",
        "data": "",
    })
}
Salin selepas log masuk

Dalam contoh ini, kami mula-mula mencipta klien Redis melalui fungsi redis.NewClient(). Kemudian kami memperoleh kunci yang diedarkan melalui fungsi redisClient.SetNX() Jika pemerolehan kunci gagal, maklumat kegagalan akan dikembalikan secara langsung. Jika kunci berjaya diperoleh, tugasan diproses dalam masa tamat tempoh kunci, dan akhirnya kunci yang diedarkan dilepaskan melalui fungsi redisClient.Del().

3. Pelaksanaan transaksi teragih

Dalam sistem teragih, memandangkan data diedarkan pada berbilang nod, masalah ketekalan data akan timbul. Dalam kes ini, kita biasanya perlu menggunakan transaksi yang diedarkan untuk mengurus operasi transaksi merentas berbilang nod. Dalam rangka kerja Gin, kami juga boleh menggunakan beberapa alatan untuk mengawal transaksi yang diedarkan.

Penyelesaian transaksi teragih biasa dalam rangka kerja Gin ialah transaksi teragih berdasarkan protokol XA. Protokol XA ialah protokol pemprosesan transaksi teragih yang menyeragamkan protokol Komit Dua Fasa untuk memastikan konsistensi transaksi antara berbilang nod. Dalam rangka kerja Gin, kami boleh melaksanakan kawalan transaksi teragih bagi protokol XA dengan menggunakan kit alat go-xa.

Di bawah ini kami menggunakan contoh mudah untuk menunjukkan cara menggunakan protokol XA untuk melaksanakan operasi transaksi teragih. Dengan mengandaikan bahawa kami ingin melaksanakan sistem pemindahan teragih, kami perlu memastikan bahawa sebarang operasi pemindahan adalah operasi atom dan tidak akan menyebabkan ketidakkonsistenan data disebabkan oleh masa henti nod tertentu.

func transferHandler(c *gin.Context) {
    // 获取XA连接
    xa, err := xapool.GetXaResource()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "code": -1,
            "msg": "failed to get xa connection",
            "data": "",
        })
        return
    }

    // 开启XA事务
    xa.Start(xa.NewXid())

    // 执行转账操作
    // ...

    // 提交XA事务
    err = xa.End(xa.TMSUCCESS)
    if err != nil {
        xa.Rollback()
        c.JSON(http.StatusInternalServerError, gin.H{
            "code": -2,
            "msg": "failed to commit xa transaction",
            "data": "",
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "code": 0,
        "msg": "success",
        "data": "",
    })
}
Salin selepas log masuk

Dalam contoh ini, kita mula-mula mendapatkan sambungan XA melalui fungsi xapool.GetXaResource(). Kemudian kami memulakan transaksi XA melalui fungsi xa.Start() dan melaksanakan operasi pemindahan dalam transaksi. Akhir sekali, lakukan transaksi melalui fungsi xa.End(). Jika penyerahan berjaya, maklumat kejayaan akan dikembalikan terus, jika tidak, transaksi akan digulung semula melalui fungsi xa.Rollback() dan maklumat kegagalan akan dikembalikan.

Ringkasan

Dalam sistem teragih, kunci teragih dan transaksi teragih ialah dua konsep yang sangat penting. Dalam rangka kerja Gin, kami boleh menggunakan beberapa alatan untuk mengawal kunci yang diedarkan dan transaksi yang diedarkan. Dalam pembangunan sebenar, kami perlu memilih penyelesaian yang berbeza berdasarkan senario perniagaan tertentu untuk memastikan keselarasan tinggi, ketersediaan tinggi dan konsistensi data.

Atas ialah kandungan terperinci Penjelasan terperinci tentang kunci yang diedarkan dan transaksi yang diedarkan bagi rangka kerja Gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan