GithubHelp home page GithubHelp logo

jasperfx / wolverine Goto Github PK

View Code? Open in Web Editor NEW
1.2K 22.0 125.0 18.23 MB

Supercharged .NET server side development!

Home Page: https://wolverinefx.net

License: MIT License

Batchfile 0.01% C# 99.98% PowerShell 0.01% Shell 0.01%

wolverine's Introduction

Wolverine

Discord

Wolverine is a Next Generation .NET Mediator and Message Bus. Check out the documentation website at https://wolverine.netlify.app.

Support Plans

JasperFx logo

While Wolverine is open source, JasperFx Software offers paid support and consulting contracts for Wolverine.

Help us keep working on this project ๐Ÿ’š

Become a Sponsor on GitHub

Working with the Code

To work with the code, just open the wolverine.sln file in the root of the repository and go. If you want to run integration tests though, you'll want Docker installed locally and to start the matching testing services with:

docker compose up -d

There's a separate README in the Azure Service Bus tests as those require an actual cloud set up (sorry, but blame Microsoft for not having a local Docker based emulator ala Localstack).

Contributor's Guide

For contributors, there's a light naming style Jeremy refuses to let go of that he's used for gulp 20+ years:

  1. All public or internal members should be Pascal cased
  2. All private or protected members should be Camel cased
  3. Use _ as a prefix for private fields

The build is scripted out with Bullseye in the /build folder. To run the build file locally, use build with Windows or ./build.sh on OSX or Linux.

Documentation

All the documentation content is in the /docs folder. The documentation is built and published with Vitepress and uses Markdown Snippets for code samples. To run the documentation locally, you'll need a recent version of Node.js installed. To start the documentation website, first run:

npm install

Then start the actual website with:

npm run docs

To update the code sample snippets, use:

npm run mdsnippets

History

This is a little sad, but Wolverine started as a project named "Jasper" way, way back in 2015 as an intended reboot of an even older project named FubuMVC / FubuTransportation that was a combination web api framework and asynchronous message bus. What is now Wolverine was meant to build upon what we thought was the positive aspects of fubu's programming model but do so with a much more efficient runtime. Wolverine was largely rebooted, revamped, and renamed in 2022 with the intention of being combined with Marten into the "critter stack" for highly productive and highly performant server side development in .NET.

wolverine's People

Contributors

alexzeitler avatar alistair avatar ardalis avatar bittercoder avatar blackclaws avatar carcer avatar d0pare avatar ejsmith avatar erdtsieck avatar haefele avatar hawxy avatar igor-toporet avatar jeremydmiller avatar kirill-gerasimenko-da avatar mxmissile avatar mysticmind avatar oskardudycz avatar pascalberger avatar pyt0xic avatar richard87 avatar schnerring avatar shield1739 avatar simoncropp avatar stephenstrickland avatar swimtver avatar timdeschryver avatar vertygo avatar vzakanj avatar woksin avatar xzelsius avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wolverine's Issues

Clean up IEnvelopePersistence API

Make it much more clear which methods require an active session. Maybe split incoming vs outgoing persistence? Use IReadOnlyList everywhere. Maybe bring in CancellationToken? Deal with any TODO in the code too.

Endpoint Configuration Policies

Need the ability to specify properties of various endpoints more easily

Tasks

  • Rabbit MQ conventional routing needs an allow/deny list filter. Chain configuration for listener/sender using expression somehow
  • Policies.UseDurableInboxForAllListeners()
  • Policies.UseDurableOutboxForAllSenders()
  • chain configuration for Rabbit MQ listeners
  • chain configuration for Rabbit MQ senders
  • Policies.LocalQueues(configure)
  • Policies.UseSeparateLocalQueueForEachMessageType(configure)
  • New way of registering endpoint policies

Advanced Pulsar Usage

Really just making sure that ConsumerOptions and ProducerOptions are both exposed and usable from PulsarEndpoint. Might try to make the subscription name be configurable too, but use the service name as the default.

Delete Endpoint.Parse(uri)

It was a hokey way of making it easy to load all settings from configuration by using Uri, but that just doesn't really fly now.

Reconsider this.

Re-evaluate in memory job scheduling

There's a unique InMemoryScheduledJobProcessor for each lightweight, local queue + the JasperRuntime. The diagnostics are useless.

Might be worth just improving the diagnostics on IJasperRuntime to show you everything that's outstanding.

New Wolverine ASP.Net Core Endpoint Model because why not?

To be clear, this will not be any kind of full blown, alternative AspNetCore framework because that way lies madness, heartbreak, and failure

Goal: Mechanism to utilize Jasper's execution pipeline within Minimal API HTTP endpoints without having to manually delegate through to ICommandBus.

Signature

Use the Endpoint suffix nomenclature for discovery. Either use fubu-style naming conventions on the method names, or
override with [HttpPost("route")] style attributes. So:

public class SomethingEndpoint
{
    public Task<Output> post_something(Input request, Service service, Service2 service2)
    {

    }

    // OR

    [HttpPost("/something")]
    public Task<Output> Post(Input request, Service service, Service2 service2)
    {

    }
}

Notes:

  • Still support method injection
  • The base class generated around this will handle registration with Minimal API? Or one generated class to make it all faster.
  • Gotta figure out how to expose metadata about the endpoints through to AspNetCore. Stuff like Open API configuration
    or [Authorize] attributes
  • How to designate outgoing messages versus the HTTP response??? Could there be a base class just to add outgoing messages
    ala Saga.MarkCompleted()?
  • Start making some of the other middleware HTTP aware? Thinking about making Marten being able to move the correlation id
    from the HTTP request to the session. Also ability to move the correlation id from HttpContext to the Jasper IExecutionContext?
    maybe that gets done with OTEL machinery???
  • Do the code generation well, and this could be a good Azure Functions / AWS Lambda serverless strategy by cutting out a lot of cold start issues
  • Support it on Saga as well? Why not?
  • Also want a more efficient way to delegate through to ICommandBus. Something where you get an IInvoker<T> or IQuery<TRequest, TResponse> behind the scenes?

Special Services

These services should be resolved to the main Jasper method automatically:

  1. HttpContext
  2. ClaimsPrincipal
  3. HttpRequest
  4. HttpResponse
  5. CancellationToken -- but this should come from the HTTP request

Reevaluate CircuitWatcher

What do do when the sender is latched and it's not durable? Throw at the point of sending? Move the Envelope.QuickSendAsync() logic into ISendingAgent? The variability is there.

Improve the quick start sample

cc @AlexZeitler

  • Improve the description of cascading messages. Do something w/ ItemCreated
  • Link to the handler discovery, but add more description
  • Probably more, so just review. That was written years ago.

Publish event messages for meaningful actions in Wolverine

Publishing messages will allow users to easily register handlers for big events. Thinking:

  • circuit tripped off
  • circuit resumed
  • endpoint paused
  • endpoint restarted
  • endpoint failed?
  • endpoint too deep?

All of these are available for the tracker too? The observable path is beneficial too maybe.

Default Endpoint Names

For Rabbit MQ queues, it should be the queue name. Or exchange name
For SQS, the queue name
and so on

This will help a bit w/ diagnostics and logging

Metrics collection

Way more analysis necessary. At first thought, collect:

  • Standing count of outgoing messages in inbox/outbox -- observable gauge
  • Count of queue depth. Sampled observable gauge
  • Aggregate "effective time" from sent to successfully processed. Histogram?
  • Aggregate average of sent messages -- counter
  • Number of messages handled by endpoint. Success & failure. Retries? -- counter with tags
  • Queue length -- observable gauge

Saga improvements

See SagaFramePolicy. Use a custom exception with more context. Similar validation to what we did for projections in Marten

Improved Middleware Strategy

The big goal is to make the creation and usage of middleware easier.

Test cases

  • Instance methods on middleware is scoped
  • Static methods
  • Synchronous "before"
  • Asynchronous "before"
  • Synchronous "after"
  • Asynchronous "after"
  • No filter
  • User-defined filter
  • Inferred filter by message applicability
  • Use multiple middleware on one handler
  • Add middleware by attribute too!
  • Can use services
  • Use objects built by middleware
  • Dispose middleware objects that are created
  • Filter model?

Rework ITrackedSession usage

  • Evaluate usage
  • When asking for the "single XYZ of anything", and there's more than one or none, throw a better exception with the full history

AWS SQS & SNS Support

Not sure if that'll require a separate library or not yet. Hoping that LocalStack is viable

Acknowledgement workflow with callbacks

Need more context here. This is going to be used to standardize the workflow we built as custom code for a client to do acknowledgements about success or failure of an outgoing message, but with some mechanism to pass back contextual information about the original message.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.