
Eco²
Backend · Cloud infrastructure
Atliekų rūšiavimo patarimai iš vienos nuotraukos ir pokalbio.
Universalus DI asistentas, išmanantis, kaip Korėjoje rūšiuojamos atliekos.
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
Kaip iš tiesų sujungti 24 mazgai, po vieną srautą.
Savarankiškai valdomas Kubernetes, sukurtas su kubeadm. Žemėlapis išdėsto 24 fizinius mazgus ir jų darbo krūvius penkiuose README sluoksniuose ir sujungia juos tikrais ryšiais. Pasirinkite srautą, ir bus paryškintas tik tas kelias su sunumeruotais žingsniais.
Jis atpažįsta atliekas nuotraukoje ir paaiškina, kaip jas išmesti, o pokalbyje kviečia vietų, orų, antrinių žaliavų kainų ir žiniatinklio paieškos įrankius bei generuoja vaizdus. Šiame komandiniame projekte pradėjau nuo klasterio ir diegimo pagrindo, o vėliau išplėčiau savo sritį iki srities backendo, asinchroninio apdorojimo, pokalbių agento ir verifikacijos.
Nuo kūrimo konkursui iki backendo ir eksploatacijos stiprinimo
Paslauga baigė veiklą; įrašyta demonstracija ir techninė ataskaita rodo ją veikiančią.
Scan užklausa → tiesioginis pristatymas
Nuotraukos analizės užklausa tampa darbu eilėje, o jo pažangos įvykiai grįžta į tą pačią naršyklę.
NaršyklėDNS užklausa: DNS užklausaRoute 53
Iš Route 53 įrašų nustatomas tik vardas. Užklausos per DNS neina.
Naršyklėduomenų srautas: HTTPS 443AWS ALB
TLS baigiasi ALB.
AWS ALBduomenų srautas: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPerduodama Istio ingress Envoy per EC2 instance target NodePort.
Istio ingress Envoy
k8s-ingress-gatewayduomenų srautas: VirtualServiceScan APIk8s-api-scanNukreipiama į Scan API, kuris įdeda darbą į eilę ir iš karto grąžina job_id; į rezultato užklausą atsakoma 202, kol užduotis nebaigta.
Scan API
k8s-api-scanduomenų srautas: Celery užduotisRabbitMQk8s-rabbitmqScan užduotis patenka į RabbitMQ.
RabbitMQ
k8s-rabbitmqduomenų srautas: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) AI telkinyje ją paima ir vykdo Vision → Rule → Answer → Reward. Keturi etapai yra grandine sujungtos Celery užduotys, o ne mazgai.
AI telkinys
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: HTTPSLLM APIScan ir chat worker kviečia OpenAI ir Google API.
scan-worker
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: XADD scan:eventsStreamsk8s-redis-streamsPažangos įvykiai įrašomi į vieną iš keturių Streams fragmentų.
Streams
k8s-redis-streamsduomenų srautas: XREADGROUPEvent Routerk8s-event-routerEvent Router juos skaito kaip consumer group ir po apdorojimo atlieka XACK; pending ir reclaim užtikrina at-least-once pristatymą.
Event Router
k8s-event-routerduomenų srautas: SETEX stateState KVk8s-redis-streamsJis įrašo naujausią būseną ir pakartotinio apdorojimo žymę į State KV tame pačiame Redis mazge.
Event Router
k8s-event-routerduomenų srautas: PUBLISHPub/Subk8s-redis-pubsubPristatoma realiuoju laiku užduoties kanalu fragmentuotame Pub/Sub.
Pub/Sub
k8s-redis-pubsubduomenų srautas: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway užsiprenumeruoja per vieną bendrą listener kiekviename procese ir išskirsto kiekvienai prijungtai naršyklei.
SSE Gateway
k8s-sse-gatewayduomenų srautas: SSE srautasNaršyklėRyšys, atvertas tuo pačiu ALB ir ingress keliu. Pristatymas at-least-once; dublikatai apdorojami idempotentiškai.
State KV
k8s-redis-streamsduomenų srautas: Atkūrimas prisijungus iš naujoSSE Gatewayk8s-sse-gatewayPrisijungus iš naujo su Last-Event-ID, State KV ir išsaugoti Streams užpildo praleistus įvykius.
Chat · žetonai ir saugojimas
Chat žetonai keliauja tuo pačiu įvykių keliu kaip Scan; kontrolinius taškus ir žinutes saugo du skirtingi darbo krūviai.
Naršyklėduomenų srautas: HTTPS 443AWS ALB
TLS baigiasi ALB.
AWS ALBduomenų srautas: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPerduodama Istio ingress Envoy per EC2 instance target NodePort.
Istio ingress Envoy
k8s-ingress-gatewayduomenų srautas: VirtualServiceChat APIk8s-api-chatNukreipiama į Chat API.
Chat API
k8s-api-chatduomenų srautas: Taskiq užduotisRabbitMQk8s-rabbitmqChat užduotis patenka į RabbitMQ.
RabbitMQ
k8s-rabbitmqduomenų srautas: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) su LangGraph klasifikuoja ketinimą, tada prireikus vykdo vision, pasirinktus įrankius, aggregator ir prireikus santrauką, ir atsako. Kiekviena užklausa vykdo tik jai reikalingas šakas.
AI telkinys
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: HTTPSLLM APIScan ir chat worker kviečia OpenAI ir Google API.
chat-worker
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: XADD chat:eventsStreamsk8s-redis-streamsŽetonai ir etapų įvykiai įrašomi į keturis Streams fragmentus; toliau pristatymo kelias toks pat kaip Scan.
Streams
k8s-redis-streamsduomenų srautas: XREADGROUPEvent Routerk8s-event-routerEvent Router juos skaito kaip consumer group ir po apdorojimo atlieka XACK; pending ir reclaim užtikrina at-least-once pristatymą.
Event Router
k8s-event-routerduomenų srautas: PUBLISHPub/Subk8s-redis-pubsubPristatoma realiuoju laiku užduoties kanalu fragmentuotame Pub/Sub.
Pub/Sub
k8s-redis-pubsubduomenų srautas: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway užsiprenumeruoja per vieną bendrą listener kiekviename procese ir išskirsto kiekvienai prijungtai naršyklei.
SSE Gateway
k8s-sse-gatewayduomenų srautas: SSE srautasNaršyklėRyšys, atvertas tuo pačiu ALB ir ingress keliu. Pristatymas at-least-once; dublikatai apdorojami idempotentiškai.
chat-worker
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: checkpointCachek8s-redis-cacheLangGraph kontrolinis taškas laikomas Redis Cache.
Cache
k8s-redis-cacheduomenų srautas: skaityti kontrolinį taškącheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer skaito kontrolinį tašką iš Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2duomenų srautas: sinchronizuoti su PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver asinchroniškai jį saugo PostgreSQL.
Streams
k8s-redis-streamsduomenų srautas: chat-persistence grouppersistence consumerk8s-api-chatpersistence consumer Chat mazge skaito done įvykius kaip consumer group.
persistence consumer
k8s-api-chatduomenų srautas: įrašyti žinutesPostgreSQLk8s-postgresqlChat žinutės įrašomos į PostgreSQL. Tai kitas darbo krūvis nei checkpoint-syncer.
Įėjimas · autentifikavimas
Sinchroninis kelias nuo įėjimo į klasterį iki srities API. Autentifikavimą pirmiausia tikrina tik keliai su politika; podų srautas tarp mazgų eina per Calico VXLAN.
NaršyklėDNS užklausa: DNS užklausaRoute 53
Iš Route 53 įrašų nustatomas tik vardas. Užklausos per DNS neina.
Naršyklėduomenų srautas: HTTPS 443AWS ALB
TLS baigiasi ALB.
AWS ALBduomenų srautas: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPerduodama Istio ingress Envoy per EC2 instance target NodePort.
Istio ingress Envoy
k8s-ingress-gatewayduomenų srautas: ext-authz · gRPC 50051ext-authzk8s-api-authTik keliai su CUSTOM politika pirmiausia kreipiasi į Go ext-authz (laiko limitas 2 s, failOpen false). Tokie keliai kaip login, health ir docs neįtraukti.
ext-authz
k8s-api-authduomenų srautas: juodojo sąrašo užklausablacklistk8s-redis-authŽetonas tikrinamas pagal Redis juodąjį sąrašą.
Istio ingress Envoy
k8s-ingress-gatewayduomenų srautas: VirtualServiceChat APIk8s-api-chatNukreipiama į Chat API.
Chat API
k8s-api-chatduomenų srautas: gRPCimages APIk8s-api-imageREADME nurodytas sinchroninis iškvietimas chat → images.
auth API
k8s-api-authduomenų srautas: gRPCusers APIk8s-api-usersREADME nurodytas sinchroninis iškvietimas auth → users.
Storage telkinys · asinchroninis įrašymas
Autentifikavimo juodąjį sąrašą ir personažų nuosavybę saugo storage telkinio worker, gaunantys darbą iš RabbitMQ.
blacklist
k8s-redis-authduomenų srautas: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (README auth-Bus) skaito Redis outbox.
auth-relay
k8s-worker-storage · k8s-worker-storage-2duomenų srautas: blacklist.eventsRabbitMQk8s-rabbitmqJis pakartotinai publikuoja į RabbitMQ, su pakartojimais ir DLQ.
RabbitMQ
k8s-rabbitmqduomenų srautas: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker gauna juodojo sąrašo įvykius.
auth-worker
k8s-worker-storage · k8s-worker-storage-2duomenų srautas: įrašyti juodąjį sąrašąblacklistk8s-redis-authJie įrašomi į Redis juodąjį sąrašą.
RabbitMQ
k8s-rabbitmqduomenų srautas: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker gauna personažų nuosavybės darbus paketais.
users-worker
k8s-worker-storage · k8s-worker-storage-2duomenų srautas: UPSERTPostgreSQLk8s-postgresqlJie pritaikomi PostgreSQL.
Konfigūravimas · mastelis · stebėjimas
Platform Layer nėra žingsnis, per kurį eina užklausos; jis diegia, konfigūruoja, keičia mastelį ir stebi kitus sluoksnius. Mazgai yra Terraform sukurti EC2 egzemplioriai, kuriuose kubeadm ir Calico įdiegti su Ansible; CI Terraform tik tikrina ir niekada jo automatiškai netaiko.
GitHub Actions · Docker Hubkonfigūravimas · mastelis: atvaizdas · manifesto revizijaArgo CD image updater
k8s-masterArgo CD suderina klasterio konfigūraciją per App-of-Apps ir Sync Waves. Patvirtintas tik image updater išdėstymas control-plane.
ALB Controller · ExternalDNS
k8s-masterkonfigūravimas · mastelis: Ingress → ALB · DNS įrašaiValdo AWSALB Controller ir ExternalDNS konfigūruoja AWS pusės išteklius. Tai ne kelias, kuriuo eina užklausos.
Istiod
k8s-masterkonfigūravimas · mastelis: xDS konfigūracijaIstio ingress Envoyk8s-ingress-gatewayIstiod per xDS perduoda Gateway, VirtualService ir EnvoyFilter konfigūraciją ingress Envoy ir kiekvieno API Envoy sidecar.
KEDA
k8s-monitoringkonfigūravimas · mastelis: podų skaičiusAI telkinysk8s-worker-ai · k8s-worker-ai-2KEDA keičia worker podų skaičių. Mazgų skaičius nekinta.
KEDA
k8s-monitoringkonfigūravimas · mastelis: podų skaičiusstorage telkinysk8s-worker-storage · k8s-worker-storage-2Storage telkinio worker podų mastelis keičiamas taip pat.
Fluent Bitstebimumas: žurnalaiElasticsearch
k8s-loggingFluent Bit yra DaemonSet kiekviename mazge ir siunčia žurnalus į Elasticsearch.
AI telkinys
k8s-worker-ai · k8s-worker-ai-2stebimumas: LLM paleidimų sekimasLangSmithLLM iškvietimų pėdsakai keliauja į LangSmith – išorinę SaaS.
Visi ryšiai vienodo storio. Pasirinkite srautą, kad būtų paryškintas tik jo kelias su sunumeruotais žingsniais.
- Ištisinė · kryptis, kuria keliauja užklausos, darbas, įvykiai ir įrašymai
- Taškinė · DNS užklausa; užklausos per ją neina
- Brūkšninė · konfigūravimas ar mastelio keitimas; ne duomenų kelias
- Ilga brūkšninė-taškinė · žurnalai ir paleidimų sekimas
- Stora juoda linija · pasirinktas srautas; skaičiai rodo tvarką
- Rėmelis · fizinis mazgas, pagrindinio kompiuterio vardas antraštėje
- Vidinė plokštelė · tame mazge veikiantis darbo krūvis
- Brūkšninis rėmas · dviejų mazgų planavimo telkinys
- Brūkšninis rėmelis · už klasterio ribų, neskaičiuojamas kaip mazgas
- Oranžinis kontūras · kur sprendžia modelis
- Control plane1 mazgas
- Domain API8 mazgai
- AI telkinys2 mazgai
- storage telkinys2 mazgai
- Data5 mazgai
- Platform6 mazgai
Penki README sluoksniai (juostos) ir fizinės grupės (kiekvieno mazgo antraštės atspalvis) tuos pačius 24 mazgus grupuoja skirtingai. State KV dalijasi mazgu su Streams ir atskirai neskaičiuojamas; Route 53, ALB ir paslaugos už klasterio ribų nėra mazgai. Telkinys yra planavimo sritis, o ne teiginys, kad kiekvienas podas veikia abiejuose mazguose.
24mazgai
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd ir platformos valdikliai.
- k8s-master
8Domain API
domain: <paslauga>Vienas mazgas kiekvienai sričiai. Vidiniai iškvietimai naudoja 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
Du planavimo telkiniai po du mazgus. KEDA keičia podų skaičių; mazgų skaičius lieka tas pats.
storage telkinys
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI telkinys
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis pagal paskirtį padalytas į keturis mazgus. PostgreSQL saugykla yra EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Pranešimų perdavimas, stebimumas, ingress ir pristatymas realiuoju laiku turi kiekvienas savo mazgą.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Kiekvienas mazgas
- Fluent Bit · DaemonSet
- Calico
Sukonfigūruoti modeliai · pagal tiekėją
Paslauga uždaryta, todėl tai saugykloje sukonfigūruoti modeliai, o ne šiandien prieinami pasirinkimai. Kiekvienas vaidmuo nurodytas atskirai; tai nėra patikrintų paleidimų sąrašas.
OpenAI
Numatytasis Chat tiekėjas
Chat
openai/gpt-5.2numatytasis
Numatytasis modelis – gpt-5.2; jei modelis nurodytas užklausoje, naudojamas jis.
Scan
gpt-5.2numatytasisgpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Modeliai, nepatenkantys į 13 modelių susiejimą, atmetami.
Vaizdų susiejimas
gpt-image-1.5
Atskirai nuo gpt-5.2 – Responses orkestravimo modelio. Vaizdų generavimas pagal numatymą išjungtas.
Vertinimas
gpt-4o-mininumatytasis
Pokalbių vertinimo LLM grader, atskiras nuo Chat modelio.
Google
Kai Chat pasirenka Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Pasirinkus Google, numatytasis yra 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
Vaizdų susiejimas
gemini-3-pro-image-preview
Šaltinisbackend main d8840c7Viešas komitas September 29, 2026 · patikrinta October 8, 2026