Spring Cloud Stream partitionKeyExpression计算错误

时间:2017-07-04 13:53:43

标签: spring stream apache-kafka cloud partitioning

我使用Kafka进行基于Spring Cloud Stream的微服务。

我创建了一个包含4个分区的kafka主题。

我在yml中配置了以下内容:

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

在我的代码中,我的消息类包含(在其超类中)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; 
}

我将TransactionsResponse对象作为消息发送:

final TransactionResponse transactionResponse = handler.handleEvent(event);
if (transactionResponse != null) {
    outputChannels.tableSync().send(MessageBuilder.withPayload(transactionResponse).build());
    log.info("Message Sent: {}", transactionResponse);
}

我的期望是Spring云流将获取密钥payload.partitionKey,计算其hashCode()%4,并将事件发送到该分区。

然而,逻辑是完全随机的。以下是一些例子:

Math.abs(&#34; 111615631&#34; .hashCode()%4)= 1.但是,邮件会发送到3号分区。

Math.abs(&#34; 110019882&#34; .hashCode()%4)= 2.但是,邮件会发送到0号分区。

Math.abs(&#34; 943152574&#34; .hashCode()%4)= 0.此消息确实被发送到0号分区。

Math.abs(&#34; 943198862&#34; .hashCode()%4)= 0.但是,消息将发送到2号分区。

我正在使用Dalston.SR1发布列车。

我在这里缺少什么?

感谢。

更新

尝试使用相同的partitionKey(但略有不同的邮件正文)发送相同的事件。即使分区键是相同的,该消息也会转到两个不同的分区。看起来Spring Cloud Stream完全忽略了partitionKeyExpression。

1 个答案:

答案 0 :(得分:1)

这是我的错,我忘了在yml中添加producer:部分:

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