CELUM set out to develop its own reactive graph driven architecture to provide the best user experience for workrooms.net. Hear our story on how we ventured into the areas of Graph Databases, Data Modelling as well as Reactive Programming and melted them into a graph-centred reactive architecture.
We put it to the test and built our production-ready cloud-based enterprise application atop it. Learn about lofty goals and unexpected surprises that we managed to turn into happy endings. Building upon our experiences will become your edge once you develop your own graph-centric cloud application.
The unique aspects presented are a type-safe query language atop Gremlin available within back-end and front-end, our inheritance-aware data model and the seamless streaming of graph data to the front-end as it becomes available.
Finally, drawing upon these capabilities, we look at Live Queries that notify clients when query results become stale and thus both improve the UX and reduce the system load.
Artificial intelligence in the post-deep learning era
Building a production-ready, graph-based enterprise application in the cloud
1. BUILDING A PRODUCTION-READY, GRAPH-BASED
ENTERPRISE APPLICATION IN THE CLOUD
RAINER PICHLER, SOFTWARE ARCHITECT
https://twitter.com/rainerpichler
AN INNOVATION STORY TOLD BY
2. III. Where we go
AN INNOVATION STORY*
*inspired by the Gartner Hype Cycle
13. OUR ARCHITECTURE
EB - API
ENTITY DATA MODEL
PERSISTENCE
Domain
Service
Domain
Service
Domain
Service
EB - CLIENT
ENTITY DATA MODEL
View View View
Service Service Service
Angular
RxJS
Flux
Graph Database
RxJava
Vert.x
celum.com
22. MODEL DEFINITION
public interface ContentItemType extends AnyEntityType {
public static final Name NAME = new Name();
public static final CreationDate CREATIONDATE = new CreationDate();
public static final ModifiedDate MODIFIEDDATE = new ModifiedDate();
/** Description: Determines the primary sort order in the UI */
public static final SortIndex SORTINDEX = new SortIndex();
23. OUR QUERY AND MODIFICATION LANGUAGE
Type-safety
Uniform on BE & FECommon functionalities
Type inheritance
g.V().has("type_folder", "folder")Pure Gremlin:
24. A QUERY
Query<ContentElementType> query =
Query.fromEntitiesOfType(FolderType.instance())
.restrict(R.attributeValue(FolderType.NAME, AttributeMatcher.equalTo(“Pictures”)))
.followRelationsOfType(ContainerHasElementsRelationType.instance()).build();
Rainer
Rene
Catalogue
Winter
Pictures
Products.docx
Draft.psd
Logo.tiff
Bike.tiff
moderator
moderator
524.288
2.048
Inbox
g.V().has("type_folder", "folder")
.has("name", "Pictures")
.out("containerHasElements")
25. STATIC TYPE SAFETY
[Folder] [ContentElement]
.followRelationsOfType(ContainerHasElements)Query.fromEntitiesOfType(Folder) .restrict([…])
<File>
ID: 42
Name: Logo.tiff
<Folder>
ID: 23
Name: Pictures
<ContainerHasLeafElements>
ID: 37
instance of instance of instance of
.build()
EntityQueryBuilder QueryEntityQueryBuilder
Steps
[ContainerHasElements]
37. UPCOMING: LIVE QUERIES
Goal: UI always up-to-date
Live Queries in the CELUM Reactive Server Platform
Master Thesis by Florian Latifi (florian.latifi@jku.at)
Johannes Kepler University Linz
We will blog about it on celum.com