
Eco²
Backend · Cloud infrastructure
إرشاد إعادة التدوير من صورة واحدة ومحادثة.
مساعد ذكاء اصطناعي متكامل يفهم كيف تعمل إعادة التدوير في كوريا.
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: استعلام DNSRoute 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-2يتسلّمها scan-worker (Celery · gevent) في مجمّع AI ويشغّل Vision → Rule → Answer → Reward. والمراحل الأربع مهام Celery مسلسلة، لا عُقد.
مجمّع AI
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: HTTPSLLM APIتستدعي عمليات worker لـ scan وchat واجهاتِ API لدى OpenAI وGoogle.
scan-worker
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: XADD scan:eventsStreamsk8s-redis-streamsتُكتب أحداث التقدم في واحد من أربعة shards في Streams.
Streams
k8s-redis-streamsتدفق البيانات: XREADGROUPEvent Routerk8s-event-routerيقرؤها Event Router بوصفه consumer group وينفّذ 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تُسلَّم فوريًا على قناة العملية في shard Pub/Sub.
Pub/Sub
k8s-redis-pubsubتدفق البيانات: SUBSCRIBESSE Gatewayk8s-sse-gatewayيشترك SSE Gateway عبر listener مشترك واحد لكل عملية، ويوزّع على كل متصفح متصل.
SSE Gateway
k8s-sse-gatewayتدفق البيانات: بث SSEالمتصفحاتصال مفتوح عبر مسار ALB وingress نفسه. والتسليم at-least-once، وتُعالج النسخ المكررة على نحو idempotent.
State KV
k8s-redis-streamsتدفق البيانات: الاستعادة عند إعادة الاتصالSSE Gatewayk8s-sse-gatewayعند إعادة الاتصال مع Last-Event-ID، يملأ State KV وStreams المحفوظة الأحداثَ الفائتة.
Chat · الرموز والتخزين
تسلك رموز Chat مسار الأحداث نفسه الذي يسلكه Scan، ويخزّن حملا عمل مختلفان نقاط checkpoint والرسائل.
المتصفحتدفق البيانات: 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-2يصنّف chat-worker (Taskiq · asyncio) النية باستخدام LangGraph، ثم يشغّل vision عند الحاجة والأدوات المختارة والـ aggregator وملخصًا عند الحاجة، ثم يجيب. ولا يشغّل كل طلب إلا الفروع التي يحتاجها.
مجمّع AI
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: HTTPSLLM APIتستدعي عمليات worker لـ scan وchat واجهاتِ API لدى OpenAI وGoogle.
chat-worker
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: XADD chat:eventsStreamsk8s-redis-streamsتُكتب الرموز وأحداث المراحل في أربعة shards في Streams، ومن هناك يكون مسار التسليم مثل مسار Scan.
Streams
k8s-redis-streamsتدفق البيانات: XREADGROUPEvent Routerk8s-event-routerيقرؤها Event Router بوصفه consumer group وينفّذ XACK بعد المعالجة، ويحافظ pending وreclaim على التسليم at-least-once.
Event Router
k8s-event-routerتدفق البيانات: PUBLISHPub/Subk8s-redis-pubsubتُسلَّم فوريًا على قناة العملية في shard Pub/Sub.
Pub/Sub
k8s-redis-pubsubتدفق البيانات: SUBSCRIBESSE Gatewayk8s-sse-gatewayيشترك SSE Gateway عبر listener مشترك واحد لكل عملية، ويوزّع على كل متصفح متصل.
SSE Gateway
k8s-sse-gatewayتدفق البيانات: بث SSEالمتصفحاتصال مفتوح عبر مسار ALB وingress نفسه. والتسليم at-least-once، وتُعالج النسخ المكررة على نحو idempotent.
chat-worker
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: checkpointCachek8s-redis-cacheيُحفظ checkpoint الخاص بـ LangGraph في Redis Cache.
Cache
k8s-redis-cacheتدفق البيانات: قراءة checkpointcheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2يقرأ checkpoint-syncer الـ checkpoint من Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2تدفق البيانات: المزامنة إلى PostgreSQLPostgreSQLk8s-postgresqlيخزّنه AsyncPostgresSaver في PostgreSQL على نحو غير متزامن.
Streams
k8s-redis-streamsتدفق البيانات: chat-persistence grouppersistence consumerk8s-api-chatيقرأ persistence consumer على عقدة Chat أحداث done بوصفه consumer group.
persistence consumer
k8s-api-chatتدفق البيانات: حفظ الرسائلPostgreSQLk8s-postgresqlتُحفظ رسائل Chat في PostgreSQL. وهذا حمل عمل مختلف عن checkpoint-syncer.
الدخول · المصادقة
المسار المتزامن من مدخل العنقود إلى Domain API. ولا تفحص المصادقة أولًا إلا المسارات المحمية بسياسة، وتجري حركة Pods بين العُقد على Calico VXLAN.
المتصفحاستعلام DNS: استعلام DNSRoute 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لا تسأل Go ext-authz أولًا إلا المسارات الخاضعة لسياسة CUSTOM (مهلة 2 ثانية، failOpen false). وتُستثنى مسارات مثل login وhealth وdocs.
ext-authz
k8s-api-authتدفق البيانات: استعلام blacklistblacklistk8s-redis-authيُفحص رمز المصادقة مقابل blacklist في 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.
مجمّع storage · كتابات غير متزامنة
تُخزّن blacklist المصادقة وملكية الشخصيات بواسطة workers في مجمّع storage تأخذ عملها من RabbitMQ.
blacklist
k8s-redis-authتدفق البيانات: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2يقرأ auth-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-2يتلقى auth-worker أحداث blacklist.
auth-worker
k8s-worker-storage · k8s-worker-storage-2تدفق البيانات: تخزين blacklistblacklistk8s-redis-authتُخزَّن في blacklist على Redis.
RabbitMQ
k8s-rabbitmqتدفق البيانات: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2يتلقى users-worker أعمال ملكية الشخصيات على دفعات.
users-worker
k8s-worker-storage · k8s-worker-storage-2تدفق البيانات: UPSERTPostgreSQLk8s-postgresqlتُطبَّق على PostgreSQL.
التهيئة · التوسيع · المراقبة
Platform Layer ليست خطوة تمر بها الطلبات، بل تنشر الطبقات الأخرى وتهيّئها وتوسّعها وتراقبها. والعُقد مثيلات EC2 أنشأها Terraform، ثبّت عليها Ansible كلًّا من kubeadm وCalico، ولا يتحقق CI إلا من Terraform ولا يطبّقه تلقائيًا أبدًا.
GitHub Actions · Docker Hubتهيئة · توسيع: الصورة · نسخة manifestArgo CD image updater
k8s-masterيواءم Argo CD إعداد العنقود عبر App-of-Apps وSync Waves. ولم يُتأكد من الوضع على control-plane إلا لـ image updater.
ALB Controller · ExternalDNS
k8s-masterتهيئة · توسيع: Ingress → ALB · سجلات DNSمُدار من AWSيهيّئ ALB Controller وExternalDNS الموارد على جانب AWS. وليس هذا مسارًا تسلكه الطلبات.
Istiod
k8s-masterتهيئة · توسيع: إعداد xDSIstio ingress Envoyk8s-ingress-gatewayيدفع Istiod إعداد Gateway وVirtualService وEnvoyFilter عبر xDS إلى ingress Envoy وإلى Envoy sidecar لكل API.
KEDA
k8s-monitoringتهيئة · توسيع: عدد Podsمجمّع AIk8s-worker-ai · k8s-worker-ai-2يضبط KEDA أعداد Pods الخاصة بـ worker. ولا يتغير عدد العُقد.
KEDA
k8s-monitoringتهيئة · توسيع: عدد Podsمجمّع storagek8s-worker-storage · k8s-worker-storage-2وتُوسَّع Pods الخاصة بـ worker في مجمّع storage بالطريقة نفسها.
Fluent Bitالمراقبة: السجلاتElasticsearch
k8s-loggingFluent Bit هو DaemonSet على كل عقدة، ويرسل السجلات إلى Elasticsearch.
مجمّع AI
k8s-worker-ai · k8s-worker-ai-2المراقبة: تتبّع تشغيلات LLMLangSmithتذهب آثار استدعاءات LLM إلى LangSmith، وهي SaaS خارجية.
كل الروابط بالسماكة نفسها. اختر مسارًا لإبراز طريقه وحده، مع خطوات مرقّمة.
- خط متصل · اتجاه تدفق الطلبات والعمل والأحداث والكتابات
- خط منقّط · استعلام DNS، ولا تمر الطلبات عبره
- خط متقطع · تهيئة أو توسيع، وليس مسار بيانات
- شرطة طويلة ونقطة · السجلات وتتبّع التشغيل
- خط أسود سميك · المسار المختار، والأرقام تبيّن الترتيب
- مربع · عقدة مادية، واسم المضيف في الترويسة
- شريحة داخلية · حمل عمل يعمل على تلك العقدة
- إطار متقطع · مجمّع جدولة من عقدتين
- مربع متقطع · خارج العنقود، ولا يُحسب عقدة
- إطار برتقالي · حيث يقرر نموذج
- Control planeعقدة واحدة
- Domain API8 عُقد
- مجمّع AIعقدتان
- مجمّع storageعقدتان
- Data5 عُقد
- Platform6 عُقد
تجمّع طبقات README الخمس (الأشرطة) والمجموعات المادية (لون ترويسة كل عقدة) العُقدَ الـ 24 نفسها تجميعًا مختلفًا. ويتشارك State KV عقدة Streams فلا يُحسب على حدة، وليست Route 53 وALB والخدمات خارج العنقود عُقدًا. والمجمّع نطاق جدولة، لا ادعاء بأن كل Pod يعمل على العقدتين كلتيهما.
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 أعداد Pods، ويبقى عدد العُقد كما هو.
مجمّع storage
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إيداع عام September 29, 2026 · فُحص October 8, 2026