The approach makes sense to me. The idea of a stable core + extensibility is a common and successful pattern in many OSS projects.
@Jake, you want to discuss at the next Geode Community meeting in Oct? Anthony > On Sep 20, 2021, at 1:48 PM, Jacob Barrett <jabarr...@vmware.com> wrote: > > Devs, > > We need to be doing a better job with implementing new features in a modular > and plugable way. We have had discussions in the past but we haven’t been the > best at sticking to it. Most recently we began work on a modified version of > WAN that supports transactional batching. Rather than implement it in a > plugable model we modified the existing implementation with a new property > that changes the internal behavior of the implementation. This is a clear > smell that what we have should be plugable and modularized. I am not > suggesting that we run out and define clear public SPIs for everything or > come up with some complicated plan to re-architect everything into modules > but rather that we take small steps. I will argue that when we are adding > functionality to a core service that is the point we should consider steps to > break it up into clear module components. Think to yourself, what would it > take for me to implement this new functionality as its own module, meaning > its own jar and Gradle sub-project. As you begin to develop the solution you > may find you need some clean interfaces for it to extend from the core, that > might be the start of an internal SPI. You may find that some concrete > classes you would have normally modified just need to be extended with a few > protected methods to implement alternative logic. > > I think we should focus efforts on extracting an interface to plug in > different WAN gateway implementations so that existing implementations aren’t > modified with new behavior. With proper interface extraction we can more > easily unit test around WAN gateways. By keeping implementations small we can > more easily test them in isolation. Making them all plugable allows > distributions of Geode to deliver specific implementations they would like to > support without impacting the existing implementations. It also frees Geode > to release new experimental or beta implementations of WAN gateways without > impacting the existing implementations rather than delaying releases waiting > for modified WAN gateways to be production ready and fully tested. > > In looking at the geode-wan module one might notice that it was already > designed to be plugable. Unfortunately it isn’t that easy. This SPI was > originally there to provide a way for Geode to be donated initially without > WAN support. It turns out that most of the core to WAN is actually still in > geode-core and only some of the “secret sauce” was moved into geode-wan. The > bulk of the geode-core code for WAN is actually in support of the region > queues for WAN and AEQ, so moving it into geod-wan would have cut off AEQ. > While it would be possible to utilize this SPI for providing alternative > gateway implementations it is very high level,so much of the alternative > implementations would be duplications, and it doesn’t allow for both > implementations to sit side by side at runtime. I would actually suggest we > eliminate this public SPI in favor of just the geode-wan core module that it > is and eventually migrate the region queue code into its own module as well, > but these are for another day. > > Looking closer at the WAN gateways themselves there is mostly a pluggable > interface already there with the existing interfaces. I spent a little time > pulling apart an internal SPI and it was quite easy. With a small > modification to gfsh and cache xml to specify that alternative implementation > by name is all that needs to be done immediately to configure an alternative. > Without extracting too many of the common implementation out into its own > module just a few of the classes in geode-core can be modified to provide > empty implementation of key overridable plug-in points for the TX batching > implementation. The result is that the TX batching module can be added to the > classpath and be configured as a gateway sender without injecting any of the > TX batching specific code into geode-core or geode-wan. Deeper details can be > found at the end of this discussion. > > This solution isn’t perfect but it is a step in the right direction. The more > we continue to extract and extend the closer we will get to a true pluggable > architecture. The key to being successful will be to keep the changes to the > core components small and the interfaces between modules internal. If we all > make an effort towards this, both in our code and in our reviews of others > code, we can keep the efforts small and manageable. > > I would love feedback and thoughts on this suggestion. > > -Jake >