...
Here's a start at listing the proposed modules and their dependencies. This is not the current state of these modules because currently there are several cyclical dependencies (eg Persistence dependencies on Regions, regions depend on persistence). Part of the effort here will be to break these cyclic dependencies by replacing hardcoded references to other modules with plugins and callbacks that are part of the well defined API for each module.
PlantUML |
---|
@startuml @startuml title Geode Package Dependency Graph hide members hide circle class WAN WAN --> CacheServer WAN --> Client WAN --> Regions Regions --> CacheServer Regions --> Client Regions-->Persistence Regions-->Statistics Advisors-->Messaging Regions-->Advisors Querying-->Regions Regions-->Messaging FunctionService --> Regions FunctionService --> Messaging Messaging --> Serialization PDX --> Serialization PDX --> Messaging Regions--> Serialization Querying--> Serialization WAN --> Serialization WAN --> Messaging Querying -> Messaging FunctionService --> Serialization PDX --> Regions Regions-->OffHeap Persistence-->Serialization Advisors-->Serialization ResourceManager-->Serialization ResourceManager-->OffHeap Regions-->ResourceManager ResourceManager-->Advisors WAN --> Advisors Querying --> Advisors FunctionService -->Advisors @enduml |
Below is a high level view of the interfaces for each module and some of the changes that need to be made to get to this point.
...
Messaging
Package:distributed.interna, distributed.internal.advisor
API interfaces/classes: InternalDistributedMember, DM, InternalDistributedSystem, MembershipListener, DistributionAdvisor, DistributionAdvisee
Required Changes: InternalDistributedMember and InternalDistributedSystem should be interfaces, not concrete classes. They should only have the methods that are required by the rest of the system. The concrete classes like DistributionManager, the old InternalDistributedSystem class, etc. should not be referenced outside this package.
TBD - The proposal here is that membership is another module that is hidden behind the messaging layer as far as the rest of the system is concerned. The membership layer has it's own interface that should hide its internals from the messaging layer. Advisors are lumped in here to reduce the complexity of the high level graph.
PlantUML |
---|
@startuml
title Messaging Packages
hide members
hide circle
class Messaging
package OtherComponents {
class Regions
class WAN
}
Advisors --> Messaging
Messaging --> Membership
OtherComponents --> Advisors
OtherComponents --> Messaging
@enduml |
Statistics
Package:internal.statistics
...
Required changes: Move into a separate package. Pull the code out of InternalDistributedSystem (it currently implements StatisticsFactory) into a separate class.
Advisors
Package: distributed.internal.advisor
API interfaces/classes: DistributionAdvisor, DistributionAdvisee
Persistence
Package: internal.cache.persistence
...