2017-07-04 2 views
0

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.

Répondre

0

il a été mon erreur, j'oublié d'ajouter le producteur: section du YML:

spring: 
    cloud: 
    stream: 
     bindings: 
     SYNC_TABLE: 
      content-type: application/json 
      producer: 
      partitionKeyExpression: payload.partitionKey 
      partitionCount: 4 
      destination: ${envTopicPrefix}.LEGACY_TABLE