Pipeline pemrosesan geotile 3D (seperti 3D Tiles b3dm atau glTF quantized mesh) untuk visualisasi globe data publik menghadapi masalah sinkronisasi cache saat dataset masuk secara kontinu. Waktu komputasi pembentukan mesh 3D yang berat membuka celah race condition antar-worker. Dampaknya adalah double-baking beban CPU dan kemunculan stale data di CDN edge.

Arsitektur Worker Ingest dan Titik Lemah Konkurensi

Saat data spasial baru masuk, sistem memecah area terdampak menjadi indeks sel (Quadkey atau Uber H3). Setiap pembaruan memicu pekerjaan (job) regenerasi tile pada piramida Level of Detail (LoD) dari zoom tinggi ke zoom rendah.

Titik rawan konkurensi terjadi saat dua ingest job memproses geometri beririsan pada jendela waktu yang sama. Worker A membaca versi lama, sementara Worker B membaca versi baru. Jika Worker A menyelesaikan proses komputasi lebih lambat daripada Worker B, Worker A menimpa tile dengan representasi geometri usang di storage dan CDN.

Pencegahan Double-Baking: Distributed Lock Berbasis Spasial

Pencegahan duplikasi komputasi membutuhkan mekanisme locking terdistribusi menggunakan Redis. Mutex dikaitkan langsung dengan token pengenal spasial (misalnya H3 index resolusi 6 atau Quadkey) sebelum worker mengeksekusi pipeline komputasi.

import redis
import time
import uuid

redis_client = redis.Redis(host='localhost', port=6379, db=0)

class SpatialLock:
    def __init__(self, client, spatial_key, ttl_seconds=60):
        self.client = client
        self.key = f"lock:tile:{spatial_key}"
        self.ttl = ttl_seconds
        self.identifier = str(uuid.uuid4())

    def acquire(self):
        # SET NX EX menjamin operasi atomik akuisisi lock
        return self.client.set(self.key, self.identifier, nx=True, ex=self.ttl)

    def release(self):
        # Lua script menjamin release hanya jika identifier sesuai (mencegah release lock milik worker lain)
        lua_script = """
        if redis.call('get', KEYS[1]) == ARGV[1] then
            return redis.call('del', KEYS[1])
        else
            return 0
        end
        """
        return self.client.eval(lua_script, 1, self.key, self.identifier)

def process_tile_pipeline(spatial_index_id, geometry_payload):
    lock = SpatialLock(redis_client, spatial_index_id, ttl_seconds=120)
    if not lock.acquire():
        # Pipeline sedang diproses worker lain, tangguhkan job ke antrian delay
        return False

    try:
        # Komputasi berat: triangulasi, decimation mesh, export b3dm/glb
        bake_3d_tile(geometry_payload)
        return True
    finally:
        lock.release()

def bake_3d_tile(payload):
    # Dummy placeholder implementasi komputasi mesh
    pass

Hierarki Invalidation: H3/Quadkey dan Propagasi LoD

Pembaruan geometri di resolusi tinggi mempengaruhi representasi tile di tingkat hierarki atasnya (downsampling). Ketika sel H3 resolusi 9 berubah, cache seluruh parent cell (resolusi 8 hingga 0) harus ditandai usang secara deterministik.

  • Pemetaan Dependensi: Sebelum worker memulai bake, hitung set parent key dari indeks sel lokal.
  • Bust Key vs Direct Purge: Tile metadata (misal tileset.json) diperbarui menggunakan nomor versi berbasis timestamp. Binary mesh (.b3dm) menggunakan hashing konten pada URI atau invalidation eksplisit.

Strategi Cache-Aside dan TTL Dinamis

Menentukan waktu simpan (TTL) seragam untuk seluruh geotile 3D menyebabkan ketidakefisienan. Tingkat aktivitas data menentukan durasi simpan di edge:

  • High Zoom / Area Aktif: TTL pendek (misal 30–60 detik) disertai header stale-while-revalidate untuk menyerap lonjakan request saat regenerasi mesh berlangsung.
  • Low Zoom / Area Statis: TTL panjang (1–7 hari). Konten hanya di-purge secara terprogram via webhook ingest pipeline.
Cache-Control: public, max-age=60, stale-while-revalidate=300
Surrogate-Key: tile-h3-861f1d48fffffff tile-lod-8
ETag: W/"c4a8-65b12ef0"

Purge CDN Bertingkat

Melakukan invalidation secara wildcard (/*) pada CDN memicu lonjakan beban komputasi langsung ke origin storage. Solusi yang benar adalah Surrogate-Keys (Cache Tags).

  1. Setiap geotile yang disajikan CDN diinjeksi header tag H3 sel bersangkutan dan seluruh parent ID-nya.
  2. Saat worker selesai menulis mesh baru ke storage, worker mengirim instruksi purge API ke CDN edge hanya untuk Surrogate-Key yang relevan.
  3. Origin hanya menerima request komputasi ulang untuk tile yang telah selesai dibuild, mengeliminasi penyajian data parsial/robek (torn tiles).