... thanks Manoj for reviewing the proposal. The additional features you mentioned can be of course added... as soon as I have a moment I'll have a stab at this and will provide an example in a unit test that demonstrates it.
Cheers On Thu, Jan 30, 2025 at 7:36 PM Manoj Mohanan <mano...@apache.org> wrote: > > Hi Aleks, > > Thank you for your initiative in proposing this system enhancement. I > strongly support this change, as it addresses a critical need in our > current architecture. > > The existing synchronous command handler facilitates the maker-checker > workflow. It allowed direct storage of serialized commands (including > request payload JSON) in the database, enabling easy retrieval and replay > during checker approval. As we transition to the new approach, Are there > proposed modifications to the maker-checker workflow itself? > > Additionally, the existing implementation includes a permission check > (authorization) prior to invoking the handler, as well as a Hook Event > Processor integrated into the control flow to invoke external APIs > asynchronously. To ensure continuity of these functionalities, can we > include these in the proposed command executors? > > This will help maintain critical auditability standards while adopting > the updated architecture. > > Regards, > Manoj > > On 2025/01/26 09:38:46 Aleksandar Vidakovic wrote: > > On Sun, Jan 26, 2025 at 6:59 AM VICTOR MANUEL ROMERO RODRIGUEZ < > > victor.rom...@fintecheando.mx> wrote: > > > > > Hello, > > > > > > I have been reading the discussion, the FISP and the GitHub PR... this > > > must receive more feedback from the community. > > > > > > > That's why we are here... thanks again for participating. > > > > > > > > > > It causes me some noise that the FSIP is focused on the API Rest layer > and > > > the PR is introducing a new header that could also be used for > > > Idempotency... We can understand the reasons for having it in the Rest > > > layer. But what about the idempotency that is being used in the > batch/event > > > processing? > > > > > > > Sorry for the noise... > > I'm not really seeing the "focus" on the REST API layer... the proposal > is > > kept explicitly free of any assumption which web stack you are using... > > this stuff could even work with Webflux. > > Introducing a new header? There is not even an implementation for > > idempotency in this proposal... maybe you are referring to the example in > > the unit test? That stuff (everything in the "sample" package) is purely > > for demonstration. > > Could you maybe elaborate what problem you see concerning the batch > > processing? > > > > > > > > > > I have found the implementation for sync and async commands... What > about > > > streaming? Also in the same package there are pipeline, executor, > router .. > > > What about notifications? My questions are for getting feedback from > you if > > > they are expected/discarded on this new proposed infrastructure. > > > > > > > ... I would add to your list "what about non-blocking"? Well, the reason > > why it's not in my proposal is, because right now we have a classic > > synchronous blocking execution path in place upstream... and the first > > step would be to get the whole thing gradually to a more performant > > solution with clearly structured internal API. Another important thought > > here is to avoid/reduce any additional learning curve; the community is > > used to the classic "I call a function and get a result" paradigm of > > programming; introducing more complex paradigms would need more time for > > adoption. That being said: if the community decided tomorrow to go all in > > for non-blocking, reactive, GRPC, [place your preference here] and > > bulldozer things then I would happily participate... but my feeling is > that > > this is very unlikely. And before anything like this happens we would > need > > all these hard-wired references to JSON data structures from the business > > logic services anyway. > > > > As for notifications: noted, good point. > > And concerning feedback: I have no claim here that what I wrote in the PR > > is set in stone... that's why we discuss it here (I hope more people > join). > > Things that I didn't have on the radar and that you and others find > > indispensable can be of course added. > > > > > > > > > > I think that Apache Camel is a good tool... I don't see it as a vendor > > > lock-in... well If do that (to see it as a vendor lock-in)... then what > > > about spring boot itself? i.e. nowadays we have Quarkus and > Micronaut... > > > and I think it is more complex to move some Apache Fineract code to > these > > > frameworks or add plugins developed in these frameworks to Apache > Fineract > > > runtime. > > > > > > > Again, the idea here is to keep this proposal as self contained as > possible > > to avoid having to decide on too many fundamental changes... hence, you > see > > no Apache Camel. That being said: I can write you an adapter in 10min > that > > runs the whole thing over Camel... but doesn't leak any details about > Camel > > being used to the rest of the code base. Don't see what the flaw would be > > here to properly abstract implementation details? > > > > Is there a ready to use solution in Spring Boot for command processing > > and/or CQRS? I think not... but let me know if I am missing something > here. > > What is out there is Axon which is a complete framework implemented ON > TOP > > OF Spring/Boot... but that thing would require us to jump on their > internal > > APIs and how they think things should be processed... personally I think > > these guys thought about this subject a bit longer and have a way more > > complete solution... but again, given the need for backwards > compatibility > > and the requirement to be not (too) disruptive to any other upstream > > development: very unlikely that such a fundamental change would happen > and > > cause a major refactoring fest. > > > > I'm not so sure why Quarkus and Micronaut are mentioned here... yes, very > > nice and capable modern frameworks... but they also have no specific > notion > > of command processing, but are generic frameworks like Spring/Boot... my > > intention is not to change any fundamental underlying frameworks (give > and > > take they have similar features)... again, I'd like to keep this as small > > and self contained as possible. > > > > > > > > > > Happy to read your feedback. > > > > > > Regards > > > > > > Victor > > > > > > > > > > > > > > > El jue, 23 ene 2025 a las 23:40, James Dailey (<jdai...@apache.org>) > > > escribió: > > > > > >> On Thu, Jan 23, 2025 at 9:20 AM Aleksandar Vidakovic > > >> <chee...@monkeysintown.com> wrote: > > >> > > > >> > ... thanks James for the input... I'll try to answer your last > couple > > >> of questions from my perspective (read: opinionated... take with a > pinch of > > >> salt): > > >> > > >> JD: Aleks - thank you. I always learn something from this back and > > >> forth with you. > > >> > > > >> > too clever: the current implementation I suggest that anyone tries > to > > >> draw a sequence diagram that explains the flow of execution and make > it fit > > >> on one page vs the new proposal will most likely contain less than a > > >> handful of lines. You can apply the same if you take lines of code as > a > > >> metric... overall the new proposal has less than 50 lines of code > that are > > >> relevant (I don't know the number for upstream, but I think it's safe > to > > >> say it's more). If we assume that we can achieve the same results > with less > > >> code then I think the answer is easy here > > >> > maintainability: well, see above... the current solution is not > > >> documented at all and I am pretty sure I am not alone when I saw "I > really > > >> can't explain all the steps" (doesn't mean they are not necessary); > what I > > >> want to say is that the existing solution would really need a lot more > > >> explanation than just "CQRS", I think that would be a fair > requirement. > > >> Admittedly, the new proposal also has no documentation (other than > the wiki > > >> page and what I wrote in this message). But: I think if I did write > it it > > >> can fit on one page (with diagrams), this module (it's a real one) has > > >> (almost) no external dependencies (other than the frameworks that we > use > > >> anyway), it makes no assumption about any of the business logic that > might > > >> or might be passing through (existing implementation fails already > there... > > >> see CommandWrapper and the various entity IDs that are buried > there... this > > >> wrapper class should not be aware of anything it transports)... which > > >> brings me back to the point of less code which is I think from a > > >> maintenance point of view preferrable > > >> > > >> JD: When I say "overly clever" that is in contrast to simplicity > > >> through elegant design. A favorite quote "There are two ways of > > >> constructing a software design: One way is to make it so simple that > > >> there are obviously no deficiencies, and the other way is to make it > > >> so complicated that there are no obvious deficiencies. The first > > >> method is far more difficult." I think if you are aiming for > > >> something simple enough to have obviously no (or much fewer) > > >> deficiencies, that is, an improvement. But, could you write some > > >> documentation about the concept? It should be simple to describe "on > > >> paper", yes? > > >> > > >> > > > >> > Apache Camel: ... disclaimer, I really like that framework and used > it > > >> on a ton of occasions. That being said: choosing a framework is a > > >> commitment pretty much like a vendor lock-in. Depending on how you > > >> integrate a framework like Camel (this will be more than a JAR file > and you > > >> can either hide the fact you use Camel from the rest of your app or > you > > >> fully expose it...) upstream means if for some reason it turns out > that > > >> Camel is not a good choice or the community doesn't want yet another > > >> dependency then we might find ourselves in a refactoring fest to > revert > > >> things. If you look closely in the proposed sources you will see that > first > > >> of all there are Java interfaces that propose a contract on how to > wire > > >> things together... and there not many... which leaves a lot of room > for > > >> actual implementations (Camel or something else). In fact, 3 or 4 > years ago > > >> I actually created a drop-in replacement for the upstream > > >> SynchronousCommandProcessing service and ran Camel behind the scenes > and > > >> was actually very happey with the outcome. When I did this there were > > >> basically 2 relevant functions that needed to be taken care of. Today > there > > >> is a lot more going on there and I am not so sure if you could just > drop-in > > >> Camel effortlessly with the current incarnation of the command > processing > > >> service. > > >> > > >> JD: Ok. I can buy not wanting another dependency, but only if our > > >> level of effort is relatively small ongoing. Otherwise we are taking > > >> on code maintenance for our "own thing" when a perfectly suited > > >> solution is in the same software foundation. > > >> > > >> > Asking Apache Camel's community for opinion: well, can't hurt... > they > > >> do stuff like this literally every day, so I am pretty sure whatever > we'll > > >> exchange with them will be very informative. But that doesn't relieve > us > > >> from deciding if you want to go all in on Apache Camel it would be > anyway a > > >> good practice to abstract these implementation details away (aka hide > to > > >> the rest of Fineract that you are using Camel). If that is the case > then we > > >> need a contract (aka Java interface). The one that is there won't do > it > > >> anymore... without major rework... and that is the point. The proposal > > >> intends to ensure a gradual non disruptive migration (not open heart > > >> surgery) > > >> > > >> JD: Sure, that makes sense, you need to new Java interface... but > > >> wouldn't it be better to spend a bit of time in design and validation > > >> at this early stage. I think we're talking about a pretty significant > > >> optimization from its location in the stack. Who should reach out? > > >> > > >> > whitepapers, alternatives: I think the first thing that Google or > > >> ChatGPT searches will tell you is "use an existing CQRS framework"... > and > > >> this will most likely show you AxonIQ (a CQRS framework implemented > with > > >> Spring/Boot)... but that is then even more of a vendor lock in than > using a > > >> more generic solution like Camel... Axon will force us to use their > > >> contracts (internal APIs, Java interfaces etc.), in short: refactor > fest, > > >> disruptive. There are other low level "solutions" (like LMAX > Disruptor) > > >> that are somewhat in the vicinity of this type of application, but > require > > >> work, to my knowledge there is nothing out there we could just > magically > > >> drop and use without any refactoring. Disclaimer: in one of the 3 > drop-in > > >> implementations of the proposed command processing I am actually > using LMAX > > >> Disruptor... its implementation details just don't leak into the rest > of > > >> the system > > >> > Spring Boot 3 compliance: yes (buzzword drop: "auto-configuration") > > >> > > >> JD: Excellent > > >> > > >> > cutting edge: not sure how to read this here... is this meant as a > > >> requirement or as an argument against the adoption of the proposal as > in > > >> "too experimental"... as I've written the code I am obviously biased > so I > > >> leave that to the community to decide and come up with improvements > and/or > > >> alternatives/arguments if someone doesn't agree > > >> > > >> JD: Yep. The ambiguity is on purpose - cutting edge can be great in > > >> getting results, or it can make you bleed. > > >> > > >> > > > >> > Let me know if I skipped something, made an error or was not clear > > >> enough. > > >> > > >> JD: Very clear. Now, before this code is committed, I would also > > >> like to be sure we have a sensible way of documenting the progress so > > >> that if we are doing a release, we make note of how much of the code > > >> base is using the new methods. I also think we should discuss this in > > >> context of the next release. (coming up soon). > > >> > > >> > > > >> > On Thu, Jan 23, 2025 at 5:00 PM <jdai...@apache.org> wrote: > > >> >> > > >> >> Thanks for bringing this to the list. It looks to be a very low > level > > >> (in the stack) and therefore, highly impactful. I was there when the > > >> decision was made to adopt this pattern and > > >> SynchronousCommandProcessingService as a flexible improvement to the > > >> existing CQRS. I remember asking some questions, but this was and is, > > >> beyond my direct experience. > > >> >> > > >> >> > > >> > https://cwiki.apache.org/confluence/display/FINERACT/FSIP-5:+New+command+processing+infrastructure > > >> >> > > >> >> What I do know is that we should be deliberate with this process, > and > > >> I appreciate your write up on wiki. Definitely other architects here > > >> should take a look. > > >> >> > > >> >> At times over the past decisions - it feels to me that we try to be > > >> "too clever", and this creates a problem with maintainability. I'd > like to > > >> make sure we understand the alternatives as we dig into this. You > raised > > >> Apache Camel as an option - would it be worth it to ask someone over > in > > >> that project to comment on this? Is there some whitepaper or > comparison > > >> out there between the alternatives available? Is this consistent with > > >> Spring Boot 3 ? Is this on the cutting edge? > > >> > > > > > >