
Eco²
Backend · Cloud infrastructure
Tek bir fotoğraf ve bir sohbetle geri dönüşüm rehberliği.
Kore'de geri dönüşümün nasıl işlediğini bilen hepsi bir arada bir yapay zekâ asistanı.
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 düğümün gerçekte nasıl bağlandığı, her seferinde bir akış.
kubeadm ile kurulmuş, kendi kendine yönetilen Kubernetes. Harita 24 fiziksel düğümü ve üzerlerindeki iş yüklerini README'nin beş katmanı içine yerleştirir ve gerçek bağlantılarıyla birleştirir. Bir akış seçildiğinde yalnızca o yol numaralı adımlarla vurgulanır.
Bir fotoğraftan atığı tanır ve nasıl atılacağını açıklar; sohbette yerler, hava durumu, geri dönüşüm fiyatları ve web araması için araçları çağırır ve görsel üretir. Bu ekip projesinde küme ve dağıtım temeliyle başladım; sorumluluğumu alan arka ucuna, eşzamansız işlemeye, sohbet ajanına ve doğrulamaya genişlettim.
Yarışma geliştirmesinden arka uç ve operasyonların sağlamlaştırılmasına kadar
Hizmet faaliyetini tamamladı; kaydedilmiş bir demo ve teknik rapor onu çalışırken gösterir.
Scan isteği → canlı iletim
Bir fotoğraf analizi isteği kuyruğa alınmış bir işe dönüşür ve ilerleme olayları aynı tarayıcıya geri gelir.
TarayıcıDNS sorgusu: DNS sorgusuRoute 53
Route 53 kayıtlarından yalnızca ad çözümlenir. İstekler DNS'ten geçmez.
Tarayıcıveri akışı: HTTPS 443AWS ALB
TLS, ALB'de sonlanır.
AWS ALBveri akışı: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayEC2 instance hedefinin NodePort'u üzerinden Istio ingress Envoy'a aktarılır.
Istio ingress Envoy
k8s-ingress-gatewayveri akışı: VirtualServiceScan APIk8s-api-scanİşi kuyruğa koyup hemen bir job_id döndüren Scan API'ye yönlendirilir; sonuç sorgusu iş bitene kadar 202 yanıtını verir.
Scan API
k8s-api-scanveri akışı: Celery göreviRabbitMQk8s-rabbitmqScan görevi RabbitMQ'ya konur.
RabbitMQ
k8s-rabbitmqveri akışı: consumescan-workerk8s-worker-ai · k8s-worker-ai-2AI havuzundaki scan-worker (Celery · gevent) onu alır ve Vision → Rule → Answer → Reward çalıştırır. Dört aşama zincirlenmiş Celery görevleridir, düğüm değildir.
AI havuzu
k8s-worker-ai · k8s-worker-ai-2veri akışı: HTTPSLLM APIscan ve chat worker'ları OpenAI ve Google API'lerini çağırır.
scan-worker
k8s-worker-ai · k8s-worker-ai-2veri akışı: XADD scan:eventsStreamsk8s-redis-streamsİlerleme olayları dört Streams shard'ından birine yazılır.
Streams
k8s-redis-streamsveri akışı: XREADGROUPEvent Routerk8s-event-routerEvent Router bunları bir consumer group olarak okur ve işledikten sonra XACK eder; pending ve reclaim iletimi at-least-once tutar.
Event Router
k8s-event-routerveri akışı: SETEX stateState KVk8s-redis-streamsEn son durumu ve bir yinelenen işleme işaretini aynı Redis düğümündeki State KV'ye yazar.
Event Router
k8s-event-routerveri akışı: PUBLISHPub/Subk8s-redis-pubsubShard Pub/Sub'da işin kanalında gerçek zamanlı iletilir.
Pub/Sub
k8s-redis-pubsubveri akışı: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway süreç başına tek bir paylaşılan listener ile abone olur ve bağlı her tarayıcıya dağıtır.
SSE Gateway
k8s-sse-gatewayveri akışı: SSE akışıTarayıcıAynı ALB ve ingress yolu üzerinden açılan bir bağlantı. İletim at-least-once'tır; kopyalar idempotent biçimde işlenir.
State KV
k8s-redis-streamsveri akışı: Yeniden bağlanmada kurtarmaSSE Gatewayk8s-sse-gatewayLast-Event-ID ile yeniden bağlanıldığında State KV ve saklanan Streams kaçırılan olayları tamamlar.
Chat · token'lar ve depolama
Chat token'ları Scan ile aynı olay yolunu izler; checkpoint'ler ve mesajlar iki farklı iş yükü tarafından kaydedilir.
Tarayıcıveri akışı: HTTPS 443AWS ALB
TLS, ALB'de sonlanır.
AWS ALBveri akışı: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayEC2 instance hedefinin NodePort'u üzerinden Istio ingress Envoy'a aktarılır.
Istio ingress Envoy
k8s-ingress-gatewayveri akışı: VirtualServiceChat APIk8s-api-chatChat API'ye yönlendirilir.
Chat API
k8s-api-chatveri akışı: Taskiq göreviRabbitMQk8s-rabbitmqChat görevi RabbitMQ'ya konur.
RabbitMQ
k8s-rabbitmqveri akışı: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) niyeti LangGraph ile sınıflandırır, ardından gerekirse vision'ı, seçilen araçları, aggregator'ı ve gerekirse bir özeti çalıştırıp yanıtlar. Her istek yalnızca ihtiyaç duyduğu dalları çalıştırır.
AI havuzu
k8s-worker-ai · k8s-worker-ai-2veri akışı: HTTPSLLM APIscan ve chat worker'ları OpenAI ve Google API'lerini çağırır.
chat-worker
k8s-worker-ai · k8s-worker-ai-2veri akışı: XADD chat:eventsStreamsk8s-redis-streamsToken'lar ve aşama olayları dört Streams shard'ına yazılır; oradan sonra iletim yolu Scan'inkiyle aynıdır.
Streams
k8s-redis-streamsveri akışı: XREADGROUPEvent Routerk8s-event-routerEvent Router bunları bir consumer group olarak okur ve işledikten sonra XACK eder; pending ve reclaim iletimi at-least-once tutar.
Event Router
k8s-event-routerveri akışı: PUBLISHPub/Subk8s-redis-pubsubShard Pub/Sub'da işin kanalında gerçek zamanlı iletilir.
Pub/Sub
k8s-redis-pubsubveri akışı: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway süreç başına tek bir paylaşılan listener ile abone olur ve bağlı her tarayıcıya dağıtır.
SSE Gateway
k8s-sse-gatewayveri akışı: SSE akışıTarayıcıAynı ALB ve ingress yolu üzerinden açılan bir bağlantı. İletim at-least-once'tır; kopyalar idempotent biçimde işlenir.
chat-worker
k8s-worker-ai · k8s-worker-ai-2veri akışı: checkpointCachek8s-redis-cacheLangGraph checkpoint'i Redis Cache'te tutulur.
Cache
k8s-redis-cacheveri akışı: checkpoint okucheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer, checkpoint'i Redis'ten okur.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2veri akışı: PostgreSQL'e eşitlePostgreSQLk8s-postgresqlAsyncPostgresSaver onu PostgreSQL'e eşzamansız olarak kaydeder.
Streams
k8s-redis-streamsveri akışı: chat-persistence grouppersistence consumerk8s-api-chatChat düğümündeki persistence consumer, done olaylarını bir consumer group olarak okur.
persistence consumer
k8s-api-chatveri akışı: mesajları kaydetPostgreSQLk8s-postgresqlChat mesajları PostgreSQL'e kaydedilir. Bu, checkpoint-syncer'dan farklı bir iş yüküdür.
Giriş · kimlik doğrulama
Kümenin girişinden bir Domain API'ye uzanan eşzamanlı yol. Yalnızca politikayla korunan yollar önce kimlik doğrulamayı kontrol eder; düğümler arası Pod trafiği Calico VXLAN üzerinde çalışır.
TarayıcıDNS sorgusu: DNS sorgusuRoute 53
Route 53 kayıtlarından yalnızca ad çözümlenir. İstekler DNS'ten geçmez.
Tarayıcıveri akışı: HTTPS 443AWS ALB
TLS, ALB'de sonlanır.
AWS ALBveri akışı: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayEC2 instance hedefinin NodePort'u üzerinden Istio ingress Envoy'a aktarılır.
Istio ingress Envoy
k8s-ingress-gatewayveri akışı: ext-authz · gRPC 50051ext-authzk8s-api-authYalnızca CUSTOM politikası altındaki yollar önce Go ext-authz'a sorar (2 sn zaman aşımı, failOpen false). login, health ve docs gibi yollar hariç tutulur.
ext-authz
k8s-api-authveri akışı: blacklist sorgusublacklistk8s-redis-authToken, Redis blacklist'ine karşı kontrol edilir.
Istio ingress Envoy
k8s-ingress-gatewayveri akışı: VirtualServiceChat APIk8s-api-chatChat API'ye yönlendirilir.
Chat API
k8s-api-chatveri akışı: gRPCimages APIk8s-api-imageREADME'de adı geçen chat → images eşzamanlı çağrısı.
auth API
k8s-api-authveri akışı: gRPCusers APIk8s-api-usersREADME'de adı geçen auth → users eşzamanlı çağrısı.
Storage havuzu · eşzamansız yazmalar
Kimlik doğrulama blacklist'i ve karakter sahipliği, işlerini RabbitMQ'dan alan storage havuzu worker'ları tarafından saklanır.
blacklist
k8s-redis-authveri akışı: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (README'deki auth-Bus) Redis outbox'ını okur.
auth-relay
k8s-worker-storage · k8s-worker-storage-2veri akışı: blacklist.eventsRabbitMQk8s-rabbitmqYeniden denemeler ve bir DLQ ile RabbitMQ'ya yeniden yayımlar.
RabbitMQ
k8s-rabbitmqveri akışı: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker blacklist olaylarını alır.
auth-worker
k8s-worker-storage · k8s-worker-storage-2veri akışı: blacklist'i kaydetblacklistk8s-redis-authRedis blacklist'ine kaydedilirler.
RabbitMQ
k8s-rabbitmqveri akışı: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker karakter sahipliği işlerini toplu olarak alır.
users-worker
k8s-worker-storage · k8s-worker-storage-2veri akışı: UPSERTPostgreSQLk8s-postgresqlPostgreSQL'e uygulanır.
Yapılandır · ölçekle · gözlemle
Platform Layer isteklerin geçtiği bir adım değildir; diğer katmanları dağıtır, yapılandırır, ölçekler ve gözlemler. Düğümler Terraform ile oluşturulmuş EC2 örnekleridir; kubeadm ve Calico'yu Ansible kurar. CI yalnızca Terraform'u doğrular, asla otomatik olarak apply etmez.
GitHub Actions · Docker Hubyapılandırma · ölçekleme: image · manifest revizyonuArgo CD image updater
k8s-masterArgo CD, küme yapılandırmasını App-of-Apps ve Sync Wave'ler aracılığıyla hizalar. Control-plane yerleşimi yalnızca image updater için doğrulandı.
ALB Controller · ExternalDNS
k8s-masteryapılandırma · ölçekleme: Ingress → ALB · DNS kayıtlarıAWS yönetimliALB Controller ve ExternalDNS AWS tarafındaki kaynakları yapılandırır. Bu, isteklerin izlediği bir yol değildir.
Istiod
k8s-masteryapılandırma · ölçekleme: xDS yapılandırmasıIstio ingress Envoyk8s-ingress-gatewayIstiod, Gateway, VirtualService ve EnvoyFilter yapılandırmasını xDS üzerinden ingress Envoy'a ve her API'nin Envoy sidecar'ına iletir.
KEDA
k8s-monitoringyapılandırma · ölçekleme: pod sayısıAI havuzuk8s-worker-ai · k8s-worker-ai-2KEDA worker pod sayılarını ayarlar. Düğüm sayısı değişmez.
KEDA
k8s-monitoringyapılandırma · ölçekleme: pod sayısıstorage havuzuk8s-worker-storage · k8s-worker-storage-2storage havuzundaki worker pod'ları da aynı şekilde ölçeklenir.
Fluent Bitgözlemlenebilirlik: günlüklerElasticsearch
k8s-loggingFluent Bit her düğümde bir DaemonSet'tir ve günlükleri Elasticsearch'e gönderir.
AI havuzu
k8s-worker-ai · k8s-worker-ai-2gözlemlenebilirlik: LLM çalıştırma izlemeLangSmithLLM çağrı izleri harici bir SaaS olan LangSmith'e gider.
Her bağlantı aynı kalınlıkta. Yalnızca yolunu numaralı adımlarla vurgulamak için bir akış seçin.
- Düz çizgi · isteklerin, işlerin, olayların ve yazmaların akış yönü
- Noktalı · DNS sorgusu; istekler buradan geçmez
- Kesikli · yapılandırma ya da ölçekleme; bir veri yolu değil
- Uzun çizgi-nokta · günlükler ve çalıştırma izleme
- Kalın siyah çizgi · seçilen akış; numaralar sırayı verir
- Kutu · fiziksel bir düğüm, ana makine adı başlığında
- İç çip · o düğümde çalışan bir iş yükü
- Kesikli çerçeve · iki düğümlü bir zamanlama havuzu
- Kesikli kutu · kümenin dışı, düğüm olarak sayılmaz
- Turuncu çerçeve · bir modelin karar verdiği yer
- Control plane1 düğüm
- Domain API8 düğüm
- AI havuzu2 düğüm
- storage havuzu2 düğüm
- Data5 düğüm
- Platform6 düğüm
README'nin beş katmanı (bantlar) ve fiziksel gruplar (her düğüm başlığının tonu) aynı 24 düğümü farklı biçimde gruplar. State KV, Streams düğümünü paylaşır ve ayrıca sayılmaz; Route 53, ALB ve küme dışındaki hizmetler düğüm değildir. Bir havuz bir zamanlama aralığıdır; her pod'un iki düğümde de çalıştığı iddiası değildir.
24düğüm
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd ile platform denetleyicileri.
- k8s-master
8Domain API
domain: <hizmet>Alan başına bir düğüm. İç çağrılar gRPC kullanır.
- 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
Her biri iki düğümlü iki zamanlama havuzu. KEDA pod sayılarını değiştirir; düğüm sayısı aynı kalır.
storage havuzu
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI havuzu
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis amaca özgü dört düğüme bölünmüştür. PostgreSQL depolaması EBS CSI · gp3'tür.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Mesajlaşma, gözlemlenebilirlik, ingress ve gerçek zamanlı iletimin her birinin kendi düğümü vardır.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Her düğüm
- Fluent Bit · DaemonSet
- Calico
Yapılandırılmış modeller · sağlayıcıya göre
Hizmet kapatıldığı için bunlar bugün seçilebilecek modeller değil, depoda yapılandırılmış modellerdir. Her rol ayrı listelenir; doğrulanmış çalıştırmaların listesi değildir.
OpenAI
Chat varsayılan sağlayıcısı
Chat
openai/gpt-5.2varsayılan
Varsayılan model gpt-5.2'dir; istekte bir model belirtilirse o kullanılır.
Scan
gpt-5.2varsayılangpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
13 modellik eşlemenin dışındaki modeller reddedilir.
Görsel eşlemesi
gpt-image-1.5
Responses orkestrasyon modeli gpt-5.2'den ayrıdır. Görsel üretimi varsayılan olarak kapalıdır.
Değerlendirme
gpt-4o-minivarsayılan
Konuşma değerlendirmesi için LLM puanlayıcı; Chat modelinden ayrıdır.
Google
Chat Google'ı seçtiğinde
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Google seçildiğinde varsayılan gemini-3-flash-preview'dur.
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
Görsel eşlemesi
gemini-3-pro-image-preview
Kaynakbackend main d8840c7Herkese açık commit September 29, 2026 · kontrol October 8, 2026