Go Academy · Pelajaran

Pengelolaan Koneksi

Tangani pemutusan koneksi

Pelajaran 4 dari 413 langkah

Pengelolaan Koneksi adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Koneksi Tidak Bertahan Selamanya

Klien menutup tab, kehilangan Wi-Fi, atau mengalami kerusakan. Server WebSocket yang tangguh harus mendeteksi pemutusan, membersihkan sumber daya, dan membebaskan goroutine. Jika tidak, memori dan soket akan bocor.

Jabat Tangan Penutupan

Penutupan yang bersih mengirimkan bingkai penutupan ke kedua arah. gorilla menampilkannya sebagai kesalahan dari ReadMessage dengan kode penutupan yang dapat Anda periksa.

if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
    // graceful close
}

Keepalive Ping/Pong

Untuk mendeteksi koneksi setengah terbuka (peer menghilang tanpa menutup koneksi), server secara berkala mengirimkan bingkai kontrol ping dan mengharapkan balasan pong.

conn.SetPongHandler(func(string) error {
    conn.SetReadDeadline(time.Now().Add(60 * time.Second))
    return nil
})

Tenggat Waktu Pembacaan

Tetapkan tenggat waktu pembacaan agar peer yang mati pada akhirnya menghasilkan kesalahan, bukan terblokir selamanya. Perbarui tenggat tersebut setiap kali pong tiba.

conn.SetReadDeadline(time.Now().Add(60 * time.Second))

Ticker Ping

Sebuah ticker dalam goroutine penulis mengirimkan ping secara berkala. Jika penulisan gagal, koneksi sudah mati dan Anda keluar.

ticker := time.NewTicker(54 * time.Second)
defer ticker.Stop()
for range ticker.C {
    if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
        return
    }
}

Pembersihan Saat Keluar

Ketika perulangan pembacaan atau penulisan berakhir, batalkan pendaftaran klien dan tutup koneksi. defer membuat proses ini andal bahkan saat terjadi panic.

defer func() {
    hub.unregister <- client
    conn.Close()
}()

Dua Goroutine per Koneksi

Pola standar menjalankan readPump dan writePump untuk setiap koneksi. Ketika salah satunya mendeteksi kesalahan, goroutine tersebut memicu pembersihan yang menghentikan goroutine lainnya (sering kali dengan menutup kanal send).

Tenggat Waktu Penulisan Juga

Tetapkan tenggat waktu penulisan agar penulisan yang macet tidak membuat goroutine menunggu selamanya. Penulisan yang melewati batas waktu mengembalikan kesalahan, lalu Anda membongkar koneksi tersebut.

conn.SetWriteDeadline(time.Now().Add(10 * time.Second))

Penutupan Server yang Anggun

Saat server dimatikan, kirimkan bingkai penutupan kepada setiap klien dan tunggu sebentar. Gabungkan dengan http.Server.Shutdown dan tenggat waktu context.

conn.WriteMessage(websocket.CloseMessage,
    websocket.FormatCloseMessage(websocket.CloseGoingAway, "bye"))

Menyambung Kembali pada Klien

Pemutusan koneksi adalah hal yang normal. Klien sebaiknya menerapkan logika penyambungan kembali dengan backoff eksponensial. Sisi server hanya perlu menangani setiap koneksi dan pemutusan dengan bersih.

Dapat Dijalankan: Analogi Deteksi Tenggat Waktu

Keepalive WebSocket memerlukan pustaka; program pustaka standar ini memodelkan pemeriksaan kelangsungan hidup berbasis tenggat waktu dengan timer dan kanal.

package main

import (
    "fmt"
    "time"
)

func main() {
    pong := make(chan struct{})
    go func() {
        time.Sleep(20 * time.Millisecond) // simulate a slow/absent peer
        _ = pong                          // no pong sent -> dead connection
    }()
    select {
    case <-pong:
        fmt.Println("alive")
    case <-time.After(10 * time.Millisecond):
        fmt.Println("no pong: closing dead connection")
    }
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang pengelolaan koneksi.

Rangkuman

Anda telah mempelajari pengelolaan koneksi:

  • Tangani jabat tangan penutupan dan periksa kode penutupan
  • Gunakan ping/pong serta tenggat waktu pembacaan dan penulisan untuk mendeteksi peer yang mati
  • Jalankan readPump dan writePump; lakukan pembersihan dengan defer
  • Lakukan penutupan secara anggun dengan bingkai penutupan; klien menyambung kembali dengan backoff
Gratis untuk memulai

Belajar Go dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengelolaan Koneksi” gratis?

Ya — teks lengkap “Pengelolaan Koneksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pengelolaan Koneksi”?

Tangani pemutusan koneksi Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Pengelolaan Koneksi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar WebSocket
  2. Menggunakan gorilla/websocket
  3. Menyiarkan Pesan
  4. Pengelolaan Koneksi
← Kembali ke Go Academy