
Eco²
Backend · Cloud infrastructure
Указания за рециклиране от една снимка и разговор.
Всеобхватен AI асистент, който разбира как работи рециклирането в Корея.
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
Как реално се свързват 24-те възела, поток по поток.
Самостоятелно управляван Kubernetes, изграден с kubeadm. Картата поставя 24-те физически възела и работните натоварвания върху тях в петте слоя от README и ги свързва с реалните им връзки. Изберете поток и се откроява само неговият път, с номерирани стъпки.
Разпознава отпадъка от снимка и обяснява как да се изхвърли, а в разговор извиква инструменти за места, времето, цени при рециклиране и уеб търсене и генерира изображения. В този екипен проект започнах с основата за клъстера и внедряването и разширих обхвата си към бекенда на домейна, асинхронната обработка, разговорния агент и проверката.
От разработката за състезанието до укрепването на бекенда и експлоатацията
Услугата е приключила работа; записано демо и техническият доклад я показват в действие.
Заявка Scan → доставка в реално време
Заявка за анализ на снимка става работа в опашка, а събитията за напредъка ѝ се връщат в същия браузър.
БраузърDNS търсене: DNS търсенеRoute 53
От записите в Route 53 се разрешава само името. Заявките не минават през DNS.
Браузърпоток от данни: HTTPS 443AWS ALB
TLS приключва в ALB.
AWS ALBпоток от данни: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayПредава се на Istio ingress Envoy през NodePort на целта от тип EC2 инстанция.
Istio ingress Envoy
k8s-ingress-gatewayпоток от данни: VirtualServiceScan APIk8s-api-scanМаршрутизира се към Scan API, който поставя работата в опашката и веднага връща job_id; проверката на резултата отговаря с 202, докато задачата не е готова.
Scan API
k8s-api-scanпоток от данни: Задача CeleryRabbitMQk8s-rabbitmqЗадачата Scan отива в RabbitMQ.
RabbitMQ
k8s-rabbitmqпоток от данни: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) в AI пула я поема и изпълнява Vision → Rule → Answer → Reward. Четирите етапа са свързани във верига задачи Celery, а не възли.
AI пул
k8s-worker-ai · k8s-worker-ai-2поток от данни: HTTPSLLM APIРаботните процеси scan и chat извикват API на OpenAI и Google.
scan-worker
k8s-worker-ai · k8s-worker-ai-2поток от данни: XADD scan:eventsStreamsk8s-redis-streamsСъбитията за напредъка се записват в един от четирите шарда на Streams.
Streams
k8s-redis-streamsпоток от данни: XREADGROUPEvent Routerk8s-event-routerEvent Router ги чете като група потребители и прави XACK след обработката; pending и reclaim запазват доставката at-least-once.
Event Router
k8s-event-routerпоток от данни: SETEX stateState KVk8s-redis-streamsЗаписва последното състояние и маркер за дублирана обработка в State KV на същия възел на Redis.
Event Router
k8s-event-routerпоток от данни: PUBLISHPub/Subk8s-redis-pubsubДоставят се в реално време по канала на задачата в Pub/Sub по шардове.
Pub/Sub
k8s-redis-pubsubпоток от данни: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway се абонира чрез един споделен listener за процес и ги разпраща към всеки свързан браузър.
SSE Gateway
k8s-sse-gatewayпоток от данни: SSE потокБраузърВръзка, отворена по същия път през ALB и ingress. Доставката е at-least-once; дубликатите се обработват идемпотентно.
State KV
k8s-redis-streamsпоток от данни: Възстановяване при повторно свързванеSSE Gatewayk8s-sse-gatewayПри повторно свързване с Last-Event-ID State KV и запазените Streams допълват пропуснатите събития.
Chat · токени и съхранение
Токените на Chat минават по същия път за събития като Scan; контролните точки и съобщенията се съхраняват от две различни работни натоварвания.
Браузърпоток от данни: HTTPS 443AWS ALB
TLS приключва в ALB.
AWS ALBпоток от данни: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayПредава се на Istio ingress Envoy през NodePort на целта от тип EC2 инстанция.
Istio ingress Envoy
k8s-ingress-gatewayпоток от данни: VirtualServiceChat APIk8s-api-chatМаршрутизира се към Chat API.
Chat API
k8s-api-chatпоток от данни: Задача TaskiqRabbitMQk8s-rabbitmqЗадачата Chat отива в RabbitMQ.
RabbitMQ
k8s-rabbitmqпоток от данни: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) класифицира намерението с LangGraph, след което изпълнява vision при нужда, избраните инструменти, агрегатора и обобщение при нужда и отговаря. Всяка заявка изпълнява само нужните ѝ клонове.
AI пул
k8s-worker-ai · k8s-worker-ai-2поток от данни: HTTPSLLM APIРаботните процеси scan и chat извикват API на OpenAI и Google.
chat-worker
k8s-worker-ai · k8s-worker-ai-2поток от данни: XADD chat:eventsStreamsk8s-redis-streamsТокените и събитията за етапите се записват в четири шарда на Streams; оттам пътят на доставка е същият като при Scan.
Streams
k8s-redis-streamsпоток от данни: XREADGROUPEvent Routerk8s-event-routerEvent Router ги чете като група потребители и прави XACK след обработката; pending и reclaim запазват доставката at-least-once.
Event Router
k8s-event-routerпоток от данни: PUBLISHPub/Subk8s-redis-pubsubДоставят се в реално време по канала на задачата в Pub/Sub по шардове.
Pub/Sub
k8s-redis-pubsubпоток от данни: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway се абонира чрез един споделен listener за процес и ги разпраща към всеки свързан браузър.
SSE Gateway
k8s-sse-gatewayпоток от данни: SSE потокБраузърВръзка, отворена по същия път през ALB и ingress. Доставката е at-least-once; дубликатите се обработват идемпотентно.
chat-worker
k8s-worker-ai · k8s-worker-ai-2поток от данни: checkpointCachek8s-redis-cacheКонтролната точка на LangGraph се пази в Redis Cache.
Cache
k8s-redis-cacheпоток от данни: четене на контролната точкаcheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer прочита контролната точка от Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2поток от данни: синхронизиране с PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver я съхранява асинхронно в PostgreSQL.
Streams
k8s-redis-streamsпоток от данни: chat-persistence grouppersistence consumerk8s-api-chatpersistence consumer на възела Chat чете събитията done като група потребители.
persistence consumer
k8s-api-chatпоток от данни: запис на съобщениятаPostgreSQLk8s-postgresqlСъобщенията от Chat се записват в PostgreSQL. Това е различно работно натоварване от checkpoint-syncer.
Вход · удостоверяване
Синхронният път от входа на клъстера до API на домейн. Само пътищата, защитени с политика, първо проверяват удостоверяването; трафикът между подове на различни възли минава по Calico VXLAN.
БраузърDNS търсене: DNS търсенеRoute 53
От записите в Route 53 се разрешава само името. Заявките не минават през DNS.
Браузърпоток от данни: HTTPS 443AWS ALB
TLS приключва в ALB.
AWS ALBпоток от данни: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayПредава се на Istio ingress Envoy през NodePort на целта от тип EC2 инстанция.
Istio ingress Envoy
k8s-ingress-gatewayпоток от данни: ext-authz · gRPC 50051ext-authzk8s-api-authСамо пътищата под политика CUSTOM първо питат Go ext-authz (timeout 2 s, failOpen false). Пътища като login, health и docs са изключени.
ext-authz
k8s-api-authпоток от данни: проверка в черния списъкblacklistk8s-redis-authТокенът се проверява в черния списък в Redis.
Istio ingress Envoy
k8s-ingress-gatewayпоток от данни: VirtualServiceChat APIk8s-api-chatМаршрутизира се към Chat API.
Chat API
k8s-api-chatпоток от данни: gRPCimages APIk8s-api-imageСинхронното извикване chat → images, посочено в README.
auth API
k8s-api-authпоток от данни: gRPCusers APIk8s-api-usersСинхронното извикване auth → users, посочено в README.
Пул за съхранение · асинхронни записи
Черният списък за удостоверяване и собствеността на персонажите се съхраняват от работните процеси в пула за съхранение, които получават работата си от RabbitMQ.
blacklist
k8s-redis-authпоток от данни: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus в README) чете outbox в Redis.
auth-relay
k8s-worker-storage · k8s-worker-storage-2поток от данни: blacklist.eventsRabbitMQk8s-rabbitmqПубликува отново в RabbitMQ, с повторни опити и DLQ.
RabbitMQ
k8s-rabbitmqпоток от данни: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker получава събитията за черния списък.
auth-worker
k8s-worker-storage · k8s-worker-storage-2поток от данни: запис в черния списъкblacklistk8s-redis-authТе се съхраняват в черния списък в Redis.
RabbitMQ
k8s-rabbitmqпоток от данни: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker получава на партиди работа по собствеността на персонажите.
users-worker
k8s-worker-storage · k8s-worker-storage-2поток от данни: UPSERTPostgreSQLk8s-postgresqlТя се прилага в PostgreSQL.
Конфигуриране · мащабиране · наблюдение
Platform Layer не е стъпка, през която минават заявките; той внедрява, конфигурира, мащабира и наблюдава останалите слоеве. Възлите са EC2 инстанции, създадени с Terraform, с kubeadm и Calico, инсталирани чрез Ansible; CI само валидира Terraform и никога не го прилага автоматично.
GitHub Actions · Docker Hubконфигуриране · мащабиране: образ · ревизия на манифестаArgo CD image updater
k8s-masterArgo CD привежда конфигурацията на клъстера в съответствие чрез App-of-Apps и Sync Waves. Разположението в control-plane е потвърдено само за image updater.
ALB Controller · ExternalDNS
k8s-masterконфигуриране · мащабиране: Ingress → ALB · DNS записиУправлявано от AWSALB Controller и ExternalDNS конфигурират ресурсите от страна на AWS. Това не е път, по който минават заявките.
Istiod
k8s-masterконфигуриране · мащабиране: xDS конфигурацияIstio ingress Envoyk8s-ingress-gatewayIstiod изпраща чрез xDS конфигурацията на Gateway, VirtualService и EnvoyFilter към ingress Envoy и към Envoy sidecar на всеки API.
KEDA
k8s-monitoringконфигуриране · мащабиране: брой подовеAI пулk8s-worker-ai · k8s-worker-ai-2KEDA регулира броя на подовете на работните процеси. Броят на възлите не се променя.
KEDA
k8s-monitoringконфигуриране · мащабиране: брой подовепул за съхранениеk8s-worker-storage · k8s-worker-storage-2Подовете на работните процеси в пула за съхранение се мащабират по същия начин.
Fluent Bitнаблюдаемост: логовеElasticsearch
k8s-loggingFluent Bit е DaemonSet на всеки възел и изпраща логовете към Elasticsearch.
AI пул
k8s-worker-ai · k8s-worker-ai-2наблюдаемост: проследяване на изпълненията на LLMLangSmithСледите от извикванията на LLM отиват в LangSmith, външен SaaS.
Всички връзки с еднаква дебелина. Изберете поток, за да се откроят само неговият път и номерираните стъпки.
- Плътна · посоката, в която текат заявките, работата, събитията и записите
- Пунктирна · DNS търсене; заявките не минават през него
- Прекъсната · конфигуриране или мащабиране; не е път на данните
- Дълга щрих-пунктирна · логове и проследяване на изпълненията
- Дебела черна линия · избраният поток; числата показват реда
- Кутия · физически възел, с името на хоста в заглавието
- Вътрешен етикет · работно натоварване на този възел
- Прекъсната рамка · пул за планиране с два възела
- Прекъсната кутия · извън клъстера, не се брои за възел
- Оранжев контур · където решава модел
- Control plane1 възел
- Domain API8 възела
- AI пул2 възела
- пул за съхранение2 възела
- Data5 възела
- Platform6 възела
Петте слоя от README (лентите) и физическите групи (нюансът на заглавието на всеки възел) групират едни и същи 24 възела по различен начин. State KV споделя възела на Streams и не е броен отделно; Route 53, ALB и услугите извън клъстера не са възли. Пулът е обхват за планиране, а не твърдение, че всеки под работи и на двата възела.
24възела
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd, както и контролерите на платформата.
- k8s-master
8Domain API
domain: <услуга>По един възел за всеки домейн. Вътрешните извиквания използват 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
Два пула за планиране с по два възела. KEDA променя броя на подовете; броят на възлите остава същият.
пул за съхранение
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI пул
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis е разделен на четири възела със специално предназначение. Хранилището на PostgreSQL е EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Съобщенията, наблюдаемостта, входящият трафик и доставката в реално време имат всеки свой възел.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Всеки възел
- Fluent Bit · DaemonSet
- Calico
Конфигурирани модели · по доставчици
Услугата е спряна, затова това са моделите, конфигурирани в хранилището, а не възможности за избор днес. Всяка роля е посочена отделно; това не е списък с проверени изпълнения.
OpenAI
Доставчик по подразбиране за Chat
Chat
openai/gpt-5.2по подразбиране
Моделът по подразбиране е gpt-5.2; ако заявката посочи модел, се използва той.
Scan
gpt-5.2по подразбиранеgpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Модели извън съпоставянето от 13 модела се отхвърлят.
Съпоставяне за изображения
gpt-image-1.5
Отделно от gpt-5.2, модела за оркестрация на Responses. Генерирането на изображения е изключено по подразбиране.
Оценяване
gpt-4o-miniпо подразбиране
LLM оценителят за оценяване на разговорите, отделен от модела на Chat.
Google
Когато Chat избере Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
При избран Google 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
Съпоставяне за изображения
gemini-3-pro-image-preview
Източникbackend main d8840c7Публичен къмит 29 септември 2026 г. · проверено 8 октомври 2026 г.