- Add stand-alone persistence implementation based on RocksDb
- Refactor CqlStorqge
- Update libzmq to 4.3.1
- Add Linux support
- Add
IPeerDirectory.TimeSinceLastPing
to help detect decommissions. This property will returnTimeSpan.MaxValue
when the bus is stopped.
- Breaking changes
- Moved contract types to Abc.Zebus.Contracts
- Updated dependencies: StructureMap and protobuf-net
- Removed ABC.ServiceBus.Contracts namespace
- Removed Abc.Zebus.EventSourcing namespace
- Features
- Target changed to netstandard2.0
- Updated ZMQ to v4.2.5
- PeriodicActionHostInitializer now uses a timer instead of a thread
- Changed the way native libraries are delivered
- Code cleanup
- Merged directory and persistence repositories
- Updated projects to the SDK format
- Features
- Updated Newtonsoft.Json, protobuf-net and log4net dependencies
- Features
- Reduce heap allocations in the receiving code path
- Features
- Improve performance when message logging is disabled
- Features
- Inject an error reporter in various zmq outbound socket operations
- Allow local message dispatch when the bus is stopping
- Bug fixes
- Ensure all replayed messages are acked to the persistence
- Support unserializable messages in dispatch error handling
- Code cleanup
- Migrate to VS2017 project file
This version introduces a major breaking change: a dedicated TransportMessage
is now used to forward messages to the persistence service, instead of sending a PersistMessageCommand
. An updated persistence service is still able to process commands sent by old peers, but an old persistence service is not be able to process the new TransportMessage. Thus the persistence service must be updated first.
- Features
- Support batch message processing with
IBatchMessageHandler
- Execute the initial segment of async handlers on the dispatch queue
- Use a synchronization context to queue up async continuations
- Support batch message processing with
- Performances
- Improve
TransportMessage
serialization performance (200x for reads, 3x for writes) - Make
MessageTypeId
a value type with cached members - Reduce serializations (#62)
- Improve
- Code cleanup
- Make OriginatorInfo.SenderMachineName internal
- Use cake for build scripts
- Features
- Make error publication optional with
IBusConfiguration.IsErrorPublicationEnabled
- Make error publication optional with
- Code cleanup
- Use
Task.Run
to invoke command completion tasks instead of customTaskScheduler
- Use
- Bug fixes
- Use a circuit-breaker to reduce unresolvable peer performance impact
- Code cleanup
- Make internal a few testing types that were not intented to be available outside Zebus
- Bug fixes
- Error codes of locally handled commands are returned properly
- Empty subscription updates are not sent to the Directory
A client using this version needs its Directory server to be at least in 1.1 for dynamic subscriptions to work properly
- Features
- Subscription updates are made by message type instead of as a big atomic change to improve subscriptions performance
Republished the NuGet because the version number was not incremented in 1.2.12
- Bug fixes
- Pulled the new
MessageDispatcher
filter feature up toIMessageDispatcher
- Pulled the new
- Bug fixes
- Fixed NuGet dependencies
- Features
- The inbound port is no longer sticky, since the feature was not relevant anymore (we are no longer relying on ZMQ's buffers)
- The
MessageDispatcher
can be provided with a message type filter
- Features
- Scanning ".exe" files for handlers as well as ".dlls" at startup
- Bug fixes
- The
TestBus
now publishes aPeerStopped
event when unregistering
- The
- Features
MessageId
can now be paused at a given date- Added new "Handling" methods to the
TestBus
- Bug fixes
- Fix the Period setter on
PeriodicActionHostInitializer
- Fix the Period setter on
- Features
- Added
PeriodicActionHostInitializer
/HostInitializerHelper
to provide an easy way to run code Before/After the Bus is Starting/Stopping and at given intervals. DomainException
s can now be thrown using an Enum, and the error message can be retrieved by the sender using Description attributes on the Enum.
- Added
- Bug fixes
- Transient Infrastructure Commands now ignore the "IsResponding" state of the target Peer, as they should (Some Commands like
PingCommand
should be sent no matter what)
- Transient Infrastructure Commands now ignore the "IsResponding" state of the target Peer, as they should (Some Commands like
- Features
- Deserialization errors now produce a
MessageProcessingFailed
instead of aCustomProcessingFailed
since it makes more sense to handle it like a conventional handler error - NuGet dependencies updated
- Deserialization errors now produce a
- Bug fixes
- The handler being run while the Bus shutdown is initiated could not send messages because the Bus was signaled as "Stopped" too early
- Features
- Added
Abc.Zebus.Persistence.Tests
to the InternalsVisibleTo list to prepare the release of the Persistence
- Added
- Features
- Zebus.Testing: The default object comparer now ignores static fields/properties
- Added
Abc.Zebus.Persistence
to the InternalsVisibleTo list to prepare the release of the Persistence
- Bug fixes
- Sending a message with a
null
Routing Key now throws an explicit exception (instead ofNullReferenceException
)
- Sending a message with a
- Features
Abc.Zebus.Lotus.CustomProcessingFailed
is now mutable, allowing users to pool it
- Features
- The Pipes move from
Scan\Pipes
toDispatch\Pipes
(theoretically a breaking change, but the API is quite internal) - Removed
RoutingType
since it wasn't used - The Bus will now throw if you try to use it before it is started
- Moq, ProtoBuf-Net, AutoFixture, Json.Net, NUnit and CompareNetObjects are now referenced as NuGets
- The new
MarkPeerAsRespondingCommand
/MarkPeerAsNotRespondingCommand
commands allow to mark a Peer as (not) responding (NOT a standard operation, use with care)
- The Pipes move from
- Bug fixes
- The Persistence is now acked when a message cannot be deserialized, to prevent the Persistence from sending it over and over
- A race condition could prevent the Bus from starting properly
- Features
- When sending a transient command,
Send()
will throw if the target Peer is not responding
- When sending a transient command,
- Features
- A message that cannot be deserialized is now dumped on disk
- IProvideQueueLength now exposes a
Purge()
method, that is called when the queue length provider exceeds queue thresholds
- Bug fixes
- Fixed thread-safety issue in MessageDispatch.SetHandled
- Features
- log4net is now referenced as a NuGet package
- Features
- The repository is split, from now on Zebus.Directory has its own repository
- The MessageContext can be injected in the constructor of a handler
- The new SubscriptionModeAttribute allows to control automatic subscriptions more explicitly
- Bug fixes
- The "HANDLE" log is now accurate for async
- Features
- Split the "HANDLE" log into "RECV" and "HANDLE", making the distinction between the time a message is received and the time it is handled by user code
- Bug fixes
- Directories don't decommission other Directories/self
- Starting multiple Buses on the same machine simultaneously could result in identical message ids
- Features
- MessageExecutionCompleted now logs the MessageId of the corresponding command
- Features
- Now using Cassandra driver 2.0.3 in Directory.Cassandra
- Features
- Now using libZmq 4.0.4 and providing the matching pdbs in the Zebus repository
- Features
- The Cassandra backed Directory server is fully operational
- The tree-backed local Directory cache is now fully operational (routing performance improvement, faster routing rules updates, smaller memory footprint, etc.)
- Bug fixes
- Dynamic subscriptions for outgoing messages can be disabled on the Cassandra Directory implementation to handle massive dynamic subscriptions (not recommended)
- The SocketConnected/SocketDisconnected feature was removed (it was largely undocumented / unused, so it made to a minor)
- The local Directory cache doesn't lose subscriptions when a Peer is decommissioned
- Reduced the Directory cache memory footprint
- Fixed a bug in the Directory cache that prevented multiple Peers from receiving the same messages
- Messages received from the Directory during the Registration procedure could be lost
- The Directory server now deletes existing dynamic subscriptions when a Peer registers
- The Directory server now handles PeerSubscriptionsForTypesUpdated with "null" BindingKeys
- Features
- The local Directory cache now handles the new dynamic subscriptions. We will release a 1.1 after thorough testing / benchmarking.
- Features
- The incremental subscriptions support was revamped to work on a MessageType level instead of subscription level (it couldn't handle the required load).
- The Directory server Cassandra implementation was modified to support the new dynamic subscriptions efficiently.
- All packages are now supporting SymbolSource.
- Features
- CustomDelegatedProcessingFailed was removed (it should never have been in the public API).
- Bug fixes
- The Cassandra Directory server implementation was ignoring some updates because the DateTime.Kind was not set and some timestamps where erroneously converted to Utc.
- Bug fixes
- Added some logging in the Directory events to ease debugging
- Features
- Added support for incremental subscription updates in the client Directory cache using a tree structure that allows to keep throughput stable with huge volumes of routings.
- Added a Cassandra implementation of the Directory server repository (WIP, not production ready yet)
- Features
- Added SymbolSource support, you can now browse sources and debug from Visual Studio.
- Features
- IMultiEventHandler is replaced by Bus.Subscribe(Subscription[], Action) (Should have been in a major release since it is a Core breaking change, but given that it was not even documented we just changed it in a patch release).
- The project is now built/tested on AppVeyor
- Bug fixes
- When creating two identical dynamic subscriptions, disposing one does not dispose the other anymore.
- Bug fixes
- Embedding libZmq in the Zebus DLL so it is packaged in the Nuget
- Features
- All core features (Including Events, Commands, Dynamic subscriptions, etc.)
- In-memory Directory for testing purposes, but should NOT be used in production