FusionCache icon indicating copy to clipboard operation
FusionCache copied to clipboard

Feature: NATS Backplane

Open stebet opened this issue 8 months ago • 5 comments

Added a NATS Backplane

I added a new project which uses NATS as a backplane for cache events. It's relatively straightforward

Reduced allocations for backplane messages

I also noticed some easy improvements that could be made to drastically reduce allocations for Backplane message, so I did a few things.

  • BackplaneMessage is now a readonly struct instead of a class which means it can be allocated on the stack
  • BackplaneMessage now has a TryParse static method which tries to deserialize a ReadOnlySpan<byte> into a BackplaneMessage and now provides an instance method WriteTo which serializes the BackplaneMessage to an IBufferWriter<byte> with no allocations.

Made Backplane Tests easily extensible

I made the L1BackplaneTests and the L1L2BackplaneTests abstract classes which can easily be inherited and implement methods to provide the IFusionCacheBackplane and the IDistributedCache so tests for new backplane and Distributed Caches can easily be implemented.

This could be further improved by making these test classes perhaps take the Backplane and Distributed cache as parameters for parameterized tests. I might look at doing it like that to make it even easier.

stebet avatar May 25 '25 22:05 stebet

Hi @stebet , that is awesome, thanks!

I'll take a look at the changes in details in the nex few days, will ping back here.

jodydonetti avatar May 27 '25 11:05 jodydonetti

Hi @stebet , sorry for the delay, even though part of the blame for it is on your country... such an incredible place to visit 🙂

Anyway I've been finally able to resolve the conflict (by updating the SLN file to the new SLNX formt) and updated the branch.

I also added a couple of // TODO comments about a couple of things I quickly spotted: I still have to take a look at the rest, but it's a start.

Thanks!

jodydonetti avatar Oct 18 '25 21:10 jodydonetti

BackplaneMessage is now a readonly struct instead of a class which means it can be allocated on the stack

Isn't it better to split this PR into 2 PRs. One for BackplaneMessage refactoring and another one for NATS backplane?

Eshva avatar Nov 09 '25 13:11 Eshva

BackplaneMessage is now a readonly struct instead of a class which means it can be allocated on the stack

Isn't it better to split this PR into 2 PRs. One for BackplaneMessage refactoring and another one for NATS backplane?

Yep that would be better. I might amend this PR to skip the BackplaneMessage changes and put that in a separate PR later.

Thanks for the feedback

stebet avatar Nov 10 '25 09:11 stebet