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:
- Apache
- Blazegraph
- Cantaloupe
- Drupal
- FITS
- Fedora (Repository Software)
- MariaDB or PostgreSQL
- NGINX
- Traefik
- Triplestore - See Blazegraph