spring: application: name: e-commerce-stream-client cloud: # 消息驱动的配置 stream: # SpringCloud Stream + Kafka kafka: binder: brokers: 127.0.0.1:9092 auto-create-topics: true # 如果设置为false, 就不会自动创建Topic, 你在使用之前需要手动创建好 # SpringCloud Stream + RocketMQ # rocketmq: # binder: # name-server: 127.0.0.1:9876 # 开启 stream 分区支持 instanceCount: 1 # 消费者的总数 instanceIndex: 0 # 当前消费者的索引,从0开始 bindings: # 默认发送方 output: # 这里用 Stream 给我们提供的默认 output 信道 destination: ecommerce-stream-client-default # 消息发往的目的地, Kafka 中就是 Topic content-type: text/plain # 消息发送的格式, 接收端不用指定格式, 但是发送端要指定好,当前是任意字符串 # 发送方和接收方一般是在两个工程里面写 两方的 destination必须一一对应 # 消息分区 producer: # 简单的指定分区划分的方法 #partitionKeyExpression: payload.author # 分区关键字, payload 指的是发送的对象, author 是对象中的成员变量 partitionCount: 1 # 分区大小 # 使用自定义的分区策略, 注释掉 partitionKeyExpression 第一个是Key提取策略,后者是根据key选择对应的分区 partitionKeyExtractorName: districtPartitionKeyExtractorStrategy partitionSelectorName: districtPartitionSelectorStrategy
如果使用的是简单的配置方式,可以根据payload.author这个成员变量来分区,那么这个分区的实例又该在哪里标注可以消费这个带有指定特征的author属性的消息去消费呢。
总结说就是,我不知道哪个分区的实例的哪个位置标注了可以消费这个带有特征的payload.author的消息
@Slf4j @Component public class DistrictPartitionSelectorStrategy implements PartitionSelectorStrategy { /** * 选择分区的策略 * @param key * @param partitionCount * @return */ @Override public int selectPartition(Object key, int partitionCount) { /*partition获取的方式这里只是一个例子,并不能作为真实业务场景 * 在本次例子中key是根据消息体某一个成员变量的得来的,也就是说: * 这样带有相同特征的消息体就可以都发送到指定的实例中 * */ int partition = key.toString().hashCode() % partitionCount; log.info("SpringCloud Stream yada Selector info: [{}], [{}], [{}]", key.toString(), partitionCount, partition); return partition; } }
2.利用自定义配置的分区策略,也是根据消息体中的成员变量配置成有特征的key,然后这个类可以获取这个key,那么获取到这个key了,返回的是int值,那么又是哪个分区的实例在哪里标明了会消费这个int值的key的消息呢。是根据instanceIndex这个实例索引,然后int值等于对应的索引,由该索引的实例去执行吗?