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?