Skip to content

Overview

Diagram

architecture-beta
    group api(cloud)[API]

    service db(database)[Database] in api
    service disk1(disk)[Storage] in api
    service disk2(disk)[Storage] in api
    service server(server)[Server] in api

    db:L -- R:server
    disk1:T -- B:server
    disk2:T -- B:db
architecture.mermaid
---
icons:
    - name: logos
      url: https://unpkg.com/@iconify-json/logos@1/icons.json
---
architecture-beta
    group lrs[LRS]
        group lrs_filtered(cloud)[LRS filtered] in lrs
            service server_lrs_filtered(server)[LRS server] in lrs_filtered
            service db_lrs_filtered(database)[xAPI database] in lrs_filtered
            service disk_lrs_filtered(disk)[Storage] in lrs_filtered

            server_lrs_filtered:T -- R:db_lrs_filtered
            server_lrs_filtered:T -- T:disk_lrs_filtered
        service lrs_acquisition(cloud)[Acquisition LRS] in lrs

        lrs_acquisition:B -- T:server_lrs_filtered

    group analyser(cloud)[Trace analyser]
        service server_analyser(server)[API Gateway] in analyser
        group analyser_plugins[Analysis plugins] in analyser
            group analyser_plugin_a(cloud)[Plugin A] in analyser_plugins
                service server_plugin_a(server)[Script] in analyser_plugin_a
                service db_plugin_a(database)[Additional database] in analyser_plugin_a
                service disk_plugin_a(disk)[Storage] in analyser_plugin_a
                server_plugin_a:R -- L:db_plugin_a
                server_plugin_a:B -- T:disk_plugin_a
            service analyser_plugin_b(cloud)[Plugin B] in analyser_plugins
        junction plugin_group_edge

        server_plugin_a:L --> R:plugin_group_edge
        analyser_plugin_b:B --> R:plugin_group_edge
        server_plugin_a:L <-- R:server_analyser
        analyser_plugin_b:L <-- R:server_analyser

    group clients[Clients]
        group client_a(user)[Client A] in clients
            service client_a_app(user)[Main application] in client_a

            group client_a_connector(user)[App connector] in client_a
                service client_a_lrs_connector(user)[Activity provider] in client_a_connector
                service client_a_analyser_connector(user)[Analysis connector] in client_a_connector
                junction client_a_connector_edge in client_a_connector
                client_a_app:T -- B:client_a_connector_edge
                client_a_connector_edge:L -- B:client_a_lrs_connector
                client_a_connector_edge:R -- B:client_a_analyser_connector
        service client_b(user)[Client B] in clients
        service client_dashboard(user)[Dashboard client] in clients

        %%client_a_lrs_connector:T --> B:lrs_acquisition
        %%client_a_analyser_connector:T <--> B:server_analyser
        %%client_b:B --> B:server_lrs_filtered
        %%client_b:B --> B:server_analyser

Notes

  • Did not connect main groups between them for lisibility.
  • If we need some kind of cleaning of xAPI statements, we can add a service to the LRS group that periodically cleans up the database.

  • Regarding multiple LRSs:

  • We may investigate having two LRSs working side-by-side:

    • One for data acquisition (client send data)
    • One for data fetching (client request data)

    This should leverage Statement Forwarding (a TLA concept)

  • Each LRS may need its own database, since the way they manage their data is not part of the specs!

    Maybe the acquisition one should use MongoDB and the fetching one ElasticSearch?

  • The dashboard will have its own baked-in database, with managed roles, users, etc.

  • But according to the LTI specification, the Roles are meant to be shared across applications
  • So maybe some part of its data will have to come from another database?