Releases
4.6.0
What's new
- Add
GetOffsetsForTimestamp
toKafkaConsumer
- Allow specifying the number of partitions per topic in the mocked Kafka
Fixes
- Further improve assembly qualified name parsing for generic types
4.5.1
Fixes
- Fix assembly qualified name parsing for generic types
4.5.0
What's new
- Upgrade to MQTTnet 4.3.6.1152
- Upgrade to Confluent.Kafka 2.4.0
- Minor changes to reduce the likelihood of a deadlock
4.4.1
What's new
- Upgrade to Confluent.Kafka 2.3.0
- Upgrade to MQTTnet 4.3.2.930
4.4.0
What's new
- Allow parallel processing of MQTT messages
- Upgrade to MQTTnet 4.3.1.873
- Upgrade to Confluent.Kafka 2.2.0
Fixes
- Correctly set message timestamp in mocked Kafka
- Properly handle Kafka partitions revoked event when no partitions were assigned [#214]
- Respect
IgnoreUnhandledException
when batch processing [#216]
4.3.2
Fixes
- Fix potential message loss in
OutboxWorker
4.3.1
Fixes
- Fix deadlock in
OutboxWorker
whenenforceMessageOrder=true
(default)
4.3.0
What's new
- Upgrade to MQTTnet 4.2.0.706
- Upgrade to Confluent.Kafka 2.1.1
- Upgrade to Newtonsoft.Json 13.0.3
- Add
ReasonCode
andReasonString
toMqttProduceException
message
4.2.1
Fixes
- Prevent an
ObjectDisposedException
to be thrown by theBrokerCallbackInvoker
during application shutdown - Fix possible deadlock in BatchSequence with timeout
4.2.0
What's new
- Upgrade to Confluent.Kafka 2.1.0
4.1.2
Fixes
- Fix chained error policies attempts counter
4.1.1
Fixes
- Fix bug in outbox producer writing to the wrong endpoint [#165]
4.1.0
What's new
- Upgrade to Confluent.Kafka 2.0.2
- Replace the deprecated package
Confluent.Kafka.SchemaRegistry.Serdes
withConfluent.Kafka.SchemaRegistry.Serdes.Avro
- Simplify the Avro serializer configuration and add samples (see Kafka - Avro)
4.0.1
What's new
- Upgrade to MQTTnet 4.1.4.563
4.0.0
What's new
- Upgrade to MQTTnet 4.1.3.436
- Upgrade to Confluent.Kafka 1.9.3
- Upgrade to Newtonsoft.Json 13.0.2
- Disable server-side offset commit in KafkaConsumer when
GroupId
is not set
Breaking changes
- Some breaking changes in MQTTnet 4 are reflected into Silverback
3.8.0
What's new
- Topic name resolvers can be used to filter the messages to be produce: returning
null
will discard the message
Fixes
- Fix error policies not being triggered consistently when batch consuming
- Make
IntegrationSpy
fully thread-safe - Prevent errors when the IKafkaPartitionsRevokedCallback is invoked during application shutdown
- Improve error handling during connection to MQTT
3.7.3
Fixes
- Support topic names with symbols (e.g. hyphens) in mocked MQTT broker
3.7.2
Fixes
- Correctly invoke the IKafkaOffsetCommittedCallback when auto commit is disabled [#167]
3.7.1
Fixes
- Improve message streams abort process to avoid first chance exceptions (e.g. during dispose)
3.7.0
What's new
- Implement basic support for Kafka transactions via KafkaTransactionalProducer (Note: this is just a first step and a more comprehensive implementation is planned for the upcoming release 4.0.0)
- Skip chunking when processing single chunk messages
Fixes
- Fix possible race condition in consumer pipeline
3.6.1
Fixes
- Handle race condition in BatchSequence with timeout
- Limit consumer status history
3.6.0
What's new
- Handle
IAsyncEnumerable<T>
returned by the subscriber and republished the contained messages - Enrich Kafka messages moved by the MoveMessageErrorPolicy adding some extra headers containing some information about the source topic, partition, offset, etc. (see Message Headers)
- Allow filters such as the KafkaGroupIdFilterAttribute or MqttClientIdFilterAttribute to be added to the subscribers at runtime via the configuration API (see Multiple Consumer Groups (in same process) and Multiple Clients (in same process))
- Add overload for
Publish
method in the error policies that forwards the exception as well as the envelope - Throw
TimeoutException
from KafkaTestingHelper and MqttTestingHelper - Improve MQTT connection related logs (info for successful reconnect and add broker name to log messages)
- Support shared sessions in mocked MQTT broker
Fixes
- Ensure each consumed message gets a unique traceId (when the traceparent header is not present)
- Fix memory leak in consumer
- Fully validate messages, including nested objects
3.5.0
What's new
- Log
MqttClient
internal events (see Logging) - Upgrade to Confluent.Kafka 1.8.2
- Upgrade to MQTTnet 3.0.16
- Upgrade to RabbitMQ.Client 6.2.2
- Update several dependencies
Fixes
- Fix MqttConsumer reconnection issues
- Handle edge cases related to MQTT acknowledgment timeout in MqttConsumer
- Allow max retries specification and error policies chains with MQTT V3
3.4.0
What's new
- Support encryption key rotation (see Encryption)
3.3.1
Fixes
- Fix
AddHeaders<TMessage>
andWithKafkaKey<TMessage>
not being correctly invoked by allIProducer.Produce
andIProducer.ProducerAsync
overloads - Add endpoint friendly name to all logs
3.3.0
What's new
- Optimize in-memory mocked Kafka (avoid spawning too many threads)
- Support multiple brokers (with overlapping topic names) in mocked Kafka and MQTT
- Add message validation for both producer and consumer (see Message Validation)
- Add new
AddInbound
overloads specifying message type for a more compact configuration when using the typed deserializer (see Serialization)
Fixes
- Invoke the Kafka partition EOF callback for all connected consumers
- Ignore null or empty Kafka key in producer
3.2.0
What's new
- Add new Kafka partition EOF callback to be notified when the end of a partition is reached by the consumer (see Kafka Events and IKafkaPartitionEofCallback)
- Allow multiple calls to IKafkaConsumerEndpointBuilder.Configure or IKafkaProducerEndpointBuilder.Configure for the same endpoint
- Observe a grace period in the ConsumersHealthCheck to prevent false positives during a normal Kafka rebalance
- Add optional friendly name to the endpoints (see IEndpointBuilder
.WithName and Endpoint.FriendlyName) - Allow filtering the endpoints targeted by the ConsumersHealthCheck (see AddConsumersCheck)
3.1.1
Fixes
- Invoke broker callbacks during the application shutdown to allow custom code to be run when disconnecting
3.1.0
What's new
- Add new ways to configure headers and kafka key (see Message Headers and Kafka Partitioning and Message Key)
- New callbacks for Kafka log events (see Kafka Events)
- Improve consumer status tracking introducing ConsumerStatus.Ready
- Revert the Kafka consumer status from
Ready
toConnected
whenever partitions are revoked or a poll timeout occurs - Adapt consumer health check to monitor the new status and report unhealthy if not
Ready
(see Health Monitoring)
- Revert the Kafka consumer status from
- Try to automatically recover from Kafka maximum poll interval exceed errors
- Improve Kafka static partition assignment with resolver function and fetching the available partitions (see Kafka Partitioning and Message Key)
- Upgrade to Confluent.Kafka 1.7.0
- Upgrade to MQTTnet 3.0.15
Fixes
- Prevent possible race condition causing messages to be skipped when a
RetryPolicy
kicks in for messages from multiple Kafka partitions simultaneously - Prevent
ObjectDisposedException
to be thrown when Kafka events (e.g. statistics) are fired during the application shutdown - Prevent
ObjectDisposedException
to be thrown whenConsumer.Dispose
is called multiple times - Properly clear the trace context (
Activity
) when reconnecting the consumer to prevent the newly started consume loop to be tracked under the current message traceId - Fix wrong prefix in MQTT log event names
3.0.1
Fixes
- Fix IOutboxWriter lifecycle [#128]
3.0.0
What's new
- Add support for MQTT (see Connecting to a Message Broker, Inbound Endpoint, Outbound Endpoint, ...)
- Simplify configuration and reduce boilerplate (see Subscribing and Connecting to a Message Broker)
- Simplify subscribers registration and get rid of the ISubscriber interface (see Subscribing)
- Scan subscribers automatically at startup to reduce cost of first message
- Connect brokers and handle graceful shutdown automatically (see Connecting to a Message Broker)
- Improve endpoints configuration API (see Connecting to a Message Broker)
- Add IServiceCollection.ConfigureSilverback extension method to conveniently split the configuration code (see Enabling Silverback)
- Refactor Silverback.Integration to support streaming
- Create IMessageStreamEnumerable<TMessage> (see Streaming)
- Improve chunking support in conjunction with streaming, requiring only one chunk at a time to be loaded into memory
- Redesign sequences handling to support chunking, batch consuming and future sequences as well
- Improve Kafka partitions handling (see Kafka Partitioning and Message Key)
- Process partitions independently and concurrently
- Add setting to produce to a specific partition
- Add setting to manually assign the consumer partitions
- Add option to throw an exception if no subscriber is handling a message that was published to the internal bus or was consumed from a message broker (see
throwIfUnhandled
argument in the IPublisher methods and ThrowIfUnhandled property in the IConsumerEndpoint) - Handle null messages as Tombstone/Tombstone<TMessage> (see Tombstone Message)
- Replace Newtonsoft.Json with System.Text.Json to improve serialization and deserialization performance (the old serializers have been moved into the Silverback.Integration.Newtonsoft package, see Serialization)
- Improve outbound routing customization options with endpoint name resolvers (see Outbound Messages Routing)
- Add non-blocking
Produce
/ProduceAsync
/RawProduce
/RawProduceAsync
overloads to IProducer, better suitable for higher throughput scenarios (see Producer) - Refactor broker event handlers (see Broker Callbacks)
- Expose IConsumer.StopAsync and IConsumer.StartAsync methods to pause and resume consumers
- Add log levels configuration (see Logging)
- Improve (distributed) tracing (see Logging)
- Allow header names customization (see Message Headers)
- Add consumer status information and statistics (see Connecting to a Message Broker)
- Add basic consumer health check (see Health Monitoring)
- Allow broker behaviors to be registered as transient, meaning that an instance will be created per each producer or consumer (see Broker behaviors pipeline)
- Improve code quality
- Enhance CI pipeline to use Roslyn analyzers
- Integrate SonarCloud)
- Improve integration tests
- Increase automated tests coverage
- Enable nullable reference types and adjust all API
- Document the entire public API (see API Documentation)
- Released some utilities to help writing automated tests involving Silverback.Integration (see Testing)
- Upgrade to Confluent.Kafka 1.6.2
- Upgrade to RabbitMQ.Client 6.2.1
Fixes
- Fix OutboxWorker not publishing custom headers [#102]
Breaking Changes
- Refactored IPublisher
- Removed the overloads to publish a batch of messages (see Publishing)
- Cannot subscribe to collection of messages anymore (see Subscribing), unless they are consumed from a message broker (see Streaming)
- The chunks belonging to the same message must be contiguous (interleaved messages are at the moment not supported anymore) and in the same partition in case of Kafka
- Removed ISubscriber interface
- Removed BusConfigurator (moved all the configuration into the ISilverbackBuilder extension methods)
- Replaced BusConfigurator.Connect with ISilverbackBuilder.AddEndpointsConfigurator and ISilverbackBuilder.AddEndpoints (or ISilverbackBuilder.AddKafkaEndpoints etc.) to configure the endpoints, while the broker is connected automatically at startup (see Connecting to a Message Broker)
- Replaced BusConfigurator.Subscribe methods with ISilverbackBuilder.AddDelegateSubscriber (see Subscribing)
- Replaced BusConfigurator.HandleMessagesOfType methods with ISilverbackBuilder.HandleMessageOfType (see Subscribing)
- BusConfigurator.ScanSubscribers is not needed anymore since it gets called automatically at startup (from an IHostedService)
- Removed IServiceCollection.Add*Subscriber, IServiceCollection.Add*Behavior, IServiceCollection.Add*BrokerBehavior, IServiceCollection.AddEndpointsConfigurator, IServiceCollection.Add*OutboundRouter extension methods, use the same methods on the ISilverbackBuilder (using IServiceCollection.ConfigureSilverback to get an instance if the ISilverbackBuilder if necessary, as shown in Enabling Silverback)
- Removed IBrokerOptionsBuilder.Add*BrokerBehavior, IBrokerOptionsBuilder.RegisterConfigurator, IBrokerOptionsBuilder.Add*OutboundRouter extension methods, use the same methods on the ISilverbackBuilder (using IServiceCollection.ConfigureSilverback to get an instance if the ISilverbackBuilder if necessary, as shown in Enabling Silverback)
- Reorganized the
Silverback.Messaging.Configuration
namespace moving some broker specific types underSilverback.Messaging.Configuration.Kafka
,Silverback.Messaging.Configuration.Rabbit
orSilverback.Messaging.Configuration.Mqtt
- The visibility of some types has been changed to internal to favor a cleaner and clearer API where the public types are well documented and their backward compatibility is valued
- Removed Silverback prefix from exceptions name
- Removed the IRequest
interface (it was implemented by both IQuery<TResult> and ICommand<TResult>) - Changed Impl methods suffix with Core, this affects some virtual members in the Broker<TProducerEndpoint, TConsumerEndpoint> and other base classes
- IConsumer.Received event replaced by a callback delegate
- IBroker.GetConsumer and IBrokerCollection.GetConsumer methods renamed to IBroker.AddConsumer and IBrokerCollection.AddConsumer
- IQueueProducer and IQueueConsumer renamed to IOutboxWriter and IOutboxReader
- The messages with a null body are by default mapped to a Tombstone/Tombstone<TMessage> (see Tombstone Message)
- Database:
- Moved all entities (used with Entity Framework Core) to the
Silverback.Database.Model
namespace - Replaced InboundMessage entity with InboundLogEntry
- Replaced OutboundMessage entity with OutboxMessage
- Removed TemporaryMessageChunk
- Modified schema of StoredOffset entity
- Moved all entities (used with Entity Framework Core) to the
- Moved and renamed some internally used types (e.g. QueuedMessage, DbQueuedMessage, ...)
- Complete redesign of the error policies
- Removed IMessageIdProvider and all related logic: the
Id
orMessageId
property will not be automatically initialized anymore and its value will not be used as identifier for the outbound message anymore (refer to the Message Identifier page for further details on how to set a custom message id, if needed) - WithConnectionTo<>, WithConnectionToKafka, WithConnectionToRabbitMQ and WithInMemoryBroker have been removed, please use the new WithConnectionToMessageBroker and AddKafka/AddRabbit methods (see Connecting to a Message Broker)
- Replaced the internal messages for the Kafka events such as partitions revoked/assigned, offset commit, error, log and statistics with event handler interfaces (see Kafka Events)
- Deprecated Silverback.Integration.InMemory, use Silverback.Integration.Kafka.Testing, Silverback.Integration.RabbitMQ.Testing, etc. instead
- Renamed PartitioningKeyMemberAttribute to KafkaKeyMemberAttribute
- Silverback.Integration.Configuration has been discontinued
- Renamed
Settings
property toOptions
in the default JsonMessageSerializer (since the switch to System.Text.Json) - Removed
LogWithLevel
method from SkipMessageErrorPolicy, use the newWithLogLevels
configuration instead - Removed
Parallel
option from SubscribeAttribute - Renamed
Offset
to a more genericBrokerMessageIdentifier
in the Silverback.Integration abstractions (including the envelopes) - Some changes to the behaviors:
- Renamed
Handle
toHandleAsync
in the IBehavior, IProducerBehavior and IConsumerBehavior - Changed signature of the
HandleAsync
method (see Behaviors and Broker behaviors pipeline) - Changed some sort indexes and introduced some new broker behaviors, you may need to adjust the sort index of your custom behaviors (see Broker behaviors pipeline for the updated list of built-in behaviors)
- Renamed
- Replaced IBroker.Connect and IBroker.Disconnect with IBroker.ConnectAsync and IBroker.DisconnectAsync
- Some major changes to batch consuming:
- Removed all batch events (BatchStartedEvent, BatchCompleteEvent, BatchProcessedEvent, BatchAbortedEvent), refer to Streaming to learn how to leverage the new IMessageStreamEnumerable<TMessage>
- Setting the batch size to 1 doesn't disable batching anymore, set the
Batch
tonull
in the ConsumerEndpoint to disable it - When batching is enabled the messages can be subscribed only via the IMessageStreamEnumerable<TMessage> (see Streaming), the subscribers to the single messages will not be invoked
- ChunkSettings moved from
Silverback.Messaging.LargeMessages
namespace toSilverback.Messaging.Sequences.Chunking
- Replaced CoreEventIds, IntegrationEventIds, KafkaEventIds and RabbitEventIds with CoreLogEvents, IntegrationLogEvents, KafkaLogEvents and RabbitLogEvents (see also Logging)
- Deprecated support for Entity Framework 2, only the version 3.0.1 of Silverback.Core.EntityFrameworkCore will work with Silverback 3.0.0
- Modified message encryption for chunked messages and it will not be compatible with previous versions of Silverback (affects chunking+encryption only)
2.2.0
What's new
- Allow custom outbound routers to be registered as scoped or transient (instead of singleton only)
2.1.2
Fixes
- Fix delay in Retry policy [#97]
2.1.1
What's new
- Add support for multiple message brokers (Kafka and RabbitMQ) in the same application (see Connecting to a Message Broker)
- Add end-to-end message encryption (see Encryption)
- Add dynamic custom routing of outbound messages (see Outbound Messages Routing)
- Improve support for message headers (see Message Headers)
- Add support for binary files (see Binary Files)
- Improve message identifier handling: the IIntegrationMessage is not required to have an
Id
property anymore (thex-message-id
header will still be generated and if the property exists will continue to be automatically initialized) x-first-chunk-offset
header added by default (see Message Headers)- Deserialize KafkaStasticsEvent JSON and provided its content as an object (in addition to the raw JSON)
- Add support for Apache Avro and schema registry (see Serialization)
- Upgrade to Confluent.Kafka 1.4.2
- Add consumer
PrefetchSize
andPrefetchCount
settings to RabbitConsumerEndpoint - Add
AcknowledgeEach
to the RabbitConsumerEndpoint to define the number of message processed before sending the acknowledgment to the server - Upgrade to RabbitMQ.Client 6.0.0
- Improve message type resolution performance and reliability in JsonMessageSerializer
- Add
LogWithLevel
method to SkipMessageErrorPolicy to specify the desired level for the "Message skipped" log entry (the default is now increased toError
)
Breaking Changes
These changes shouldn't affect you unless you built your own IBroker implementation or are interacting at low-level with the IBroker (this is why has been decided to still mark this as a minor release):
- The IBroker interface and Broker<TProducerEndpoint, TConsumerEndpoint> abstract base class have been modified to explicitly declare which endpoint type is being handled by the broker implementation
- The IMessageSerializer interfaces has been changed
- The IConsumerBehavior and IProducerBehavior interfaces have been changed
- Changed the parameters order in some less used overloads in the IBrokerOptionBuilder
Announced Breaking Changes
These aren't real breaking changes but some methods have been marked as deprecated and will be removed in one of the next major releases:
WithConnectionTo<>
,WithConnectionToKafka
andWithConnectionToRabbitMQ
are deprecated (they will still be supported in this version), please use the newWithConnectionToMessageBroker
andAddKafka
/AddRabbit
methods (see Connecting to a Message Broker)
2.0.0
What's new
- Create Silverback.Integration.RabbitMQ package to connect Silverback with RabbitMQ (see Connecting to a Message Broker)
- Enable subscription of messages with an empty body (you must subscribe to the IInboundEnvelope) [#61]
- Add hook to manually set the Kafka partition start offset when a partition is assigned to the consumer (see Kafka Events) [#57]
- Support for multiple consumer groups running in the same process (see Multiple Consumer Groups (in same process)) [#59]
- Publish KafkaStatisticsEvent also from the KafkaProducer (previously done in KafkaConsumer only)
- Several reliability and performance related improvements
Breaking Changes
- The IBroker, IProducer and IConsumer interfaces have been slightly modified (it shouldn't affect you unless you built your own IBroker implementation)
- Many interfaces (such as IBehavior) and delegates have been slightly modified to pass around an IReadOnlyCollection
instead of an IEnumerable , to avoid the possible issues related to multiple enumeration of an IEnumerable - The IMessageKeyProvider interface has been renamed to IMessageIdProvider to prevent to be mistaken with the Kafka Key or Rabbit's Routing Key
- IInboundMessage/IOutboundMessage (plus all the related types) have been renamed to IInboundEnvelope/IOutboundEnvelope and the property containing the actual message has been renamed from
Content
toMessage
- The
MustUnwrap
option has been removed from the inbound connector configuration (messages are unwrapped by default)
1.2.0
What's new
- Publish events to the internal bus as a consequence to the Kafka events such as partitions assigned or revoked (see Kafka Events) [#34]
1.1.0
What's new
- Add IEndpointsConfigurator interface to allow splitting the endpoints configuration across multiple types (see Connecting to a Message Broker)
- Add support for distributed tracing (based on System.Diagnostics)
- Add IProducerBehavior and IConsumerBehavior to create an extension point closer to the actual message broker logic (see Broker behaviors pipeline)
Breaking Changes
- Replaced ISortedBehavior with a generic ISorted interface
1.0.5
What's new
- Upgrade to Confluent.Kafka 1.3.0
Fixes
- Fix
OutboundQueueHealthCheck
[#43] - Remove automatic disposal of the KafkaProducer when a KafkaException is thrown (creating too many instances of the producer over a short time span could lead to too many active TCP connections)
- Fix the bug preventing a KafkaConsumerEndpoint pointing to multiple topics to be successfully subscribed
1.0.4
Fixes
- Fix mortal loop issue: it is finally safe to consume and produce the same type of messages from within the same process (in a natural way, without any extra configuration)
- Since version 1.0.0 the messages routed to an endpoint aren't forwarded to any subscriber directly
- Now the inbound connector has been fixed as well, preventing the inbound messages to be immediately routed once again to the outbound endpoint and eliminating all possible causes of mortal loops
1.0.3
What's new
- Deprecate PartitioningKeyMemberAttribute in favor of KafkaKeyMemberAttribute, since the message key isn't used just for partitioning (see Kafka Partitioning and Message Key)
Fixes
- Forward Kafka message key as-is (not hashed anymore) to avoid possible collisions and simplify debugging
1.0.2
Fixes
- Reintroduce
Add*Subscriber
andAdd*Behavior
as IServiceCollection extension methods (for backward compatibility and greater flexibility) [#41] - Add
WithInMemoryBroker
andOverrideWithInMemoryBroker
extension methods (see Testing)
1.0.0
What's new
- Optimize message size (no wrappers anymore)
- Improve headers usage: identifiers, types, chunks information, etc. are now all sent in the headers
- Review severity of some log entries
- Improve and clean up internal implementation
- Improve exception handling (flattening of AggregateException)
- Upgrade to Confluent.Kafka 1.2.2
- Add automatic recovers from fatal errors in KafkaConsumer (can be disabled via Endpoint configuration)
- Support .Net Core 3.0 and Entity Framework Core 3.0
- Refactor packages (EF binding logic is now in a single package, versioned after the related EF version)
- Improve configuration API
- Improve and optimize performance (including #37)
- Improve database locks mechanism (used also to run the OutboundQueueWorker)
Fixes
- Fix issue requiring types not implementing IMessage to be registered with
HandleMessagesOfType<T>
to consume them [#33] - Mitigate issue causing the DistributedBackgroundService to sometime fail to acquire the database lock [#39]
- Fix partition key value being lost when using the DeferredOutboundConnector
- Other small fixes to improve stability and reliability
Breaking Changes
- By default the messages published via IPublisher that are routed to an outbound endpoint are not sent through to the internal bus and cannot therefore be subscribed locally, within the same process (see Outbound Endpoint)
- Some changes in IInboundMessage and IOutboundMessage interfaces
- Changes to the schema of the outbox table (Silverback.Messaging.Connectors.Model.OutboundMessage)
- The configuration fluent API changed quite a bit, refer to the current documentation
Important
WithConnectionTo<KafkaBroker>
has to be replaced with WithConnectionToKafka
in order for all features to work properly. When failing to do so no message key will be generated, causing the messages to land in a random partition and/or preventing to publish to a compacted topic. (see Kafka Partitioning and Message Key)
- Silverback.Integration.EntityFrameworkCore and Silverback.EventSourcing.EntityFrameworkCore have been deprecated (Silverback.Core.EntityFrameworkCore contains all the necessary logic to use EF as store)
- KeyMemberAttribute has been renamed to PartitioningKeyMemberAttribute (see Connecting to a Message Broker)
0.10.0
What's new
- Improve error handling: now all exceptions, including the ones thrown by the message serialzer can be handled through the error policies
- Improve logs: promoted some important logs to Information level, writing all processing errors as (at least) Warning and improved logged information quality (logged attributes)
- Add ability to modify messages and headers when moving them via MoveMessageErrorPolicy
- Refactor message processing to a cleaner, more extensible and predictable API and behavior
Fixes
- Fixed several small (and not so small) issues and bugs
0.8.0 - 0.9.0
Released two versions mostly to fix bugs, do some small adjustments according to some user feedbacks and update the external dependencies (e.g. Confluent.Kafka 1.0.1).
Fixes
- Fix exception loading error policies from JSON in Silverback.Integration.Configuration [#24]
0.7.0
What's new
- Upgrade to Confluent.Kafka 1.0.0
- Create a simple event store that perfectly integrates with the rest of the Silverback framework (see Event Sourcing)
- Add Silverback.Integration.InMemory package to mock the message broker behavior in your unit tests
- Several small optimizations and improvements
0.6.0
What's new
- Add support for message headers
- Simplify message subscription even further: now all public methods of the types implementing the marker interface ISubscriber are automatically subscribed by default without having to annotate them with the SubscribeAttribute (this behavior is customizable)
- Upgrade to Confluent.Kafka 1.0.0-RC1
0.3.x - 0.5.x
Some releases where done adding quite a few features.
What's new
- Add Silverback.Integration.Configuration package to load the inbound/outbound configuration from the app.settings json
- Add batch processing
- Add parallel subscribers
- Add delegate subscription as an alternative to SubscribeAttribute based subscription
- Improve support for Rx.net
- Add support for legacy messages and POCO classes
- Add offset storage as an alternative and more optimized way to guarantee exactly once processing, storing just the offset of the last message instead of logging every message (see Inbound Endpoint)
- Add behaviors as a convenient way to implement your cross-cutting concerns (like logging, validation, etc.) to be plugged into the internal bus publishing pipeline (see Behaviors)
- Add message chunking to automatically split the larger messages and rebuild them on the other end (see Chunking)
- ...much more...and a huge amount of refactorings
Fixes
- Several fixes and optimizations
0.3.2
The very first public release of Silverback! It included:
- In-process message bus
- Inbound/outbound connector for message broker abstraction
- Kafka broker implementation
- Outbox table pattern implementation
- Exactly once processing
- ...