Skip to content

Islandora Architecture

At its core, Islandora is a Drupal website that leverages a suite of Microservices. To help illustrate this, different site operations are described below.

  • The diagram under Islandora is a Drupal Website describes how a typical web page is displayed when a site visitor arrives at an Islandora repository on the internet. How most HTML responses are generated for Islandora sites are identical to any Drupal website that integrates with Solr. The exception being Islandora's IIIF integration, which is explained in a bit more detail in IIIF Integration
  • The diagrams under Microservices explain how events are emitted from an Islandora Drupal website and processed by Islandora's event driven architecture
  • Components is a list of software used in the Islandora tech stack

Islandora is a Drupal Website

When a client visits an Islandora website, the request flow looks like a typical Drupal request. The request is received by NGINX, which forwards the request to Drupal. Drupal bootstraps and queries MariaDB to generate an HTML response. If the request was for a search page, Drupal may also query Solr to include search results in the HTML response.

flowchart TD
    user([Client / Browser])
    user e1@-->|HTTP request| nginx

    subgraph webserver[Nginx Web Server]
        nginx[Nginx] e2@-->|forward request| drupal[Drupal]
    end

    drupal e3@-->|query| mariadb[(MariaDB)]
    drupal e4@-->|query| solr[(Solr)]

    mariadb e6@-.->|data| drupal
    solr e7@-.->|results| drupal
    drupal e9@-.->|HTML response| nginx
    nginx e10@-.->|HTML response| user

    class e1 flow0;
    class e2 flow1;
    class e3 flow2;
    class e4 flow2;
    class e5 flow2;
    class e6 flow3;
    class e7 flow3;
    class e8 flow3;
    class e9 flow4;
    class e10 flow5;

IIIF Integration

For some Resource Nodes in Islandora, the HTML response may include a link to a IIIF Manifest that is dynamically generated by Drupal for the given node. This typically happens when rendering Resource Nodes that have image media. For these types of requests, Islandora's IIIF module may also query the Cantaloupe IIIF server for metadata needed to generate the IIIF Manifest. The IIIF viewer configured on the Islandora site (e.g. OpenSeadragon or Mirador) will communicate with Cantaloupe to render the image(s) included in the IIIF Manifest.

All this to say, in addition to the typical drupal request flow, Drupal may also query Cantaloupe for basic image metadata (e.g. height/width) which are needed to generate a valid IIIF Manifest. The client's web browser will then read that IIIF Manifest using Javascript and the IIIF viewer will GET the images referenced in the IIIF Manifest from Cantaloupe.

flowchart TD
    user([Client / Browser])
    user e1@-->|GET IIIF Manifest| nginx

    subgraph webserver[Nginx Web Server]
        nginx[Nginx] e2@-->|forward request| drupal[Drupal]
    end

    drupal e3@-->|GET /info.json| cantaloupe[Cantaloupe IIIF Image Server]

    cantaloupe e4@-->|info.json| drupal
    drupal e5@-.->|HTML response| nginx
    nginx e6@-.->|HTML response| user
    user e7@-->|GET /image.png| cantaloupe
    cantaloupe e8@-.->|image.png| user

    class e1 flow0;
    class e2 flow1;
    class e3 flow2;
    class e4 flow3;
    class e5 flow4;
    class e6 flow5;
    class e7 flow6;
    class e8 flow7;
    class e9 flow8;

Fedora Flysystem Adapter

Islandora uses Flysystem and the associated Drupal module to store Drupal managed files in Fedora (Repository Software).

You can read more about this in Islandora's Flysystem documentation.

Microservices

In addition to all the tools Drupal provides, Islandora extends the Drupal site's capabilities using an event-driven architecture of Microservices. When a repository manager creates, updates, or deletes Drupal entities, Islandora records durable work in Drupal and dispatches a message through Symfony Messenger for asynchronous processing.

There are two different types of events Islandora emits:

  • Derivative Events - these types of events create derivatives from files uploaded to Islandora
  • Index Events - these types of events create an indexed representation of a Resource Node in a system external to Drupal

Derivative Events

Below is a simplified diagram of the derivative flow. Drupal queues a derivative job, a Messenger worker receives it, and the worker invokes the configured derivative service. By default, worker processes run in the Drupal deployment. CPU-intensive or memory-intensive derivative work can also be distributed to external services. See Scaling Islandora Events for the deployment patterns and operator guidance.

flowchart TD
    drupal([Islandora Drupal Website])

    drupal e1@-->|queues derivative job + ledger record| messenger

    subgraph runtime[Drupal Messenger Runtime]
        messenger[Symfony Messenger + sm_ledger]
        worker[Derivative Worker]
        messenger e2@-->|worker receives derivative message| worker
    end

    subgraph microservices[scyllaridae microservices]
        fits[FITS]
        homarus[Homarus]
        houdini[Houdini]
        hypercube[Hypercube]
    end

    worker --> fits
    worker --> homarus
    worker e3@--> houdini
    worker --> hypercube

    fits -.->|derivative streamed back| worker
    homarus -.->|derivative streamed back| worker
    houdini e4@-.->|derivative streamed back| worker
    hypercube -.->|derivative streamed back| worker

    worker e5@-.->|worker saves derivative + updates ledger| drupal

    class e1 flow0;
    class e2 flow1;
    class e3 flow2;
    class e4 flow3;
    class e5 flow4;

Index Events

Drupal dispatches indexing work through Symfony Messenger-backed workers that write directly to Blazegraph and Fedora (Repository Software). Like the derivative flow, the worker runtime can stay in the Drupal deployment or be scaled out by moving transport or downstream execution to separate services. See Scaling Islandora Events for those scaling patterns.

flowchart TD
    drupal([Islandora Drupal Website])

    drupal e1@-->|queues index job + ledger record| messenger

    subgraph runtime[Drupal Messenger Runtime]
        messenger[Symfony Messenger + sm_ledger]
        worker[Index Worker]
        messenger e2@-->|worker receives index message| worker
    end

    fedora_indexer[Fedora indexer]
    blazegraph_indexer[Blazegraph indexer]

    worker e3@--> fedora_indexer
    worker --> blazegraph_indexer

    fedora[(Fedora)]
    fedora_indexer e4@-.->|syncs resource to| fedora

    triplestore[(Blazegraph)]
    blazegraph_indexer -.->|writes RDF to| triplestore

    worker e5@-.->|worker updates ledger| drupal

    class e1 flow0;
    class e2 flow1;
    class e3 flow2;
    class e4 flow3;
    class e5 flow4;

Components

Islandora

The following components are microservices developed and maintained by the Islandora community. They are bundled under scyllaridae and Islandora Crayfish:

Other Open Source

The following components are deployed with Islandora, but are developed and maintained by other open source projects: