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-revalidateuntuk 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).
- Setiap geotile yang disajikan CDN diinjeksi header tag H3 sel bersangkutan dan seluruh parent ID-nya.
- Saat worker selesai menulis mesh baru ke storage, worker mengirim instruksi purge API ke CDN edge hanya untuk Surrogate-Key yang relevan.
- Origin hanya menerima request komputasi ulang untuk tile yang telah selesai dibuild, mengeliminasi penyajian data parsial/robek (torn tiles).
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!