# ngnquanq/credit-risk-ml-system architecture

> Architecture diagram of the GitHub repository ngnquanq/credit-risk-ml-system, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ngnquanq/credit-risk-ml-system
- Repository: https://github.com/ngnquanq/credit-risk-ml-system

## Overview

This is a credit-risk decisioning platform: a loan is submitted through the API, persisted, enriched through CDC-driven feature streams, materialized in Feast/Redis, and scored by a model service; the score is published to Kafka. Training and registration form a separate model-lifecycle branch. The README documents the end-to-end stream topology, while sampled source confirms API/workflow structure, persistence, Feast setup, and scoring behavior; links within unsampled stream and deployment components follow the documented architecture.

Main entry points: [`application/feast_repo/repository.py`](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/feast_repo/repository.py) (Feast Feature Store), [`application/scoring/service.py`](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/scoring/service.py) (BentoML Scoring), [`application/entrypoints/feature_consumer.py`](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/feature_consumer.py) (DWH Feature Consumer), [`application/entrypoints/api/main.py`](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/api/main.py) (Loan API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_intake["Loan Intake"]
  node_api["Loan API<br/>[main.py]"]
  node_workflow["Submit Workflow<br/>[submit_loan.py]"]
  node_loan_db[("PostgreSQL")]
end

subgraph group_features["Feature Engineering"]
  node_cdc["Debezium CDC"]
  node_kafka["Kafka Topics"]
  node_bureau_consumer["Bureau Consumer<br/>[bureau_consumer.py]"]
  node_feature_consumer["DWH Feature Consumer"]
  node_bureau_flink["Bureau Aggregation"]
  node_app_flink["Application CDC ETL"]
  node_feast["Feast Feature Store<br/>[repository.py]"]
  node_redis[("Redis Online Store")]
  node_clickhouse[("ClickHouse Sources")]
end

subgraph group_decision["Online Decisioning"]
  node_feature_ready["Feature Ready Event"]
  node_sequence["Knative Sequence"]
  node_scoring["BentoML Scoring<br/>[service.py]"]
  node_scoring_topic["Scoring Topic"]
end

subgraph group_lifecycle["Model Lifecycle"]
  node_model["Registered Model<br/>[model_registry.py]"]
  node_trainer["Training Jobs<br/>[train_register.py]"]
  node_training_pipeline["Kubeflow Pipeline<br/>[pipeline.py]"]
  node_mlflow[("MLflow Registry")]
end

subgraph group_experience["User Experience"]
  node_dashboard["Frontend Dashboard<br/>[frontend.py]"]
end

node_applicant(("Applicant"))

node_applicant -->|"submits application"| node_api
node_api -->|"delegates submission"| node_workflow
node_workflow -->|"persists application"| node_loan_db
node_loan_db -->|"captures changes"| node_cdc
node_cdc -->|"publishes changes"| node_kafka
node_kafka -->|"streams application data"| node_app_flink
node_app_flink -->|"produces features"| node_feast
node_kafka -->|"streams bureau events"| node_bureau_consumer
node_bureau_consumer -->|"forwards bureau data"| node_bureau_flink
node_bureau_flink -->|"produces aggregates"| node_feast
node_kafka -->|"streams feature events"| node_feature_consumer
node_feature_consumer -->|"fetches DWH data"| node_clickhouse
node_clickhouse -->|"returns records"| node_feature_consumer
node_feature_consumer -->|"produces DWH features"| node_feast
node_feast -->|"materializes features"| node_redis
node_feast -->|"emits readiness event"| node_feature_ready
node_feature_ready -->|"triggers scoring"| node_sequence
node_sequence -->|"dispatches event"| node_scoring
node_scoring -->|"reads online features"| node_feast
node_scoring -->|"loads model"| node_model
node_scoring -->|"publishes prediction"| node_scoring_topic
node_trainer -->|"registers model"| node_mlflow
node_training_pipeline -->|"trains and registers"| node_mlflow
node_mlflow -->|"stores artifacts"| node_model
node_dashboard -.->|"uses API"| node_api

click node_api "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/api/main.py"
click node_workflow "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/workflows/submit_loan.py"
click node_bureau_consumer "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/bureau_consumer.py"
click node_feature_consumer "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/feature_consumer.py"
click node_bureau_flink "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/flink/jobs/bureau_aggregation_etl.py"
click node_app_flink "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/flink/jobs/cdc_application_etl.py"
click node_feast "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/feast_repo/repository.py"
click node_scoring "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/scoring/service.py"
click node_model "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/scoring/model_registry.py"
click node_trainer "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/training/train_register.py"
click node_training_pipeline "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/platform/ml/k8s/training-pipeline/pipeline.py"
click node_dashboard "https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/frontend/frontend.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_api,node_workflow,node_loan_db toneBlue
class node_cdc,node_kafka,node_bureau_consumer,node_feature_consumer,node_bureau_flink,node_app_flink,node_feast,node_redis,node_clickhouse toneAmber
class node_feature_ready,node_sequence,node_scoring,node_scoring_topic toneMint
class node_model,node_trainer,node_training_pipeline,node_mlflow toneRose
class node_dashboard,node_applicant toneIndigo
```

## Components

### Loan Intake

- [Loan API](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/api/main.py): `application/entrypoints/api/main.py`
- [Submit Workflow](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/workflows/submit_loan.py): `application/workflows/submit_loan.py`
- **PostgreSQL**

### Feature Engineering

- **Debezium CDC**
- **Kafka Topics**
- [Bureau Consumer](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/bureau_consumer.py): `application/entrypoints/bureau_consumer.py`
- [DWH Feature Consumer](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/entrypoints/feature_consumer.py): `application/entrypoints/feature_consumer.py`
- [Bureau Aggregation](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/flink/jobs/bureau_aggregation_etl.py): `application/flink/jobs/bureau_aggregation_etl.py`
- [Application CDC ETL](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/flink/jobs/cdc_application_etl.py): `application/flink/jobs/cdc_application_etl.py`
- [Feast Feature Store](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/feast_repo/repository.py): `application/feast_repo/repository.py`
- **Redis Online Store**
- **ClickHouse Sources**

### Online Decisioning

- **Feature Ready Event**
- **Knative Sequence**
- [BentoML Scoring](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/scoring/service.py): `application/scoring/service.py`
- **Scoring Topic**

### Model Lifecycle

- [Registered Model](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/scoring/model_registry.py): `application/scoring/model_registry.py`
- [Training Jobs](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/training/train_register.py): `application/training/train_register.py`
- [Kubeflow Pipeline](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/platform/ml/k8s/training-pipeline/pipeline.py): `platform/ml/k8s/training-pipeline/pipeline.py`
- **MLflow Registry**

### User Experience

- [Frontend Dashboard](https://github.com/ngnquanq/credit-risk-ml-system/blob/master/application/frontend/frontend.py): `application/frontend/frontend.py`

### Other components

- **Applicant**

## Connections

- Applicant → Loan API: submits application
- Loan API → Submit Workflow: delegates submission
- Submit Workflow → PostgreSQL: persists application
- PostgreSQL → Debezium CDC: captures changes
- Debezium CDC → Kafka Topics: publishes changes
- Kafka Topics → Application CDC ETL: streams application data
- Application CDC ETL → Feast Feature Store: produces features
- Kafka Topics → Bureau Consumer: streams bureau events
- Bureau Consumer → Bureau Aggregation: forwards bureau data
- Bureau Aggregation → Feast Feature Store: produces aggregates
- Kafka Topics → DWH Feature Consumer: streams feature events
- DWH Feature Consumer → ClickHouse Sources: fetches DWH data
- ClickHouse Sources → DWH Feature Consumer: returns records
- DWH Feature Consumer → Feast Feature Store: produces DWH features
- Feast Feature Store → Redis Online Store: materializes features
- Feast Feature Store → Feature Ready Event: emits readiness event
- Feature Ready Event → Knative Sequence: triggers scoring
- Knative Sequence → BentoML Scoring: dispatches event
- BentoML Scoring → Feast Feature Store: reads online features
- BentoML Scoring → Registered Model: loads model
- BentoML Scoring → Scoring Topic: publishes prediction
- Training Jobs → MLflow Registry: registers model
- Kubeflow Pipeline → MLflow Registry: trains and registers
- MLflow Registry → Registered Model: stores artifacts
- Frontend Dashboard → Loan API: uses API
