Kembali ke Blog

Cloudflare Workers KV Instant: Runbook untuk Pembacaan Konfigurasi Game 1.62ms

Diterbitkan pada 2 Oktober 2026
Cloudflare Workers KV Instant: Runbook untuk Pembacaan Konfigurasi Game 1.62ms Dibuat dengan bantuan AI

Ringkasnya

Pelajari cara Cloudflare Workers KV Instant memangkas pembacaan konfigurasi game hingga 1,62 ms p99 dan replikasi tulis 256 ms di 300+ edge.

Ketika tim live-ops Anda mendorong pembaruan konfigurasi kritis — perbaikan eksploitasi ekonomi yang rusak, perubahan jadwal acara darurat, penanda jendela pemeliharaan — pemain di sisi lain planet tidak seharusnya membaca data basi selama 4,38 detik. Itu adalah waktu replikasi tulis p99 untuk Cloudflare Workers KV klasik. Untuk halaman pemasaran statis, siapa peduli. Untuk game live yang mempertaruhkan uang sungguhan atau integritas kompetitif, celah propagasi itu adalah liabilitas.

Cloudflare baru saja mengumumkan Workers KV Instant, mode baru untuk Workers KV yang didukung oleh store internal Quicksilver v2 mereka. API get(), put(), list(), delete() yang sama dan familier. Mesin yang sepenuhnya berbeda di dalamnya — mesin yang sama yang menangani pencarian konfigurasi untuk setiap permintaan di seluruh jaringan global Cloudflare. Hasilnya: pembacaan p99 1,62 ms dan replikasi tulis p99 256 ms ke 300+ lokasi edge.

Runbook ini mencakup apa yang sebenarnya berubah, cara mendeteksi apakah game Anda mengalami mode kegagalan konfigurasi basi, implementasi langkah demi langkah untuk konfigurasi game yang di-host di edge, batas keras yang membuat KV Instant tidak cocok untuk sebagian beban kerja, dan di mana layanan konfigurasi jarak jauh terkelola lebih masuk akal daripada membangun ini sendiri.

Apa yang Sebenarnya Berubah: KV Instant vs KV Classic

Workers KV Classic konsisten secara eventual. Anda menulis sebuah kunci, dan Cloudflare mereplikasinya ke lokasi edge mereka secara asinkron. Selama jendela itu, pembaca bisa mendapatkan nilai basi. Model konsistensinya adalah "last-write-wins dengan invalidasi cache berbasis TTL." Itu berfungsi untuk aset statis dan preferensi pengguna — data yang jarang ditulis dan dapat mentolerir keterlambatan beberapa detik.

KV Instant menggunakan Quicksilver v2, yaitu store internal yang Cloudflare bangun untuk distribusi konfigurasi mereka sendiri. Setiap permintaan Cloudflare sudah menyentuh Quicksilver — untuk aturan routing, konfigurasi firewall, ambang batas rate limiting. Ia sudah teruji di medan perang pada skala yang tidak akan pernah didekati sebagian besar backend game.

Berikut perbandingan performa konkretnya:

Metrik KV Instant KV Classic
p99 pembacaan (semua) 1.62 ms 287 ms
p99 replikasi tulis 256 ms 4,380 ms
Median replikasi tulis 107 ms < 1 s (bukan presisi sub-detik)

Itu adalah peningkatan latensi baca 177× dan peningkatan replikasi tulis 17×. Angka-angka ini berasal dari benchmarking Cloudflare sendiri di semua 300+ lokasi edge.

Untuk backend game, implikasinya langsung: Anda dapat membaca konfigurasi di setiap permintaan pemain — saat login, saat mulai pertandingan, saat mengambil inventaris, saat membuka toko — dan biaya baca di bawah 2 ms bahkan di p99. Tidak ada TTL yang harus ditunggu. Tidak ada jendela koherensi cache di mana Pemain A melihat perbaikan eksploitasi dan Pemain B tidak.

Runbook: Mendeteksi Kegagalan Konfigurasi Basi di Game Anda

Sebelum memigrasikan apa pun, Anda perlu tahu apakah Anda memiliki masalah ini. Berikut mode kegagalannya, cara mendeteksinya, dan biayanya bagi Anda.

Mode Kegagalan 1: Pembacaan Basi yang Kedaluwarsa TTL

Yang rusak: Store konfigurasi Anda menggunakan caching berbasis TTL. Sebuah feature flag diperbarui, tetapi pemain di Tokyo masih membaca nilai lama selama 30–60 detik hingga cache edge kedaluwarsa.

Cara mendeteksinya:

  • Catat hash versi konfigurasi yang dikembalikan ke setiap klien beserta stempel waktu tulis saat konfigurasi terakhir diperbarui.
  • Kueri untuk klien yang menerima versi konfigurasi yang lebih lama dari 2 detik setelah penulisan.
  • Bangun dasbor: count of (stale_reads) / count (total_reads). Angka di atas 0% selama push konfigurasi adalah jendela pembacaan basi.

Pola kueri diagnostik cepat (sesuaikan dengan stack logging Anda):

SELECT
  received_config_version,
  expected_config_version,
  COUNT(*) AS stale_count,
  MAX(received_at - config_updated_at) AS max_staleness
FROM config_read_log
WHERE config_updated_at > NOW() - INTERVAL '1 hour'
  AND received_config_version != expected_config_version
GROUP BY received_config_version, expected_config_version
ORDER BY max_staleness DESC;

Biayanya bagi Anda: Pemain dalam jendela basi mengalami state game yang berbeda. Dalam game kompetitif, satu pemain melihat eksploitasi telah ditambal, yang lain tidak. Dalam game berbasis acara, sebagian pemain melewatkan jendela waktu terbatas sepenuhnya. Ini adalah masalah kepercayaan.

Mode Kegagalan 2: Pembacaan Konfigurasi di Hot Path Menyebabkan Lonjakan Latensi

Yang rusak: Latensi baca store konfigurasi Anda cukup tinggi (100–300 ms) sehingga Anda tidak bisa membacanya di setiap permintaan. Sebagai gantinya, Anda meng-cache-nya di sisi klien atau di cache lokal yang cepat tetapi basi. Cache tersebut benar 99% dari waktu, tetapi ketika salah, sangat salah.

Cara mendeteksinya:

  • Ukur latensi p50, p95, dan p99 dari panggilan baca konfigurasi Anda. Jika p99 di atas 50 ms, itu terlalu lambat untuk pemeriksaan per-permintaan.
  • Lacak cache hit rate. Jika Anda meng-cache konfigurasi di sisi klien untuk menghindari menyentuh store, Anda sudah menerima kebasian sebagai trade-off.
  • Pantau insiden di mana nilai konfigurasi buruk bertahan setelah push — telusuri kembali ke TTL cache per-klien.

Biayanya bagi Anda: Anda merekayasa solusi di sekitar masalah latensi yang justru menimbulkan masalah kebasian. Dua masalah sekaligus.

Mode Kegagalan 3: Amplifikasi Tulis di Bawah Tekanan Insiden

Yang rusak: Anda perlu mendorong pembaruan konfigurasi darurat — menonaktifkan fitur, mengaktifkan mode pemeliharaan, menandai ekonomi yang rusak — dan penulisan lambat atau dibatasi rate. Classic Workers KV mengizinkan satu penulisan per kunci per detik, dan replikasi membutuhkan waktu beberapa detik.

Cara mendeteksinya:

  • Lacak latensi tulis-ke-terlihat selama respons insiden. Jika tim ops Anda mengandalkan "konfigurasi akan menyebar dalam beberapa detik" dan ternyata butuh 10+ detik, store konfigurasi Anda adalah hambatan insiden.
  • Pantau kegagalan penulisan dan respons rate-limit 429 selama push dengan urgensi tinggi.

Jika Anda mengalami ketiga mode kegagalan ini, KV Instant layak dievaluasi.

Mengimplementasikan KV Instant untuk Konfigurasi Game: Langkah demi Langkah

KV Instant saat ini dalam private beta. Anda dapat mendaftar di formulir beta Cloudflare. Implementasinya mudah karena API-nya identik dengan Workers KV klasik — hanya pembuatan namespace yang berbeda.

Langkah 1: Buat Namespace KV Instant

Berikan atribut mode: "instant" saat membuat namespace Anda:

wrangler kv namespace create "GAME_CONFIG" --mode instant

Ini menghasilkan binding namespace. Perbarui wrangler.toml Anda:

[[kv_namespaces]]
binding = "GAME_CONFIG"
id = "&lt;your-namespace-id>"

Langkah 2: Tulis Konfigurasi Game Anda

Namespace KV Instant dibatasi hingga 10.000 pasangan kunci-nilai dengan total ukuran namespace 1 MB. Setiap kunci dapat mencapai 300 byte. Ini kecil — memang disengaja. Ini dirancang untuk flag dan pengaturan konfigurasi, bukan data pemain.

Strukturkan kunci Anda untuk lapisan konfigurasi game Anda:

// In a Cloudflare Worker that manages config
async function updateGameConfig(env) {
  const config = {
    maintenanceMode: false,
    maintenanceMessage: "Servers are updating. Back in 5 min.",
    eventSchedule: {
      currentEvent: "summer_showdown_2025",
      startTime: "2025-07-15T18:00:00Z",
      endTime: "2025-07-22T18:00:00Z",
    },
    economyTuning: {
      xpMultiplier: 1.5,
      goldDropRate: 0.85,
      shopRefreshHours: 6,
    },
    featureFlags: {
      newMatchmaking: true,
      rankedModeV2: false,
      socialLobby: true,
    },
    buildVersion: {
      minimumClient: "1.4.2",
      forceUpdate: false,
    },
  };

  await env.GAME_CONFIG.put("active_config", JSON.stringify(config));
  // Propagates to 300+ edge locations in ~256ms at p99
}

Batas frekuensi tulis: Satu penulisan per namespace per detik. Ini adalah batasan desain, bukan bug — ini membuat urutan pembaruan menjadi deterministik. Untuk konfigurasi yang berubah beberapa kali per jam (atau per insiden), ini bukan hambatan.

Langkah 3: Sajikan Konfigurasi dari Edge

Bangun Cloudflare Worker yang membaca konfigurasi di setiap permintaan dan menyajikannya ke klien game Anda:

export default {
  async fetch(request, env, ctx) {
    // Every player request reads fresh config — 1.62ms p99
    const raw = await env.GAME_CONFIG.get("active_config");
    if (!raw) {
      return new Response(JSON.stringify({ error: "config_missing" }), {
        status: 503,
        headers: { "Content-Type": "application/json" },
      });
    }

    const config = JSON.parse(raw);

    // Conditional logic at the edge — maintenance mode check
    if (config.maintenanceMode) {
      return new Response(
        JSON.stringify({
          status: "maintenance",
          message: config.maintenanceMessage,
        }),
        {
          status: 503,
          headers: { "Content-Type": "application/json" },
        }
      );
    }

    // Return relevant config slice for the client
    const clientConfig = {
      event: config.eventSchedule,
      economy: config.economyTuning,
      features: config.featureFlags,
      build: config.buildVersion,
    };

    return new Response(JSON.stringify(clientConfig), {
      headers: {
        "Content-Type": "application/json",
        "Cache-Control": "public, max-age=5", // Short cache for freshness
      },
    });
  },
};

Langkah 4: Konsumsi Konfigurasi di Klien Game Anda

Di sisi klien, ambil konfigurasi saat inisialisasi atau awal sesi. Berikut contoh GDScript untuk game Godot:

extends Node

var config_url: String = "https://config.yourgame.com/api/config"
var current_config: Dictionary = {}

func _ready():
    fetch_config()

func fetch_config():
    var http = HTTPRequest.new()
    add_child(http)
    http.request_completed.connect(_on_config_received)
    http.request(config_url)

func _on_config_received(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray):
    if response_code != 200:
        push_warning("Config fetch failed: %d" % response_code)
        return

    var json = JSON.new()
    var parse_result = json.parse(body.get_string_from_utf8())
    if parse_result != OK:
        push_warning("Config parse error")
        return

    current_config = json.data
    _apply_config(current_config)

func _apply_config(config: Dictionary):
    # Apply feature flags
    if config.has("features"):
        if config["features"].get("rankedModeV2", false):
            enable_ranked_mode()
        if config["features"].get("newMatchmaking", false):
            enable_new_matchmaking()

    # Check build version
    if config.has("build"):
        var min_version = config["build"].get("minimumClient", "0.0.0")
        if version_compare(get_app_version(), min_version) &lt; 0 and config["build"].get("forceUpdate", false):
            show_force_update_screen()

    # Apply economy tuning
    if config.has("economy"):
        EconomyManager.set_xp_multiplier(config["economy"].get("xpMultiplier", 1.0))
        EconomyManager.set_gold_drop_rate(config["economy"].get("goldDropRate", 1.0))

    print("Config applied successfully — all players now on same state")

Karena pembacaan di bawah 2 ms dan tidak ada kebasian TTL, Anda dapat memanggil fetch_config() di setiap awal sesi, di setiap entri antrean pertandingan, atau di setiap aksi klien yang signifikan tanpa khawatir tentang overhead latensi atau koherensi cache.

Apa yang Tidak Bisa Dilakukan KV Instant (Batas Keras)

KV Instant sangat kuat untuk niche-nya, tetapi batasannya nyata. Evaluasi ini sebelum Anda berkomitmen pada implementasi:

Ukuran total namespace 1 MB. Anda tidak dapat menyimpan data pemain, snapshot papan peringkat, inventaris, atau apa pun yang bertambah seiring jumlah pemain. Ini murni untuk konfigurasi dan flag yang berlaku secara global.

Maksimal 10.000 pasangan kunci-nilai. Cukup untuk ratusan feature flag dan objek konfigurasi. Tidak cukup untuk apa pun yang bersifat per-pemain.

Satu penulisan per namespace per detik. Jika Anda membutuhkan frekuensi tulis sub-detik, ini bukan store Anda. Untuk konfigurasi game yang diperbarui setiap jam atau saat insiden, ini baik-baik saja. Untuk sinkronisasi state game real-time, cari di tempat lain.

Tidak ada dukungan metadata. getWithMetadata mengembalikan null. Anda tidak dapat melampirkan metadata kustom ke kunci. Jika Anda bergantung pada metadata untuk versioning atau penandaan, Anda perlu menyematkannya di dalam nilai itu sendiri.

Tidak ada paginasi pada list. Setiap panggilan list mengembalikan semua kunci yang cocok di namespace. Untuk 10.000 kunci, itu respons yang besar. Berhati-hatilah dalam penamaan kunci dan prefiks untuk membatasi cakupan panggilan list Anda.

Asimetri biaya. Penyimpanan $100/MB/bulan (vs $0,50/GB/bulan untuk Classic). Operasi tulis Kelas A $0,10 per operasi (vs $5,00 per juta untuk Classic). Angka-angka ini sangat mahal untuk beban kerja tulis tinggi. Tetapi pembacaan $0,20 per juta — 60% lebih murah daripada Classic. Model harga ini sangat condong ke arah "jarang menulis, sering membaca," yang persis pola konfigurasi game.

Praktik Terbaik untuk Konfigurasi Game di KV Instant

  1. Beri namespace pada kunci Anda dengan niat. Gunakan prefiks seperti ff_ untuk feature flag, econ_ untuk tuning ekonomi, evt_ untuk jadwal acara. Ini membuat panggilan list mudah dipindai dan memungkinkan Anda membangun UI manajemen konfigurasi yang memanipulasi kategori tertentu tanpa membaca seluruh namespace.

  2. Sematkan hash versi di dalam nilai Anda. Karena metadata tidak didukung, sertakan bidang configVersion di dalam setiap nilai konfigurasi. Klien Anda dapat melaporkan versi ini di log dan analitik, memberi Anda dasbor verifikasi propagasi real-time.

  3. Pisahkan konfigurasi dari state. KV Instant menyimpan konfigurasi — aturan, flag, kenop tuning, jadwal. Ia tidak menyimpan state — inventaris pemain, hasil pertandingan, peringkat papan peringkat. Arsitekturi keduanya sebagai dua sistem terpisah dengan backend penyimpanan terpisah. Jika namespace "config" Anda bertambah lebih dari beberapa KB per minggu, simpan data itu di tempat lain.

  4. Tangani kasus 503. Jika GAME_CONFIG.get() mengembalikan null, worker Anda harus gagal dengan anggun. Kembalikan mode pemeliharaan atau kill switch. Kunci konfigurasi yang hilang tidak boleh membuat klien game Anda crash. Bangun fallback di edge worker, bukan di klien.

  5. Uji urutan penulisan di bawah tekanan. Satu penulisan per detik per namespace berarti penulisan bersamaan akan diserialkan. Jika dua engineer mendorong perubahan konfigurasi dalam detik yang sama, yang terakhir menang. Bangun antrean perubahan konfigurasi dengan urutan eksplisit daripada mengandalkan penulisan bersamaan.

Kapan Menggunakan Layanan Konfigurasi Terkelola Sebagai Gantinya

Membangun pipeline distribusi konfigurasi di KV Instant adalah keputusan rekayasa yang solid jika tim Anda memiliki kapasitas untuk memiliki edge worker, UI manajemen konfigurasi, skema versioning, logika fetch sisi klien, dan prosedur respons insiden di sekitarnya. Itu adalah pekerjaan infrastruktur nyata — tidak sulit secara individual, tetapi bertambah sepanjang timeline rilis Anda.

Untuk tim yang menginginkan distribusi konfigurasi tanpa mengoperasikan plumbing-nya, horizOn menyediakan Remote Configuration sebagai layanan terkelola. Anda menentukan feature flag, pengaturan game, dan parameter tuning melalui dasbor atau API, dan platform menangani distribusi ke klien game Anda. Tidak ada edge worker yang perlu ditulis atau dipelihara, tidak ada batasan ukuran namespace KV yang perlu dipertimbangkan — tetapi juga kontrol yang lebih sedikit atas mesin replikasi dan profil latensi yang mendasarinya.

Trade-off-nya adalah sumbu klasik build-vs-buy. KV Instant memberi Anda performa mentah di edge dengan kontrol penuh. Layanan terkelola memberi Anda waktu integrasi lebih cepat dan area permukaan operasional yang lebih kecil. Pilih berdasarkan apakah distribusi konfigurasi adalah kompetensi inti studio Anda atau sekadar overhead infrastruktur.

Jika Anda perlu mendeteksi kebasian konfigurasi di seluruh klien game terdistribusi, pola logging dan kueri di bagian runbook di atas tetap berfungsi apa pun backend konfigurasi yang Anda pilih. Lapisan diagnostik tidak bergantung pada transport.

Ringkasan: Pembacaan Konfigurasi yang Mengimbangi Game Anda

KV Instant adalah peningkatan yang berarti untuk pola spesifik "data konfigurasi kecil, kritis, dan dibaca secara global." Untuk backend game, pola itu langsung memetakan ke feature flag, tuning ekonomi, jadwal acara, sakelar pemeliharaan, dan gerbang versi build.

Angka-angka ini bukan pembulatan pemasaran: pembacaan p99 1,62 ms dan replikasi tulis p99 256 ms di 300+ lokasi edge. API-nya identik dengan Workers KV klasik. Batasannya (1 MB, 10.000 kunci, 1 tulis/detik) terdefinisi dengan baik dan sesuai untuk use case ini.

Jika game Anda saat ini membaca konfigurasi dari store terpusat dan meng-cache-nya di sisi klien untuk menghindari latensi, evaluasi apakah jendela kebasian itu masih dapat diterima. Untuk game kompetitif dan judul live-service dengan tuning ekonomi real-time, jawabannya semakin sering tidak.

Daftar untuk private beta KV Instant, buat namespace uji dengan konfigurasi paling sensitif terhadap latensi, dan ukur ruang propagasi yang Anda dapatkan. Jika angkanya sesuai dengan yang dilaporkan Cloudflare, Anda memiliki jalur yang jelas untuk menghilangkan satu kelas insiden konfigurasi basi sepenuhnya.

Perlu pandangan kedua untuk arsitektur konfigurasi atau topologi backend Anda? Lihat dokumentasi horizOn — platform ini menangani distribusi konfigurasi, pelaporan crash, dan manajemen sesi pemain sehingga Anda dapat fokus merilis gameplay daripada runbook infrastruktur.


Sumber: Memperkenalkan Workers KV Instant — didukung oleh Quicksilver