diff --git a/Directory.Build.props b/Directory.Build.props
index bc0a86361..d17709654 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -6,7 +6,7 @@
MITCopyright (c) 2019 Sergio Aquilini
- 1.0.2$(VersionSuffix)
+ 1.0.3$(VersionSuffix)https://beagle1984.github.io/silverback/https://github.com/BEagle1984/silverback/git
diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml
index 5d4d873f6..34b786851 100644
--- a/docs/_data/navigation.yml
+++ b/docs/_data/navigation.yml
@@ -65,8 +65,8 @@ docs:
url: /docs/advanced/serialization
- title: Observable Bus
url: /docs/advanced/rx
- - title: Kafka Partitioning
- url: /docs/advanced/partitioning
+ - title: Kafka Message Key (Partitioning)
+ url: /docs/advanced/kafka-message-key
- title: Using IBroker
url: /docs/advanced/broker
- title: Chunking
diff --git a/docs/_docs/0-introduction/003-releases.md b/docs/_docs/0-introduction/003-releases.md
index c48846880..c3983c21b 100644
--- a/docs/_docs/0-introduction/003-releases.md
+++ b/docs/_docs/0-introduction/003-releases.md
@@ -4,6 +4,12 @@ permalink: /docs/releases
toc: true
---
+## [1.0.3](https://github.com/BEagle1984/silverback/releases/tag/1.0.3)
+
+### Fixes
+* Kafka message key is not hashed anymore to avoid possible collisions and simplify debugging
+* Not really a fix but `PartitioningKeyMemberAttribute` has been deprecated in favor of `KafkaKeyMemberAttribute`, since the message key isn't used just for partitioning (see [Kafka Message Key]({{ site.baseurl }}/docs/advanced/kafka-message-key))
+
## [1.0.2](https://github.com/BEagle1984/silverback/releases/tag/1.0.2)
### Fixes
@@ -38,8 +44,12 @@ toc: true
* 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 (e.g. [Using the Bus]({{ site.baseurl }}/docs/quickstart/bus) and [Connecting to a Message Broker]({{ site.baseurl }}/docs/quickstart/message-broker))
+
+**Important!** `WithConnectionTo` 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 Message Key]({{ site.baseurl }}/docs/advanced/kafka-message-key))
+{: .notice--warning}
+
* `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 [Kafka Partitioning]({{ site.baseurl }}/docs/advanced/partitioning))
+* `KeyMemberAttribute` has been renamed to `PartitioningKeyMemberAttribute` (see [Kafka Message Key]({{ site.baseurl }}/docs/advanced/kafka-message-key))
## [0.10.0](https://github.com/BEagle1984/silverback/releases/tag/0.10.0)
diff --git a/docs/_docs/3-advanced/303-kafka-key.md b/docs/_docs/3-advanced/303-kafka-key.md
new file mode 100644
index 000000000..37af8e1a7
--- /dev/null
+++ b/docs/_docs/3-advanced/303-kafka-key.md
@@ -0,0 +1,28 @@
+---
+title: Kafka Message Key (Partitioning)
+permalink: /docs/advanced/kafka-message-key
+toc: true
+---
+
+Apache Kafka require a message key for different purposes, such as:
+* **Partitioning**: Kafka can guarantee ordering only inside the same partition and it is therefore important to be able to route correlated messages into the same partition. To do so you need to specify a key for each message and Kafka will put all messages with the same key in the same partition.
+* **Compacting topics**: A topic can be configured with `cleanup.policy=compact` to instruct Kafka to keep only the latest message related to a certain object, identified by the message key. In other words Kafka will retain only 1 message per each key value.
+
+Silverback offers a convenient way to specify the message key. It is enough to decorate the properties that must be part of the key with `KafkaKeyMemberAttribute`.
+
+```c#
+public class MultipleKeyMembersMessage : IIntegrationMessage
+{
+ public Guid Id { get; set; }
+
+ [KafkaKeyMember]
+ public string One { get; set; }
+
+ [KafkaKeyMember]
+ public string Two { get; set; }
+
+ public string Three { get; set; }
+}
+```
+
+If no key members are specified no key will be generated and the messages will land in a random partition.
diff --git a/docs/_docs/3-advanced/303-partitioning.md b/docs/_docs/3-advanced/303-partitioning.md
deleted file mode 100644
index 58d7ee913..000000000
--- a/docs/_docs/3-advanced/303-partitioning.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: Kafka Partitioning
-permalink: /docs/advanced/partitioning
-toc: false
----
-
-Kafka can guarantee ordering only inside the same partition and it is therefore important to be able to route correlated messages into the same partition.
-
-To do so you need to specify a key for each message and Kafka will put all messages with the same key in the same partition.
-
-Silverback offers a convenient way to specify the message key. It is enough to decorate the properties that must be part of the key with `PartitioningKeyMemberAttribute`.
-
-```c#
-public class MultipleKeyMembersMessage : IIntegrationMessage
-{
- public Guid Id { get; set; }
-
- [PartitioningKeyMember]
- public string One { get; set; }
-
- [PartitioningKeyMember]
- public string Two { get; set; }
-
- public string Three { get; set; }
-}
-```
-
-If no key members are specified no key will be generated and the messages will land in a random partition.
\ No newline at end of file
diff --git a/samples/Examples/src/Silverback.Examples.Common/Messages/PartitionedSimpleIntegrationEvent.cs b/samples/Examples/src/Silverback.Examples.Common/Messages/PartitionedSimpleIntegrationEvent.cs
index faa256210..0c958ad48 100644
--- a/samples/Examples/src/Silverback.Examples.Common/Messages/PartitionedSimpleIntegrationEvent.cs
+++ b/samples/Examples/src/Silverback.Examples.Common/Messages/PartitionedSimpleIntegrationEvent.cs
@@ -7,7 +7,7 @@ namespace Silverback.Examples.Common.Messages
{
public class PartitionedSimpleIntegrationEvent : IntegrationEvent
{
- [PartitioningKeyMember]
+ [KafkaKeyMember]
public string Key { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Silverback.Integration.Kafka/Messaging/Behaviors/KafkaPartitioningKeyBehavior.cs b/src/Silverback.Integration.Kafka/Messaging/Behaviors/KafkaPartitioningKeyBehavior.cs
index cbbd29eb3..17c47ffcb 100644
--- a/src/Silverback.Integration.Kafka/Messaging/Behaviors/KafkaPartitioningKeyBehavior.cs
+++ b/src/Silverback.Integration.Kafka/Messaging/Behaviors/KafkaPartitioningKeyBehavior.cs
@@ -15,12 +15,6 @@ namespace Silverback.Messaging.Behaviors
{
public class KafkaPartitioningKeyBehavior : ISortedBehavior
{
- private static readonly HashAlgorithm HashAlgorithm = MD5.Create();
-
- public KafkaPartitioningKeyBehavior()
- {
- }
-
public int SortIndex { get; } = 200;
public Task> Handle(IEnumerable