
Eco²
Backend · Cloud infrastructure
Kierrätysohjeet yhdestä kuvasta ja keskustelusta.
Kaiken kattava AI-avustaja, joka ymmärtää, miten kierrätys toimii Koreassa.
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
Miten 24 solmua todella kytkeytyvät, virta kerrallaan.
Kubeadmilla rakennettu itse hallinnoitu Kubernetes. Kartta sijoittaa 24 fyysistä solmua ja niillä toimivat työkuormat README:n viiteen kerrokseen ja yhdistää ne niiden todellisilla yhteyksillä. Valitse virta, niin vain sen polku korostetaan numeroituine vaiheineen.
Se tunnistaa jätteen kuvasta ja kertoo, miten se hävitetään, ja keskustelussa se kutsuu työkaluja paikkoihin, säähän, kierrätyshintoihin ja verkkohakuun sekä generoi kuvia. Tässä tiimiprojektissa aloitin klusterin ja käyttöönoton perustasta ja laajensin vastuuni toimialueen taustajärjestelmään, asynkroniseen käsittelyyn, keskusteluagenttiin ja todentamiseen.
Kilpailun kehitystyöstä taustajärjestelmän ja ylläpidon vahvistamiseen
Palvelu on päättänyt toimintansa; tallennettu demo ja tekninen raportti näyttävät sen toiminnassa.
Scan-pyyntö → reaaliaikainen toimitus
Kuva-analyysipyynnöstä tulee jonossa oleva työ, ja sen edistymistapahtumat palaavat samaan selaimeen.
SelainDNS-haku: DNS-hakuRoute 53
Route 53 -tietueista selvitetään vain nimi. Pyynnöt eivät kulje DNS:n kautta.
Selaindatavirta: HTTPS 443AWS ALB
TLS päättyy ALB:hen.
AWS ALBdatavirta: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayVälitetään Istio ingress Envoylle EC2-instanssikohteen NodePortin kautta.
Istio ingress Envoy
k8s-ingress-gatewaydatavirta: VirtualServiceScan APIk8s-api-scanReititetään Scan API:lle, joka asettaa työn jonoon ja palauttaa heti job_id:n; tuloskysely vastaa koodilla 202, kunnes työ on valmis.
Scan API
k8s-api-scandatavirta: Celery-tehtäväRabbitMQk8s-rabbitmqScan-tehtävä menee RabbitMQ-jonoon.
RabbitMQ
k8s-rabbitmqdatavirta: consumescan-workerk8s-worker-ai · k8s-worker-ai-2AI-poolin scan-worker (Celery · gevent) ottaa sen ja ajaa vaiheet Vision → Rule → Answer → Reward. Neljä vaihetta ovat ketjutettuja Celery-tehtäviä, eivät solmuja.
AI-pooli
k8s-worker-ai · k8s-worker-ai-2datavirta: HTTPSLLM APIScan- ja chat-workerit kutsuvat OpenAI:n ja Googlen API:ita.
scan-worker
k8s-worker-ai · k8s-worker-ai-2datavirta: XADD scan:eventsStreamsk8s-redis-streamsEdistymistapahtumat kirjoitetaan yhteen neljästä Streams-shardista.
Streams
k8s-redis-streamsdatavirta: XREADGROUPEvent Routerk8s-event-routerEvent Router lukee ne kuluttajaryhmänä ja kuittaa ne XACK-komennolla käsittelyn jälkeen; pending- ja reclaim-käsittely pitävät toimituksen vähintään kerran tapahtuvana.
Event Router
k8s-event-routerdatavirta: SETEX stateState KVk8s-redis-streamsSe kirjoittaa viimeisimmän tilan ja kaksoiskäsittelymerkinnän saman Redis-solmun State KV:hen.
Event Router
k8s-event-routerdatavirta: PUBLISHPub/Subk8s-redis-pubsubToimitetaan reaaliajassa työn kanavalla shard Pub/Sub -mekanismissa.
Pub/Sub
k8s-redis-pubsubdatavirta: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway tilaa ne yhden prosessikohtaisen jaetun kuuntelijan kautta ja jakaa ne jokaiselle yhdistetylle selaimelle.
SSE Gateway
k8s-sse-gatewaydatavirta: SSE-virtaSelainYhteys avataan samaa ALB- ja ingress-polkua pitkin. Toimitus taataan vähintään kerran; kaksoiskappaleet käsitellään idempotentisti.
State KV
k8s-redis-streamsdatavirta: Palautus uudelleenyhdistettäessäSSE Gatewayk8s-sse-gatewayKun selain yhdistää uudelleen Last-Event-ID:llä, State KV ja säilytetyt Streamsit täydentävät väliin jääneet tapahtumat.
Chat · tokenit ja tallennus
Chatin tokenit kulkevat samaa tapahtumapolkua kuin Scanin; checkpointit ja viestit tallentavat kaksi eri työkuormaa.
Selaindatavirta: HTTPS 443AWS ALB
TLS päättyy ALB:hen.
AWS ALBdatavirta: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayVälitetään Istio ingress Envoylle EC2-instanssikohteen NodePortin kautta.
Istio ingress Envoy
k8s-ingress-gatewaydatavirta: VirtualServiceChat APIk8s-api-chatReititetään Chat API:lle.
Chat API
k8s-api-chatdatavirta: Taskiq-tehtäväRabbitMQk8s-rabbitmqChat-tehtävä menee RabbitMQ-jonoon.
RabbitMQ
k8s-rabbitmqdatavirta: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) luokittelee aikomuksen LangGraphilla, ajaa sitten tarvittaessa vision-vaiheen, valitut työkalut, aggregatorin ja tarvittaessa tiivistelmän ja vastaa. Kukin pyyntö ajaa vain tarvitsemansa haarat.
AI-pooli
k8s-worker-ai · k8s-worker-ai-2datavirta: HTTPSLLM APIScan- ja chat-workerit kutsuvat OpenAI:n ja Googlen API:ita.
chat-worker
k8s-worker-ai · k8s-worker-ai-2datavirta: XADD chat:eventsStreamsk8s-redis-streamsTokenit ja vaihetapahtumat kirjoitetaan neljään Streams-shardiin; sieltä toimituspolku on sama kuin Scanilla.
Streams
k8s-redis-streamsdatavirta: XREADGROUPEvent Routerk8s-event-routerEvent Router lukee ne kuluttajaryhmänä ja kuittaa ne XACK-komennolla käsittelyn jälkeen; pending- ja reclaim-käsittely pitävät toimituksen vähintään kerran tapahtuvana.
Event Router
k8s-event-routerdatavirta: PUBLISHPub/Subk8s-redis-pubsubToimitetaan reaaliajassa työn kanavalla shard Pub/Sub -mekanismissa.
Pub/Sub
k8s-redis-pubsubdatavirta: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway tilaa ne yhden prosessikohtaisen jaetun kuuntelijan kautta ja jakaa ne jokaiselle yhdistetylle selaimelle.
SSE Gateway
k8s-sse-gatewaydatavirta: SSE-virtaSelainYhteys avataan samaa ALB- ja ingress-polkua pitkin. Toimitus taataan vähintään kerran; kaksoiskappaleet käsitellään idempotentisti.
chat-worker
k8s-worker-ai · k8s-worker-ai-2datavirta: checkpointCachek8s-redis-cacheLangGraphin checkpoint säilytetään Redis Cachessa.
Cache
k8s-redis-cachedatavirta: checkpointin lukucheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer lukee checkpointin Redisistä.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2datavirta: synkronointi PostgreSQL:äänPostgreSQLk8s-postgresqlAsyncPostgresSaver tallentaa sen PostgreSQL:ään asynkronisesti.
Streams
k8s-redis-streamsdatavirta: chat-persistence grouppersistence consumerk8s-api-chatChat-solmun persistence consumer lukee done-tapahtumat kuluttajaryhmänä.
persistence consumer
k8s-api-chatdatavirta: viestien tallennusPostgreSQLk8s-postgresqlChat-viestit tallennetaan PostgreSQL:ään. Tämä on eri työkuorma kuin checkpoint-syncer.
Sisääntulo · todennus
Synkroninen polku klusterin sisääntulosta toimialueen API:in. Vain käytännön suojaamat polut tarkistavat todennuksen ensin; solmujen välinen podiliikenne kulkee Calico VXLANissa.
SelainDNS-haku: DNS-hakuRoute 53
Route 53 -tietueista selvitetään vain nimi. Pyynnöt eivät kulje DNS:n kautta.
Selaindatavirta: HTTPS 443AWS ALB
TLS päättyy ALB:hen.
AWS ALBdatavirta: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayVälitetään Istio ingress Envoylle EC2-instanssikohteen NodePortin kautta.
Istio ingress Envoy
k8s-ingress-gatewaydatavirta: ext-authz · gRPC 50051ext-authzk8s-api-authVain CUSTOM-käytännön alaiset polut kysyvät ensin Go ext-authzilta (aikakatkaisu 2 s, failOpen false). Esimerkiksi kirjautumis-, health- ja docs-polut on rajattu pois.
ext-authz
k8s-api-authdatavirta: estolistan hakublacklistk8s-redis-authToken tarkistetaan Redisin estolistaa vasten.
Istio ingress Envoy
k8s-ingress-gatewaydatavirta: VirtualServiceChat APIk8s-api-chatReititetään Chat API:lle.
Chat API
k8s-api-chatdatavirta: gRPCimages APIk8s-api-imageREADME:ssä mainittu synkroninen kutsu chat → images.
auth API
k8s-api-authdatavirta: gRPCusers APIk8s-api-usersREADME:ssä mainittu synkroninen kutsu auth → users.
Tallennuspooli · asynkroniset kirjoitukset
Todennuksen estolistan ja hahmojen omistajuudet tallentavat tallennuspoolin workerit, jotka ottavat työnsä RabbitMQ:sta.
blacklist
k8s-redis-authdatavirta: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (README:n auth-Bus) lukee Redisin outboxin.
auth-relay
k8s-worker-storage · k8s-worker-storage-2datavirta: blacklist.eventsRabbitMQk8s-rabbitmqSe julkaisee uudelleen RabbitMQ:hon uusintojen ja DLQ:n kanssa.
RabbitMQ
k8s-rabbitmqdatavirta: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker vastaanottaa estolistatapahtumat.
auth-worker
k8s-worker-storage · k8s-worker-storage-2datavirta: estolistan tallennusblacklistk8s-redis-authNe tallennetaan Redisin estolistaan.
RabbitMQ
k8s-rabbitmqdatavirta: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker vastaanottaa hahmojen omistajuustyöt erissä.
users-worker
k8s-worker-storage · k8s-worker-storage-2datavirta: UPSERTPostgreSQLk8s-postgresqlNe viedään PostgreSQL:ään.
Konfigurointi · skaalaus · havainnointi
Platform Layer ei ole vaihe, jonka läpi pyynnöt kulkevat; se ottaa käyttöön, konfiguroi, skaalaa ja havainnoi muita kerroksia. Solmut ovat Terraformilla luotuja EC2-instansseja, joihin Ansible asensi kubeadmin ja Calicon; CI vain validoi Terraformin eikä koskaan toimeenpane sitä automaattisesti.
GitHub Actions · Docker Hubkonfigurointi · skaalaus: levykuva · manifestin revisioArgo CD image updater
k8s-masterArgo CD yhdenmukaistaa klusterin konfiguraation App-of-Apps- ja Sync Waves -mekanismeilla. Vain image updaterin control-plane-sijoittelu vahvistettiin.
ALB Controller · ExternalDNS
k8s-masterkonfigurointi · skaalaus: Ingress → ALB · DNS-tietueetAWS:n hallinnoimaALB Controller ja ExternalDNS konfiguroivat AWS-puolen resurssit. Tämä ei ole pyyntöjen kulkema polku.
Istiod
k8s-masterkonfigurointi · skaalaus: xDS-konfiguraatioIstio ingress Envoyk8s-ingress-gatewayIstiod työntää Gateway-, VirtualService- ja EnvoyFilter-konfiguraation xDS:n kautta ingress Envoylle ja kunkin API:n Envoy-sidecarille.
KEDA
k8s-monitoringkonfigurointi · skaalaus: podien määräAI-poolik8s-worker-ai · k8s-worker-ai-2KEDA säätää worker-podien määrää. Solmujen määrä ei muutu.
KEDA
k8s-monitoringkonfigurointi · skaalaus: podien määrätallennuspoolik8s-worker-storage · k8s-worker-storage-2Tallennuspoolin worker-podit skaalataan samalla tavalla.
Fluent Bithavaittavuus: lokitElasticsearch
k8s-loggingFluent Bit on DaemonSet jokaisella solmulla ja lähettää lokit Elasticsearchiin.
AI-pooli
k8s-worker-ai · k8s-worker-ai-2havaittavuus: LLM-ajojen jäljitysLangSmithLLM-kutsujen jäljet menevät LangSmithiin, ulkoiseen SaaS-palveluun.
Kaikki yhteydet samalla painolla. Valitse virta, niin vain sen polku korostuu numeroiduin vaihein.
- Yhtenäinen · pyyntöjen, töiden, tapahtumien ja kirjoitusten kulkusuunta
- Pisteviiva · DNS-haku; pyynnöt eivät kulje sen kautta
- Katkoviiva · konfigurointi tai skaalaus; ei datapolku
- Pitkä pistekatkoviiva · lokit ja ajojen jäljitys
- Paksu musta viiva · valittu virta; numerot kertovat järjestyksen
- Laatikko · fyysinen solmu, isäntänimi otsakkeessa
- Sisälaatta · solmussa ajettava työkuorma
- Katkoviivakehys · kahden solmun ajoituspooli
- Katkoviivalaatikko · klusterin ulkopuolella, ei lasketa solmuksi
- Oranssi ääriviiva · kohta, jossa malli päättää
- Control plane1 solmu
- Domain API8 solmua
- AI-pooli2 solmua
- tallennuspooli2 solmua
- Data5 solmua
- Platform6 solmua
README:n viisi kerrosta (vyöhykkeet) ja fyysiset ryhmät (kunkin solmun otsakkeen sävy) ryhmittelevät samat 24 solmua eri tavoin. State KV jakaa Streams-solmun eikä sitä lasketa erikseen; Route 53, ALB ja klusterin ulkopuoliset palvelut eivät ole solmuja. Pooli on aikataulutusalue, ei väite siitä, että jokainen podi toimisi molemmilla solmuilla.
24solmua
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd sekä alustan kontrollerit.
- k8s-master
8Domain API
domain: <palvelu>Yksi solmu toimialuetta kohden. Sisäiset kutsut käyttävät gRPC:tä.
- 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
Kaksi aikataulutuspoolia, kummassakin kaksi solmua. KEDA muuttaa podien määrää; solmujen määrä pysyy samana.
tallennuspooli
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI-pooli
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis on jaettu neljälle käyttötarkoituskohtaiselle solmulle. PostgreSQL:n tallennus on EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Viestinvälityksellä, havaittavuudella, sisääntulolla ja reaaliaikaisella toimituksella on kullakin oma solmunsa.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Jokainen solmu
- Fluent Bit · DaemonSet
- Calico
Konfiguroidut mallit · toimittajittain
Palvelu on suljettu, joten nämä ovat repositorioon konfiguroituja malleja, eivät nykyään valittavissa olevia vaihtoehtoja. Kukin rooli on lueteltu erikseen; tämä ei ole luettelo todennetuista ajoista.
OpenAI
Chatin oletustoimittaja
Chat
openai/gpt-5.2oletus
Oletusmalli on gpt-5.2; pyynnössä nimettyä mallia käytetään sen sijaan.
Scan
gpt-5.2oletusgpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
13 mallin vastaavuuksien ulkopuoliset mallit hylätään.
Kuvavastaavuudet
gpt-image-1.5
Erillään Responses-orkestrointimallista gpt-5.2. Kuvien generointi on oletuksena pois päältä.
Arviointi
gpt-4o-minioletus
Keskustelujen arvioinnin LLM-pisteyttäjä, erillään Chat-mallista.
Google
Kun Chat valitsee Googlen
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Kun Google on valittu, oletus on gemini-3-flash-preview.
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
Kuvavastaavuudet
gemini-3-pro-image-preview
Lähdebackend main d8840c7Julkinen commit 29.9.2026 · tarkistettu 8.10.2026