Bedah arsitektur Floci: HTTP front door JAX-RS di atas Vert.x, single port 4566, service plane in-process (bukan container-per-service), Docker socket integration, stateful storage profiles, dan translasi env LocalStack

Angka performa Floci — startup ~24 ms, idle RAM ~13 MiB — bukan kebetulan marketing; ia adalah konsekuensi langsung dari keputusan arsitekturnya. Memahami arsitektur ini penting bukan hanya untuk menghargai rekayasa-nya, tapi praktis: kalian akan tahu kenapa semua layanan berbagi satu port 4566, kenapa state bisa bertahan antar restart, dan apa yang sebenarnya terjadi ketika Floci "menjalankan" sebuah RDS instance.
Episode ini membedah empat pilar: HTTP front door, service plane in-process, storage profile, dan integrasi Docker socket.
Semua request masuk lewat satu port 4566. Di baliknya:
Authorization signature v4, X-Amz-Target) dan path (/bucket-name/key) lalu didispatch ke handler layanan yang tepat.Desain single-port ini meniru perilaku AWS modern yang juga memakai satu endpoint regional — sehingga konfigurasi klien sederhana dan tidak perlu port-per-service.
Keputusan paling membedakan dari pendekatan container-per-service: seluruh handler layanan berjalan di dalam satu proses JVM.
| Aspek | In-process (Floci) | Container-per-service |
|---|---|---|
| Startup | ~24 ms | Detik-an per container |
| RAM idle | ~13 MiB | Ratusan MiB |
| Komunikasi antar layanan | Function call langsung | Network hop |
| Debugging | Satu log stream | Log tersebar |
Konsekuensinya: ketika Lambda kalian publish pesan ke SQS, itu bukan HTTP call antar container melainkan pemanggilan internal — cepat dan deterministik, ideal untuk testing.
State emulator tidak hidup di RAM saja. Setiap mutasi (put object, put item, enqueue) melewati storage profile yang bisa dipilih saat startup — memory murni, hybrid, WAL (write-ahead log), atau persistent dengan periodic async flushing tiap 5 detik. Detail trade-off tiap mode dibahas penuh di episode 15; yang penting di sini: arsitektur memisahkan logika layanan dari strategi durability, sehingga unit test bisa super cepat sementara dev environment tetap aman saat container restart.
Floci menyediakan tabel translasi variabel environment dari LocalStack (SERVICES, DATA_DIR, dst.) ke prefix FLOCI_* (FLOCI_DEFAULT_REGION dsb.) — migrasi compose hampir drop-in, cukup swap image dan rename env. Ini keputusan adopsi yang cerdas: menghilangkan friksi terbesar pasca-sunset Community.
Karena front door mereplikasi wire format AWS persis (signature v4, content-type, error XML/JSON), SDK resmi apa pun — boto3, aws-sdk-js v3, aws-sdk-go-v2, Terraform AWS provider — bekerja tanpa patch. Rilis awal Floci bahkan membawa klaim 408/408 SDK conformance tests passing sebagai bukti komitmen ini.
Sesuai outline: bedah struktur image & proses internal floci. Jalankan image dan amati dari dalam:
docker run --rm -d --name floci-inspect -p 4566:4566 floci/floci:latest
sleep 1 # startup cuma ~24ms, tapi beri jeda aman
docker exec floci-inspect ps aux # satu proses JVM utama
docker exec floci-inspect ls /app/data # layout storage default# Tiga layanan beda, satu endpoint sama:
aws --endpoint-url=http://localhost:4566 s3 ls
aws --endpoint-url=http://localhost:4566 dynamodb list-tables
aws --endpoint-url=http://localhost:4566 sqs list-queues
docker rm -f floci-inspectPerhatikan dua hal: (1) ps aux menampilkan satu proses JVM — bukan banyak daemon; (2) ketiga command sukses tanpa konfigurasi tambahan — router JAX-RS sudah mengarahkan berdasarkan bentuk request.
Tip
Coba juga docker logs -f floci-inspect sambil menjalankan beberapa operasi. Satu log stream berisi jejak semua layanan — berguna sekali saat debugging event flow di episode lanjutan.
Rangkuman episode ini:
4566.Episode 3 kita turun ke lapangan: instalasi via docker run dan docker-compose, smoke test pertama, dan target keras — bucket S3 pertama kalian terbentuk dalam waktu kurang dari 5 menit. Sampai jumpa!