J'ai un microservice basé sur Spring Cloud Stream utilisant Kafka. J'ai créé un sujet kafka avec 4 partitions.Spring Cloud Stream partitionKeyExpression calcul erroné
je configurer les paramètres suivants dans mon YML:
spring:
cloud:
stream:
bindings:
SYNC_TABLE:
content-type: application/json
partitionKeyExpression: payload.partitionKey
partitionCount: 4
destination: ${envTopicPrefix}.LEGACY_TABLE
Dans mon code, j'ai ma classe de message qui contient (dans sa superclasse) la variable PartitionKey:
@Data
@EqualsAndHashCode(callSuper=true)
@ToString(callSuper=true)
public class TransactionResponse extends GeneralOutputMessage{
}
@Data
@ToString
public class GeneralOutputMessage {
private String operationType;
private List<String> affectedFields;
private Object data;
private String eventId;
private String eventName;
private String partitionKey;
}
J'envoie l'objet TransactionsResponse sous forme de message:
final TransactionResponse transactionResponse = handler.handleEvent(event);
if (transactionResponse != null) {
outputChannels.tableSync().send(MessageBuilder.withPayload(transactionResponse).build());
log.info("Message Sent: {}", transactionResponse);
}
Mon attente est que le flux de printemps de nuage prendrait la clé payload.partitionKey, calculerait son hashCode()% 4, et enverrait l'événement à cette partition.
Cependant, la logique est complètement aléatoire. Voici quelques exemples:
Math.abs ("111615631" .hashCode()% 4) = 1. Cependant, le message est envoyé à la partition numéro 3.
Math.abs ("110019882". hashCode()% 4) = 2. Cependant, le message est envoyé au numéro de la partition 0.
Math.abs ("943152574" .hashCode()% 4) = 0. Ce message ne fait sont envoyés à numéro de partition 0.
Math.abs ("943198862" .hashCode()% 4) = 0. Cependant, ce message est envoyé à partition numbe J'utilise le train de démoulage Dalston.SR1.
Qu'est-ce qui me manque ici?
Merci.
Mise à jour:
juste essayé d'envoyer le même événement avec le même PartitionKey (mais un peu différent corps du message). Le message va à deux partitions différentes même si la clé de partition est la même. On dirait que Spring Cloud Stream ignore complètement le partitionKeyExpression.