What is it and Why....
Geode in its current form is the ultimate Monolith. Littered with God objects and tight coupling. This makes maintaining and extending the current Geode system really hard, as changing functionality in ObjectA would most inevitably cause a change in ObjectB, which then cause ObjectC having to change, etc...
The current tight coupling of code makes it harder to reason over the expected behavior of the system, as code is layered on top of code, each layer potentially influencing behavior that is unpredictable.
In order to start unwinding this ball of yarn we need refer back to some Good Design Strategies:
Separation of Concerns
Modularity
Abstraction
Anticipation of Change
Incremental Development
These strategies are best described in the following links:
- Seven Good Design Strategies Part1
- Seven Good Design Strategies Part2
- Seven Good Design Strategies Part3
Proposal Goals
The proposal specifically targets the Separation of Concerns, Modularity and Abstraction strategies. The proposal will be focussed on the following goals:
- ClassLoader Isolation and Class versioning
- Dependency management
- Dependency injection
- Loose Coupling of Modules with high cohesion
- Extensibility and Plug-ability
- Lifecycle management
- Bootstrapping
- Extendible process flows
- Configuration
- Simplified Testing of modules
- Support for Interceptors:
- Operation Traceability (like Zipkin)
- Logging
- Security
- Transactions
- Event / Message driven
- Clearly defined SPI / API / Annotations
- Open/Close Principle
In addition to these goals, the solution needs to support:
- Reactive Streams
- Reactive Manifesto
- Back pressure enabled operational flows
- Improved metrics collection
Additional "nice-to-have" features would be:
- Lock-free framework for operations that require a critical section
- Async messaging / Actor models
Proposed Geode Modules
This section attempt to define the Geode Modules and their dependencies.
Module Name | Dependencies | Description |
---|---|---|
Geode-Core | Geode-Tracing Geode-Logging Geode-Security Geode-Metrics Geode-Maintenance | This module is the core module that contains all the core frameworks for the Geode system. Bootstrapping and flow lifecycles will be managed from here |
Geode-Tracing | N/A | This module contains the operation tracing implementation |
Geode-Logging | N/A | Centralized logging module |
Geode-Security | N/A | Centralized security module |
Geode-Transactions | N/A | Centralized transaction module |
Geode-Metrics | N/A | Metric framework |
Geode-Persistence | Geode-Core | Current implementation for disk-based persistence |
Geode-Maintenance | Geode-Security Geode-Logging | Module that controls the configuration and management of the Geode system |
Geode-Serialization | Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing | |
Geode-Collections-Base | Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing Geode-Persistence | This module will contain the base implementation for all distributed Collections. |
Geode-Collection-HashMap | Geode-Collections-Base Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing Geode-Persistence | This module will contain the current Region implementation |
Geode-Query | Geode-Collections-Base Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing Geode-Indexing-Base | This module will contain the current OQL engine |
Geode-Indexing-Base | Geode-Collections-Base Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing Geode-Persistence | The base implementation for query indexing |
Geode-Data-Replication | Geode-Collections-Base Geode-Core Geode-Security Geode-Maintenance Geode-Logging Geode-Tracing | This module will handle the replication of data to other nodes |