参考资料:
官方文档(推荐)
关于Kafka和rabbitMQ的安装教程,见本人之前的博客
重!!!
个人整理SpringCloud-Stream各部分概念、配置方法、配置项大全
Stream基本配置(Kafka、RabbitMQ和RocketMQ)
Stream消费者组(解决Kafka消费者组只有一个消费者的问题)
相关说明及注意事项:
- springcloud-stream是springCloud的一项功能,所以需要和springBoot有严格的版本对应关系,参照
- 上述参考demo中有单个服务的搭建方式,也有多个微服务的搭建方式
- 且git仓库并没有出现中文乱码的情况,下载到本地出现中文乱码注意编码格式
分区概念:
1.官方介绍
- 中文文档
- 英文文档介绍:Learn标签选择对应版本说明文档→overview→Main Concepts(Consumer Groups)
overview
Main Concepts(Consumer Groups)
2.Stream分区介绍
- 上篇文章已经讲了消费组默认以轮询的方式消费交换机中的消息
- 但是在生产实践中,我们需要特性的消费者(组)消费特定的消息,这就需要进行分区处理
- 可以看到,在配置分区后,实现了特定的消费者(组)对特定的消息进行消费
3.生产者重要配置说明
- Stream消息分区有两种方式:
消息分区方式 | 优点 | 缺点 |
比较固定的消息和分区对应关系 | 配置简单 | 对应关系比较固定 |
自定义的消息和分区对应关系 | 配置较多 | 对应关系完全可以自定义 |
- 比较固定的消息和分区对应关系配置方式:
- ①、如果是Kafka的话,在创建Binder实例中,开启自动创建分区机制,其他的MQ不用,具体参照概念篇的Binders部分
#这句话一定要添加 因为默认是关闭的 spring.cloud.stream.binders.mykafka.environment.spring.cloud.stream.kafka.binder.auto-add-partitions=true
- ②、生产者Binding阶段规定分区数量以及发送的消息与分区的对应关系,关键字为
partition-count 和 partition-key-expression
- 具体参照,官方引文文档:Learn标签选择对应版本说明文档→overview→Configuration Options(Binding Properties(Producer Properties))
overview
Configuration Options(Binding Properties(Producer Properties))
- ③、其中partition-count后面跟对应地分区数量即可,而partition-key-expression则有三种对应方式:1)直接指定消息分区的方式;2)按照消息的实体类型进行分区,如String,User,Role等;3)按照消息的header相同key的不通value进行分区
1)直接指定消息分区的方式
使用partition-key-expression指定生产者要发送到的消息分区,value类型为int,范围为[0,partition-count-1],这种方式很不灵活,适用范围较小。
spring.cloud.stream.bindings.output.producer.partition-count=2
#如果是数字的话 表示 发送到分区的编号 从0开始 最大值为 partitionCount-1
spring.cloud.stream.bindings.output.producer.partition-key-expression=0
2)按照消息的实体类型进行分区,如String,User,Role等
使用partition-key-expression的值设置为payload,系统会默认根据消息的实体类型进行分区(分区的数量应该和生产者发送消息的实体类型数量一致)
spring.cloud.stream.bindings.mykafka_output01.producer.partition-count=2
#如果值是 payload,将会使用放在payload的实体类型作为分区依据,可以为自定义类型比如 User,Role 等等。
spring.cloud.stream.bindings.mykafka_output01.producer.partition-key-expression=payload
3)按照消息的header相同key的不通value进行分区
使用partition-key-expression的值设置为headers['<headerKey>'],系统会默认根据消息的Header相同的Key值不同的value值进行分区(分区的数量应该和生产者发送消息Header相同key的value数量一致)
spring.cloud.stream.bindings.mykafka_output02.producer.partition-count=2
#如果值是 headers,将会使用放在header的key值作为分区依据
spring.cloud.stream.bindings.mykafka_output02.producer.partition-key-expression=headers['selfKey']
- 自定义的消息和分区对应关系的配置方式
- ①、 如果是Kafka的话,在创建Binder实例中,