请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于消息分区如何具体消费的问题

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
  1. 如果使用的是简单的配置方式,可以根据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值等于对应的索引,由该索引的实例去执行吗?

正在回答 回答被采纳积分+3

1回答

张勤一 2022-09-17 21:22:38

其实,在企业级里面的消息队列里面,消息分区是为了增大消费的吞吐,让多个消费者去消费更多的消息,而到底是哪个消费者,通常是不需要关心的,因为每个消费者实例都是一样的。所以,这部分的知识点,简单知道就行了,不要花太多时间在这上面。感兴趣的话,可以多做些实验或者搜下博客看看。

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信