Giter Club home page Giter Club logo

rebus's People

Contributors

andreacuneo avatar asgerhallas avatar bartul avatar caspertdk avatar clausndk avatar enosrecanati avatar fritsduus avatar gertjvr avatar hangsolow avatar jasperdk avatar kendallb avatar kevbite avatar ladenedge avatar maeserichar avatar mookid8000 avatar mrmdavidson avatar mvandevy avatar nativenolde avatar oliverhanappi avatar plasma avatar pruiz avatar rasmuskl avatar rzpeg avatar schourode avatar seankearon avatar ssboisen avatar svenvandenbrande avatar tiipe avatar torangel avatar xenoputtss 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  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

rebus's Issues

Re-work Mongo persistence

Enlisting in ambient TX is not necessary for neither MongoDbSubscriptionStorage nor MongoDbSagaPersister because - they should both just "do their thing", and then verify that the insert/update went well, throwing some kind of exception if that was not the case.

Create a NuGet package

Just do it.

Just start out with Rebus. Remember Semver.

Don't create packages for all the integration projects just yet.

Provide error details

When errors occur during MSMQ communication, only a one-liner makes it to the output window. It should be possible to see the full details of what went wrong somehow.

Add ability to handle anything dynamically

by implementing IHandleMessages<dynamic>. That would be cool!

(not sure how an IHandleMessages<dynamic> would actually behave at the moment... is it just a question of having the Dispatcher resolve those as well?

Custom SQL Server Saga Persister

The existing SqlServerSagaPersister is, due to it's dynamic nature, probably pretty heavy and clunky for most uses. This is due to the fact that it serializes the entire saga data in a blob, storing correlation IDs in a separate index table.

A CustomSqlServerSagaPersister would be cool because the saga persister would require the user to provide a mapping to/from saga data object type, and then all the speed of a single-row saga persister can be achieved, while still allowing users to model their saga data with e.g. all of their nifty domain primitives etc.

I'm thinking that a mapping (Type) => (FromSagaData, ToSagaData) must be provided to the persister for each saga data type that is to be used, where FromSagaData is a lambda that "flattens" the saga data into a single db row (possibly in the form of a Dictionary<string, object>'), andToSagaData` is a lambda that "hydrates" the data again.

Retry-logic

and that includes moving the erronous message to an error queue.

Remember that the receiving transaction should be used to send to the error queue, which should be committed.

Message forward ability

When handling messages from an error queue, or when implementing routing, it would be a nice feature if there was a bus.Forward() and bus.Forward(endpoint), allowing the transport message to be forwarded with all its headers intact.

Durable persistence of timeouts

Break persistence of timeouts out into ITimeoutRepository, putting the existing in-memory stuff in an InMemoryTimeoutRepository. This will allow for implementing Mongo/SQL server persistence some time later.

Fix MongoDB saga lookup

Test case PersisterCanFindSagaByPropertiesWithDifferentDataTypes does not work because BSON uses the actual types, and IStoreSagaData does lookups with strings... this is not optimal....

Either replace the Find signature with one that takes an object, or embed the saga data in a root document which also holds an the values under which the saga data is indexes... e.g. something like this

{
    // saga data Guid id is transferred to the root document
    _id: BinData(3,"55aswyKr1EibG5x1mj/acw=="),

    // index holds ToString() representations of all values
    // this piece of data should be indexed by
    index: {
        _id: "30734953-5e28-4635-8c98-1b0fbb959d15",
        someProperty: "23",
        embedded: {
            embeddedProperty: "67"
        }
    },

    // the actual saga data
    data: {
        _id: BinData(3,"55aswyKr1EibG5x1mj/acw=="),
        _t: "SomeAssembly.MySagaData",
        someProperty: 23,
        embedded: {
            embeddedProperty: 67
        }
    }
}

which would require e.g. a lookup for SomeProperty on the saga data to query index.someProperty, and a lookup for Embedded.EmbeddedProperty to query index.embedded.embeddedProperty.

Actually, it might be a good idea to flatten the index document - just come up with some way of representing the . in a BSON property name.

Possible inconsistency between Contract test and bus behaviour

In the AssertCanSendAndReceiveMessageWithHeaders method under the Contracts for new transports it tests whether the transport transfers the headers with the message-body thus forcing the transport-implementation to encode the headers itself in order to pass the test.

But when using the RebusBus the headers are already serialized using one of the ISerializeMessages implementations.

This means that in order to pass the Contracts-tests the transport (the azure queue in particular since it has no extensions) will transfer the headers duplicated.

Is this by design or more of a consequence of the Contracts being designed to use utilize and test the MSMQ messages Extensions functionality?

Trim assembly dependencies

Trim all projects to depend only on the BCL libs that are actually used.

This task may be in the nitpickers' department, but still - you can't deny there's a correlation between having a huge number of dependencies and not caring ;)

Automatic versioning of NuGet alpha packages

Replace the static 1.0.0-alpha version in nuspec files dynamically when building (probably generating an AssemblyInfo.cs file and pulling it from there).

Build numbers would be nice - but a temporary solution could be:

1.0.0-alpha20120315-121430 (yyyyMMdd-hhmmss)

This would allow people using NuGet references to both see and update Rebus packages from either the global NuGet feed or local build feed - without uninstalling and reinstalling the package (necessary now because version doesn't change).

Better error dialog

When double-clicking error messages, a simple MessageBox.Show(...) is used to show the details. A proper error dialog should be made, allowing for arbitrary length error text to be shown (and scrolled and copy/pasted etc.).

Make the header/body thing more consistent

At the moment, headers are serialized into the message even though they are preserved "on the side" for e.g. infrastructure to look at.

Headers should probably only be transferred "on the side".

Special treatment for the error message header

When a message fails multiple times, and it is decided that the message is poisoned, it gets moved to the service's error queue. In doing that, the experienced exceptions are included in the rebus-error-message header.

The rebus-error-message header should get special treatment in Snoop, allowing failed messages to be emphasized somehow.

Create abstract `ContainerAdapter`

remove existing IContainerAdapter...

... implement IActivateHandlers by abstract ContainerAdapter class that looks something like

public abstract ContainerAdapter : IActivateHandlers
{
    public IEnumerable<IHandleMessages<TMessage>> GetHandlerInstancesFor<TMessage>()
    {
        return ResolveAll<IHandleMessages<TMessage>>();
    }

    public void ReleaseHandlerInstances<T>(IEnumerable<IHandleMessages<T>> handlerInstances)
    {
        Release(handlerInstances);
    }

    public abstract T Resolve<T>();
    public abstract IEnumerable<T>  ResolveAll<T>();
    public abstract void Release(object obj);
    public abstract void RegisterInstance(object instance, params Type[] serviceTypes);
    public abstract bool HasImplementationOf<T>();
}

Configuration errors may not be properly logged

Due to the combintation of status logger instances and how the logger factory works, all the configurers' loggers will be initialized and statically cached, resulting in NULL-logging of configuration errors.

On the short run, a test should be written that ensures that no configurers contain a static field of the Rebus.Logging.ILog type. This will be a hint that configurers should pull a new logger every time they want to log something.

Improve performance of `RabbitMqMessageQueue`

Don't use BasicGet, change it to set up a Subscription at startup and then pull messages with subscription.Next(timeout, out result).

Remember to check if Subscription is re-entrant - otherwise, bind subscriptions to the current thread.

Created queue permissions

Rebus created queue currently inherit permissions from the running process. However, this generates queues that are completely inaccessible if the process is running as LOCAL SYSTEM.

Best solution off the top of my head is to always grant full control to the Administrators group. The permissions granted to Everyone should also be SID based (so we don't run into localization problems).

References for groups / SID translations:

Well-known security identifiers: http://support.microsoft.com/kb/243330
Translating from SID: http://stackoverflow.com/questions/499053/how-can-i-convert-from-a-sid-to-an-account-name-in-c-sharp

No error message before it's too late

When msmq input queue is configured w XML, and the queue is not specified, the resulting error message comes from deep inside MsmqMessageQueue.

The error should be caught by the configurer instead, and the error message should be nice and constructive :)

Implement sagas

Make RebusBus know how to handle sagas and store/correlate by using an IStoreOngoingSagas

Error queue creation

Currently Rebus just sends failed messages to a queue called "error", but doesn't bother to check whether or not this queue exists.

Should create the queue at start up - and maybe provide the NSB equivalent of naming config for queue name.

Alternative error handling strategy

Thinking of maybe implementing an alternative to the default 5-retries strategy.

Maybe it would be useful for some scenarios if the service would immediately stop processing messages if an error was encountered, which - if the service was single-threaded - would ensure that messages would always be processed in a FIFO manner.

This would probably require some kind of control bus mechanism so that message processing could be resumed when the error condition was resolved.

Just an idea. Wondering which scenarios could make use of something like this?

Allow destination-thingie to take a look at the message

At the moment, IDetermineDestination is given only the type of the message as input.

Content-based routing could be easily implemented if the entire message was given as input.

But what should happen then, when someone calls bus.Subscribe<TMessage>()? null as the message instance?

Hmmm......

Distributor process

Implement a distributor process. This most likely involves doing the following:

  • Make Worker be able to be in workerMode
    ** Must request work from a distributor when it starts and after finishing processing each message
  • Create distributor process
    ** Must receive work requests from workers, pair that request with an incoming message, and workerQueue.Send that message to the worker

Was that it?

Create a simple MSMQ queue inspector

The inspector should know enough about Rebus to be able to inspect a queue, look at message headers, and possibly visualize messages if it knows how to deserialize them.

This would probably require that headers be equipped with info that reveals the content type, encoding, etc.

The purpose is to allow for humane inspection of error queues. Also, it would be cool if the inspector could return messages to their source queues.

Timeout process

In order for sagas to be able to model stuff that takes time, a proper timeout process should be built.

It should be made so that it stores its scheduled messages in durable storage like SQL or Mongo.

Merge Newtonsoft JSON serializer

ATM, SqlServerSagaPersister depends on the JSON serializer, and it would probably be nice if Rebus core could do JSON serialization - therefore, in order to stay clear of other peoples' assembly references, Newtonsoft should be merged into core to allow for JSON serialization out-of-the-box.

Hooks and Items

Now that the clunky IMessageModule thing has been removed, RebusBus should be fitted with a couple of (regular .NET) events that allow for infrastructure to hook up before/after processing messages.

And then MessageContext should be equipped with a dictionary of things, similar to HttpContext.Current.Items in ASP.NET, that can be used to hold on to stuff for the duration of handling one message.

Update view models when messages are moved

When The Snoop returns message to source queues, the user must refresh all of the involved queues to see the results.

It would be a nice gesture if the view models would be automatically updated in the background, avoiding the need to refresh.

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.