Skip to content

System Design

Dendra is a modern, scalable, cloud-based system for managing and querying environmental data. Dendra Release 3 operates on two core server executables: API Server and Job Scheduler. Workers are additional executables, and are designed as hosts for various job types (ingestion, orchestration, etc.). A variety of third-party services are used to support the system, including databases, object stores, and messaging systems.

Our production system is hosted on NSF’s ACCESS Jetstream2 where we manage our own Kuberernetes clusters at the The Indiana University Jetstream2 supercomputing center.

While Dendra is a SaaS platform (meaning we host the system for you and you don’t need to worry about the infrastructure), the core system and many third-party services can be scaled down to run on a home server for development and testing.

Core system components and their relationships in Dendra Release 3.

architecture-beta
    group platform[Platform]
    service apiserver(mdi:api)[API Server] in platform
    service metadata(logos:aws-documentdb)[Metadata] in platform
    service platformkv(logos:aws-dynamodb)[KV Cache] in platform
    service search(logos:aws-open-search)[Search] in platform

    apiserver:T -- B:metadata
    apiserver:L -- R:platformkv
    apiserver:L --> R:search

    group jobprocessing[Job Processing]
    service scheduler(mdi:timer-cog-outline)[Job Scheduler] in jobprocessing
    service workerbus(logos:aws-eventbridge)[Worker Messaging] in jobprocessing
    service workers(mdi:cogs)[Workers] in jobprocessing
    service jobkv(logos:aws-dynamodb)[KV Cache] in jobprocessing

    workerbus:T -- B:scheduler
    workers:L -- R:workerbus
    workers:R -- L:jobkv
    workers:T --> B:apiserver

    group storage[Storage]
    service messages(logos:aws-mq)["Events/Data Streaming"] in storage
    service objectstores(logos:aws-s3)[Object Stores] in storage
    service timeseriesdbs(logos:aws-timestream)[Timeseries DBs] in storage

    apiserver:B --> T:scheduler
    apiserver{group}:R -- L:objectstores{group}
    apiserver{group}:R -- L:messages{group}
    apiserver{group}:R -- L:timeseriesdbs{group}

    workers{group}:T -- B:objectstores{group}
    workers{group}:T -- B:messages{group}
    workers{group}:T -- B:timeseriesdbs{group}
ComponentDescription
API ServerMain API server that handles requests from applications and API clients.
Events/Data StreamingEvent bus for resource change events and persistence engine for data streaming.
Job SchedulerScheduler that coordinates job processing across workers.
KV CacheKey/value store and cache.
MetadataDatabase for storing metadata (stations, sites, datastreams, etc.). Dendra has the option to store metadata in different databases to separate concerns and to support scaling.
Object StoresS3-compatible object stores for files, images and working datasets. Dendra can utilize multiple object stores for different security, scalability, and performance purposes.
SearchSelf-hosted Search Engine for full-text, semantic, and vector search to support cross-org metadata and data retrieval.
Timeseries DBsDatabases for storing timestamped data — accessed through tables. Dendra can utilize multiple timeseries databases and technologies for different orgs, timeframes, and purposes.
Worker MessagingEvent bus and queue group that handles communication between workers and the scheduler.
WorkersProcessors (executables) that handle various job types (ingestion, orchestration, etc.).

How applications and API clients interact with the Platform API and external services.

architecture-beta
    group apps[Apps]
    service mainapp(mdi:application-brackets)[Main App] in apps

    group platform[Platform]
    service apiserver(mdi:api)[API Server] in platform

    service auth(logos:aws-iam)[Auth IAM]
    service maps(logos:google-maps)[Maps]

    mainapp{group}:L -- R:auth
    mainapp{group}:B -- T:maps
    mainapp{group}:T --> B:apiserver

    service analytics(logos:google-analytics)[Analytics]

    analytics:L -- R:apiserver
    analytics:B -- R:mainapp{group}

    service apiclient(mdi:account-hard-hat)[API Client]

    apiclient:R --> L:apiserver
ComponentDescription
AnalyticsThird-party analytics for monitoring app and API usage. We use Plausible and PostHog.
API ClientAny user, developer, or tool interacting with the Platform API.
API ServerMain API server that handles requests from applications and API clients.
Auth IAMExternal IAM (Identity and Access Management) service for user authentication and base permissions.
Main AppThe main web app that allows users to query and manage the Dendra system.
MapsThird-party maps service for rendering maps (Google Maps, Mapbox, etc.).

How the workers interact with external services.

architecture-beta
    group jobprocessing[Job Processing]

    service workers(mdi:cogs)[Workers] in jobprocessing

    service mail(logos:aws-ses)[Mail Delivery]
    service slack(logos:slack-icon)[Slack]
    service dataproviders(cloud)[Data Providers]

    workers:R -- L:dataproviders
    workers:R -- L:mail
    workers:R -- L:slack
ComponentDescription
Data ProvidersThird-party time-series and metadata providers (Campbell Scientific, LI-COR, GOES, etc.).
Mail DeliveryThird-party mail delivery service for sending emails.
SlackThird-party real-time messaging service for sending messages.
WorkersProcessors that handle various job types (ingestion, orchestration, etc.).

Other services that are not part of the Dendra system but are still part of running and maintaining Dendra as a whole.

architecture-beta
    service systemmonitoring(mdi:monitor-eye)[System Monitoring]
    service statuspage(mdi:lan-check)[Status Page]
    service mainsite(mdi:home)[Main Site]
    service docsite(mdi:help-circle-outline)[Docs Site]
ComponentDescription
Docs SiteDocumentation website for Dendra (this site).
Main SiteMain public website for the Dendra Science.
Status PageStatus page for the production Dendra system.
System MonitoringThird-party system monitoring services for tracking the health and performance of the Dendra system.