- Removed
SerializationContext
from non-async serde interfaces. - Replaced
ISerializer
interface withSerializer
delegate. - Replaced
IDeserializer
interface withDeserializer
delegate.
Producer.Poll
can now be used with producer instances that are in background polling mode.- Typically use: Block for a minimal period of time following a
ErrorCode.Local_QueueFull
error.
- Typically use: Block for a minimal period of time following a
- Removed the
Confluent.Kafka.Serdes
namespace.
- Added
CompressionType
property toProducerConfig
class.
- References librdkafka.redist v1.0.0
- Moved API docs from the client classes to their respective interfaces.
- Update formatting of client API docs so they display well in Visual Studio Code intellisense.
- Added GET subject versions to the cached schema registry client.
- References librdkafka.redist 1.0.0-RC9
- supports apline linux out-of-the-box.
- fallback support (that excludes security features) for most linux distributions previously unsuppored out-of-the-box.
- fixed a dependency issue on MacOS
- A new rebalance API.
SetRebalanceHandler
has been split intoSetPartitionsAssignedHandler
andSetPartitionsRevokedHandler
.- Calling of
Assign
/Unassign
in these handlers is prohibited. - Partitions to read from / start offsets can be optionally specified manually via the return value from these handlers.
- The
Message.PersistenceStatus
property name has changed toMessage.Status
. - Moved the
GetWatermarkOffsets
andQueryWatermarkOffsets
methods from admin client to consumer. - Context is now provided to serdes via a
SerializationContext
class instance.
- Corrected an error in the
rd_kafka_event_type
method signature which was causing incompatibility with mono. - Audited exception use across the library and made changes in various places where appropriate.
- Removed unused
CancellationToken
parameters (we will add them back when implemented). - Builder classes now return interfaces, not concrete classes.
- Removed the dependency on
CompilerServices.Unsafe
which was causingProduceAsync
to hang in some scenarios. - Fixed a deadlock-on-dispose issue in
AdminClient
. - Made
Producer.ProduceAsync
async.
- Revamped producer and consumer serialization functionality.
- There are now two types of serializer and deserializer:
ISerializer<T>
/IAsyncSerializer<T>
andIDeserializer<T>
/IAsyncDeserializer<T>
.ISerializer<T>
/IDeserializer<T>
are appropriate for most use cases.IAsyncSerializer<T>
/IAsyncDeserializer<T>
are async friendly, but less performant (they returnTask
s).
- Changed the name of
Confluent.Kafka.Avro
toConfluent.SchemaRegistry.Serdes
(Schema Registry may support other serialization formats in the future). - Added an example demonstrating working with protobuf serialized data.
- There are now two types of serializer and deserializer:
Consumer
s,Producer
s andAdminClient
s are now constructed using builder classes.- This is more verbose, but provides a sufficiently flexible and future proof API for specifying serdes and other configuration information.
- All
event
s on the client classes have been replaced with correspondingSet...Handler
methods on the builder classes.- This allows (enforces) handlers are set on librdkafka initialization (which is important for some handlers, particularly the log handler).
event
s allow for more than one handler to be set, but this is often not appropriate (e.g.OnPartitionsAssigned
), and never necessary. This is no longer possible.event
s are also not async friendly (handlers can't returnTask
). The Set...Handler appropach can be extend in such a way that it is.
- Avro serdes no longer make blocking calls to
ICachedSchemaRegistryClient
- everything isawait
ed.- Note: The
Consumer
implementation still calls async deserializers synchronously because theConsumer
API is still otherwise fully synchronous.
- Note: The
- Reference librdkafka.redist 1.0.0-RC7
- Notable features: idempotent producer, sparse connections, KIP-62 (max.poll.interval.ms).
- Note: End of partition notification is now disabled by default (enable using the
EnablePartitionEof
config property).
- Removed the
Consumer.OnPartitionEOF
event in favor notifying of partition eof viaConsumeResult.IsPartitionEOF
. - Removed
ErrorEvent
class and addedIsFatal
toError
class.- The
IsFatal
flag is now set appropriately for all errors (previously it was always set tofalse
).
- The
- Added
PersistenceStatus
property toDeliveryResult
, which provides information on the persitence status of the message.
- Added
Close
method toIConsumer
interface. - Changed the name of
ProduceException.DeliveryReport
toProduceException.DeliveryResult
. - Fixed bug where enum config property couldn't be read after setting it.
- Added
SchemaRegistryBasicAuthCredentialsSource
back intoSchemaRegistryConfig
(#679). - Fixed schema registry client failover connection issue (#737).
- Improvements to librdkafka dependnecy discovery (#743).
- References librdkafka 1.0.0-PRE1. Highlights:
- Idempotent producer.
- Sparse connections (broker connections are only held open when in use).
- Fixed a memory leak in
ProduceAsync
#640 (regression from 0.11.x).
- Added an AdminClient, providing
CreateTopics
,DeleteTopics
,CreatePartitions
,DescribeConfigs
andAlterConfigs
. - Can now produce / consume message headers.
- Can now produce user defined timestamps.
- Added
IClient
,IProducer
andIConsumer
interfaces (useful for dependency injection and mocking when writing tests). - Added a
Handle
property to all clients classes:- Producers can utilize the underlying librdkafka handle from other Producers (replaces the 0.11.x
GetSerializingProducer
method on theProducer
class). AdminClient
can utilize the underlying librdkafka handle from otherAdminClient
s,Producer
s orConsumer
s.
- Producers can utilize the underlying librdkafka handle from other Producers (replaces the 0.11.x
IDeserializer
now exposes message data viaReadOnlySpan<byte>
, directly referencing librdkafka allocated memory. This results in a considerable (up to 2x) performance increase and reduced memory.- Most blocking operations now accept a
CancellationToken
parameter.- TODO: in some cases there is no backing implementation yet.
- .NET Specific configuration parameters are all specified/documented in the
ConfigPropertyNames
class.
- The
Message
class has been re-purposed and now encapsulates specifically the message payload only.ProduceAsync
/BeginProduce
now return aDeliveryReport
object andConsumer.Consume
returns aConsumeResult
object.
- The methods used to produce messages have changed:
- Methods that accept a callback are now named
BeginProduce
(notProduceAsync
), analogous to similar methods in the standard library. - Callbacks are now specified as
Action<DeliveryReportResult<TKey, TValue>>
delegates, not implementations ofIDeliveryHandler
. - The
IDeliveryHandler
interface has been depreciated. - There are two variants of
ProduceAsync
andBeginProduce
, the first takes a topic name and aMessage
. The second takes aTopicPartition
and a message.- i.e. when producing, there is now clear separation between what is produced and where it is produced to.
- The new API is more future proof.
ProduceAsync
now callsSetException
instead ofSetResult
on the returnedTask
, making error checking more convenient and less prone to developer mistakes.
- Methods that accept a callback are now named
- The feature to block
ProduceAsync
calls on local queue full has been removed (result inLocal_QueueFull
error). This should be implemented at the application layer if required. - The non-serializing
Producer
and non-deserializingConsumer
types have been removed (use generic types withbyte[]
instead), considerably reducing API surface area. - The
ISerializingProducer
interface has been removed - you can achieve the same functionality by sharing client handles instead. - The
Consumer.Poll
method and correspondingOnMessage
event have been removed. You should useConsumer.Consume
instead. - The
Consumer.OnConsumeError
has been removed. Consume errors are now exposed via aConsumeException
. - The
Consumer.Consume
method now returns aConsumeResult
object, rather than aMessage
via an out parameter. CommitAsync
has been removed (useCommit
instead).Commit
errors are reported via an exception and method return values have correspondingly changed.ListGroups
,ListGroup
,GetWatermarkOffsets
,QueryWatermarkOffsets
, andGetMetadata
have been removed fromProducer
andConsumer
and exposed only viaAdminClient
.- Added
Consumer.Close
. - Various methods that formerly returned
TopicPartitionOffsetError
/TopicPartitionError
now returnTopicPartitionOffset
/TopicPartition
and throw an exception in case of error (with aResult
property of typeTopicPartitionOffsetError
/TopicPartitionError
).
- Removed cast from
Error
tobool
. Consumer.OffsetsForTimes
if provided an empty collection will return an empty collection (not throw an exception).manualPoll
argument has been removed from theProducer
constructor and is now a configuration option.enableDeliveryReports
argument has been removed from theProducer
constructor and is now a configuration option.- Removed methods with a
millisecondsTimeout
parameter (always preferring aTimeSpan
parameter). - Added
Consumer.Consume
variants with aCancellationToken
parameter. - Added A
Producer.Flush
method variant without a timeout parameter (but with aCancellationToken
parameter that is observed). - Added the
SyslogLevel
enumeration, which is used by the log handler delegate.
- When delivery reports are disabled,
ProduceAsync
will return completedTask
s rather thanTask
s that will never complete. - Avro serializers / deserializer now handle
null
values. - Examples upgraded to target 2.1.
- Changed name of
HasError
toIsError
- Configuration options have been added to allow fine-grained control over of marshalling of values to/from librdkafka (for high performance usage).
- headers, message keys and values, timestamps and the topic name.
- Improved XML API documentation.
refer to the release notes