
Eco²
Backend · Cloud infrastructure
Panduan daur ulang dari satu foto dan percakapan.
Asisten AI serba ada yang memahami cara kerja daur ulang di Korea.
Eco² vocabulary
- edge
- auth offload
- domain api
- task queue
- scan pipeline
- chat agent
- event bus
- cluster
- gitops
- autoscaling
- observability
- load test
- evaluation
Edge: ROUTE 53 · ALB · HTTPS 443 · internet-facing · external-dns · istio-ingressgateway · NodePort · eco2-gateway · VirtualService · x-canary · AuthorizationPolicy · ENVOY SIDECAR · kiali-serverAuth Offload: AuthorizationPolicy · action: CUSTOM · notPaths · envoyExtAuthzGrpc · failOpen: false · CheckRequest · x-user-id · BlacklistCache · BootstrapFromRedis · outbox:blacklist · blacklist.events · UsersServiceDomain API: VirtualService · x-user-id · /api/v1/scan · X-Idempotency-Key · job_id · stream_url · 202 ACCEPTED · Retry-After · ScanTask · UsersService · ImageService · ENVOY SIDECARTask Queue: outbox:blacklist · blacklist.events · RabbitmqCluster · scan.direct · reward.events · dlx · x-dead-letter-exchange · chat.process · AioPikaBroker · task_acks_late · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · QueueLength · inspect ping · QUEUE SATURATIONScan Pipeline: ScanTask · scan.direct · reward.events · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · RewardStep · item_class_list.yaml · situation_tags.yaml · LITE RAG · JsonRegulationRetriever · PipelineStage · waste_rag · XADD · domain: worker-ai · pipeline_duration · vision_stage_durationChat Agent: ImageService · chat.process · AioPikaBroker · create_chat_graph · route_by_intent · MULTI-INTENT FANOUT · waste_rag · recyclable_price · collection_point · image_generation · aggregator · thread_id · SyncableRedisSaver · AsyncPostgresSaver · LANGSMITH_TRACING · regenerateEvent Bus: job_id · stream_url · PipelineStage · XADD · scan:events:{shard} · XREADGROUP · XACK · XAUTOCLAIM · PendingReclaimer · STATE KV · scan:state:{job_id} · sse:events:{shard} · SSEBroadcastManager · Last-Event-ID · scan_sse_connections_active · ServiceMonitor · traceparentCluster: NodePort · kubeadm init · kubeadm join · vxlanMode · BGPConfiguration · module "vpc" · worker_ai · nodeSelector · domain: worker-ai · NoSchedule · 24-NODE CLUSTERGitOps: external-dns · x-canary · dev-root · ApplicationSet · sync-wave · selfHeal · ignoreDifferences · argocd-image-updater · update-strategy: digest · write-back-method · targetRevision · ci-services.ymlAutoscaling: ignoreDifferences · ScaledObject · QueueLength · cooldownPeriod · pollingInterval · fallback · maxReplicaCount · stabilizationWindowSeconds · HorizontalPodAutoscaler · scan_sse_connections_active · prometheus-adapterObservability: 24-NODE CLUSTER · prometheus-adapter · FLUENT BIT · Elasticsearch · Kibana · kube-prometheus-stack · AlertmanagerConfig · ServiceMonitor · JAEGER · OPENTELEMETRY · traceparent · kiali-server · LANGSMITH_TRACINGLoad Test: k6 · ramping-vus · thresholds · pipeline_duration · vision_stage_duration · poll_timeout · inspect ping · WORKER RESTART · POLLING TIMEOUT · QUEUE SATURATIONEvaluation: EvalConfig · eval_mode · eval_sample_rate · eval_cost_budget_daily_usd · EvalResult · EvalGrade · code_grader · llm_grader · CUSUM · regenerate · OpenAIBARSEvaluator
Bagaimana 24 node benar-benar terhubung, satu alur demi satu alur.
Kubernetes yang dikelola sendiri, dibangun dengan kubeadm. Peta menempatkan 24 node fisik dan workload di atasnya di dalam lima lapisan README, lalu menghubungkannya dengan koneksi yang sebenarnya. Pilih satu alur dan hanya jalur itu yang disorot, dengan langkah bernomor.
Asisten ini mengenali sampah dari foto dan menjelaskan cara membuangnya, dan dalam percakapan memanggil alat untuk lokasi, cuaca, harga barang daur ulang, dan pencarian web, serta membuat gambar. Dalam proyek tim ini saya memulai dari fondasi klaster dan deployment, lalu memperluas cakupan ke backend domain, pemrosesan asinkron, agen percakapan, dan verifikasi.
Dari pengembangan kompetisi hingga penguatan backend dan operasi
Layanan telah selesai beroperasi; video demo yang direkam dan laporan teknis memperlihatkan cara kerjanya.
Permintaan Scan → pengiriman langsung
Permintaan analisis foto menjadi pekerjaan dalam antrean, dan event progresnya kembali ke browser yang sama.
Browserpencarian DNS: Pencarian DNSRoute 53
Hanya nama yang di-resolve dari record Route 53. Permintaan tidak melewati DNS.
Browseraliran data: HTTPS 443AWS ALB
TLS berakhir di ALB.
AWS ALBaliran data: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayDiteruskan ke Istio ingress Envoy melalui NodePort target instance EC2.
Istio ingress Envoy
k8s-ingress-gatewayaliran data: VirtualServiceScan APIk8s-api-scanDirutekan ke Scan API, yang memasukkan pekerjaan ke antrean dan langsung mengembalikan job_id; polling hasil dijawab 202 sampai job selesai.
Scan API
k8s-api-scanaliran data: Tugas CeleryRabbitMQk8s-rabbitmqTugas Scan masuk ke RabbitMQ.
RabbitMQ
k8s-rabbitmqaliran data: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) di pool AI mengambilnya dan menjalankan Vision → Rule → Answer → Reward. Keempat tahap adalah Celery task yang dirangkai, bukan node.
Pool AI
k8s-worker-ai · k8s-worker-ai-2aliran data: HTTPSLLM APIWorker scan dan chat memanggil API OpenAI dan Google.
scan-worker
k8s-worker-ai · k8s-worker-ai-2aliran data: XADD scan:eventsStreamsk8s-redis-streamsEvent progres ditulis ke salah satu dari empat shard Streams.
Streams
k8s-redis-streamsaliran data: XREADGROUPEvent Routerk8s-event-routerEvent Router membacanya sebagai consumer group dan melakukan XACK setelah diproses; pending dan reclaim menjaga pengiriman at-least-once.
Event Router
k8s-event-routeraliran data: SETEX stateState KVk8s-redis-streamsRouter menulis status terbaru dan penanda pemrosesan ganda ke State KV di node Redis yang sama.
Event Router
k8s-event-routeraliran data: PUBLISHPub/Subk8s-redis-pubsubDikirim secara real-time di kanal job tersebut dalam shard Pub/Sub.
Pub/Sub
k8s-redis-pubsubaliran data: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway berlangganan melalui satu listener bersama per proses dan menyebarkannya ke setiap browser yang terhubung.
SSE Gateway
k8s-sse-gatewayaliran data: Stream SSEBrowserKoneksi yang dibuka melalui jalur ALB dan ingress yang sama. Pengiriman bersifat at-least-once; duplikat ditangani secara idempoten.
State KV
k8s-redis-streamsaliran data: Pemulihan saat tersambung ulangSSE Gatewayk8s-sse-gatewaySaat tersambung ulang dengan Last-Event-ID, State KV dan Streams yang disimpan mengisi event yang terlewat.
Chat · token dan penyimpanan
Token Chat mengambil jalur event yang sama dengan Scan; checkpoint dan pesan disimpan oleh dua workload yang berbeda.
Browseraliran data: HTTPS 443AWS ALB
TLS berakhir di ALB.
AWS ALBaliran data: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayDiteruskan ke Istio ingress Envoy melalui NodePort target instance EC2.
Istio ingress Envoy
k8s-ingress-gatewayaliran data: VirtualServiceChat APIk8s-api-chatDirutekan ke Chat API.
Chat API
k8s-api-chataliran data: Tugas TaskiqRabbitMQk8s-rabbitmqTugas Chat masuk ke RabbitMQ.
RabbitMQ
k8s-rabbitmqaliran data: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) mengklasifikasikan maksud dengan LangGraph, lalu menjalankan vision bila perlu, alat yang dipilih, aggregator, dan ringkasan bila perlu, kemudian menjawab. Setiap permintaan hanya menjalankan cabang yang dibutuhkannya.
Pool AI
k8s-worker-ai · k8s-worker-ai-2aliran data: HTTPSLLM APIWorker scan dan chat memanggil API OpenAI dan Google.
chat-worker
k8s-worker-ai · k8s-worker-ai-2aliran data: XADD chat:eventsStreamsk8s-redis-streamsToken dan event tahap ditulis ke empat shard Streams; dari situ jalur pengirimannya sama dengan Scan.
Streams
k8s-redis-streamsaliran data: XREADGROUPEvent Routerk8s-event-routerEvent Router membacanya sebagai consumer group dan melakukan XACK setelah diproses; pending dan reclaim menjaga pengiriman at-least-once.
Event Router
k8s-event-routeraliran data: PUBLISHPub/Subk8s-redis-pubsubDikirim secara real-time di kanal job tersebut dalam shard Pub/Sub.
Pub/Sub
k8s-redis-pubsubaliran data: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway berlangganan melalui satu listener bersama per proses dan menyebarkannya ke setiap browser yang terhubung.
SSE Gateway
k8s-sse-gatewayaliran data: Stream SSEBrowserKoneksi yang dibuka melalui jalur ALB dan ingress yang sama. Pengiriman bersifat at-least-once; duplikat ditangani secara idempoten.
chat-worker
k8s-worker-ai · k8s-worker-ai-2aliran data: checkpointCachek8s-redis-cacheCheckpoint LangGraph disimpan di Redis Cache.
Cache
k8s-redis-cachealiran data: baca checkpointcheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer membaca checkpoint dari Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2aliran data: sinkronkan ke PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver menyimpannya di PostgreSQL secara asinkron.
Streams
k8s-redis-streamsaliran data: chat-persistence grouppersistence consumerk8s-api-chatPersistence consumer di node Chat membaca event done sebagai consumer group.
persistence consumer
k8s-api-chataliran data: simpan pesanPostgreSQLk8s-postgresqlPesan Chat disimpan ke PostgreSQL. Ini workload yang berbeda dari checkpoint-syncer.
Masuk · autentikasi
Jalur sinkron dari titik masuk klaster ke domain API. Hanya jalur yang dijaga kebijakan yang memeriksa autentikasi lebih dahulu; lalu lintas pod antar-node berjalan di atas Calico VXLAN.
Browserpencarian DNS: Pencarian DNSRoute 53
Hanya nama yang di-resolve dari record Route 53. Permintaan tidak melewati DNS.
Browseraliran data: HTTPS 443AWS ALB
TLS berakhir di ALB.
AWS ALBaliran data: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayDiteruskan ke Istio ingress Envoy melalui NodePort target instance EC2.
Istio ingress Envoy
k8s-ingress-gatewayaliran data: ext-authz · gRPC 50051ext-authzk8s-api-authHanya jalur di bawah kebijakan CUSTOM yang lebih dahulu bertanya ke Go ext-authz (timeout 2 s, failOpen false). Jalur seperti login, health, dan docs dikecualikan.
ext-authz
k8s-api-authaliran data: cek blacklistblacklistk8s-redis-authToken diperiksa terhadap blacklist Redis.
Istio ingress Envoy
k8s-ingress-gatewayaliran data: VirtualServiceChat APIk8s-api-chatDirutekan ke Chat API.
Chat API
k8s-api-chataliran data: gRPCimages APIk8s-api-imagePanggilan sinkron chat → images yang disebut di README.
auth API
k8s-api-authaliran data: gRPCusers APIk8s-api-usersPanggilan sinkron auth → users yang disebut di README.
Pool storage · penulisan asinkron
Blacklist autentikasi dan kepemilikan karakter disimpan oleh worker pool storage yang mengambil pekerjaannya dari RabbitMQ.
blacklist
k8s-redis-authaliran data: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus di README) membaca outbox Redis.
auth-relay
k8s-worker-storage · k8s-worker-storage-2aliran data: blacklist.eventsRabbitMQk8s-rabbitmqRelay menerbitkan ulang ke RabbitMQ, dengan percobaan ulang dan DLQ.
RabbitMQ
k8s-rabbitmqaliran data: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker menerima event blacklist.
auth-worker
k8s-worker-storage · k8s-worker-storage-2aliran data: simpan blacklistblacklistk8s-redis-authEvent disimpan di blacklist Redis.
RabbitMQ
k8s-rabbitmqaliran data: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker menerima pekerjaan kepemilikan karakter secara batch.
users-worker
k8s-worker-storage · k8s-worker-storage-2aliran data: UPSERTPostgreSQLk8s-postgresqlDiterapkan ke PostgreSQL.
Konfigurasi · skala · observasi
Platform Layer bukan langkah yang dilalui permintaan; lapisan ini men-deploy, mengonfigurasi, menskalakan, dan mengamati lapisan lain. Node-nya adalah instance EC2 yang dibuat dengan Terraform, dengan kubeadm dan Calico dipasang oleh Ansible; CI hanya memvalidasi Terraform dan tidak pernah menerapkannya secara otomatis.
GitHub Actions · Docker Hubkonfigurasi · penskalaan: image · revisi manifestArgo CD image updater
k8s-masterArgo CD menyelaraskan konfigurasi klaster melalui App-of-Apps dan Sync Waves. Hanya penempatan control-plane milik image updater yang dikonfirmasi.
ALB Controller · ExternalDNS
k8s-masterkonfigurasi · penskalaan: Ingress → ALB · record DNSDikelola AWSALB Controller dan ExternalDNS mengonfigurasi sumber daya di sisi AWS. Ini bukan jalur yang dilalui permintaan.
Istiod
k8s-masterkonfigurasi · penskalaan: konfigurasi xDSIstio ingress Envoyk8s-ingress-gatewayIstiod mendorong konfigurasi Gateway, VirtualService, dan EnvoyFilter melalui xDS ke ingress Envoy dan ke Envoy sidecar setiap API.
KEDA
k8s-monitoringkonfigurasi · penskalaan: jumlah podPool AIk8s-worker-ai · k8s-worker-ai-2KEDA menyesuaikan jumlah pod worker. Jumlah node tidak berubah.
KEDA
k8s-monitoringkonfigurasi · penskalaan: jumlah podPool storagek8s-worker-storage · k8s-worker-storage-2Pod worker pool storage diskalakan dengan cara yang sama.
Fluent Bitobservabilitas: logElasticsearch
k8s-loggingFluent Bit adalah DaemonSet di setiap node dan mengirim log ke Elasticsearch.
Pool AI
k8s-worker-ai · k8s-worker-ai-2observabilitas: Penelusuran eksekusi LLMLangSmithTrace panggilan LLM dikirim ke LangSmith, SaaS eksternal.
Setiap koneksi dengan bobot yang sama. Pilih alur untuk menyorot hanya jalurnya, dengan langkah bernomor.
- Garis utuh · arah aliran permintaan, pekerjaan, event, dan penulisan
- Garis titik · pencarian DNS; permintaan tidak melewatinya
- Garis putus · konfigurasi atau penskalaan; bukan jalur data
- Garis titik-strip panjang · log dan pelacakan eksekusi
- Garis hitam tebal · alur yang dipilih; angka menunjukkan urutan
- Kotak · node fisik, nama host di bagian kepala
- Chip dalam · workload yang berjalan di node itu
- Bingkai putus · pool penjadwalan dua node
- Kotak putus · di luar klaster, tidak dihitung sebagai node
- Garis tepi oranye · tempat model memutuskan
- Control plane1 node
- Domain API8 node
- Pool AI2 node
- Pool storage2 node
- Data5 node
- Platform6 node
Lima lapisan README (pita) dan kelompok fisik (warna kepala setiap node) mengelompokkan 24 node yang sama secara berbeda. State KV berbagi node dengan Streams dan tidak dihitung terpisah; Route 53, ALB, dan layanan di luar klaster bukan node. Pool adalah rentang penjadwalan, bukan klaim bahwa setiap pod berjalan di kedua node.
24node
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd, ditambah controller platform.
- k8s-master
8Domain API
domain: <layanan>Satu node per domain. Panggilan internal memakai gRPC.
- k8s-api-auth
- k8s-api-users
- k8s-api-scan
- k8s-api-character
- k8s-api-location
- k8s-api-image
- k8s-api-chat
- k8s-api-info
4Execution worker
Dua pool penjadwalan masing-masing dua node. KEDA mengubah jumlah pod; jumlah node tetap.
Pool storage
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
Pool AI
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis dibagi ke empat node sesuai keperluan. Penyimpanan PostgreSQL adalah EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Perpesanan, observabilitas, jalur masuk, dan pengiriman real-time masing-masing memiliki node sendiri.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Setiap node
- Fluent Bit · DaemonSet
- Calico
Model yang dikonfigurasi · per penyedia
Layanan sudah ditutup, jadi ini adalah model yang dikonfigurasi di repositori, bukan pilihan yang tersedia hari ini. Setiap peran dicantumkan terpisah; ini bukan daftar eksekusi yang terverifikasi.
OpenAI
Penyedia bawaan Chat
Chat
openai/gpt-5.2bawaan
Model bawaannya gpt-5.2; model yang disebut dalam permintaan dipakai sebagai gantinya.
Scan
gpt-5.2bawaangpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Model di luar pemetaan 13 model ditolak.
Pemetaan gambar
gpt-image-1.5
Terpisah dari gpt-5.2, model orkestrasi Responses. Pembuatan gambar mati secara bawaan.
Evaluasi
gpt-4o-minibawaan
LLM grader untuk evaluasi percakapan, terpisah dari model Chat.
Google
Saat Chat memilih Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Dengan Google dipilih, gemini-3-flash-preview menjadi bawaan.
Scan
gemini-3-pro-previewgemini-3-flash-previewgemini-2.5-progemini-2.5-flashgemini-2.5-flash-litegemini-2.0-flashgemini-2.0-flash-lite
Pemetaan gambar
gemini-3-pro-image-preview
Sumberbackend main d8840c7Commit publik September 29, 2026 · diperiksa October 8, 2026