CRRL 是专门为Kafka多集群设计的路由规则语言。
目录
相对Kafka Broker而言,Kafka Producer或Consumer的宿主应用。Client由1个id进行唯一标识,并且可以有多个基于K/V的元信息。
1个Kafka topic,由1个id(即topic name)来唯一标识。1个topic可以部署在某1个cluster上,也可部署在多个cluster上。Topic可以有多个基于K/V的元信息。
某个Topic的1个Consumer Group,由1个id(topic id和consumer group name组成的二元组)来唯一标识。唯一标识1个消费者。Consumer Group可以有多个基于K/V的元信息。
Kafka里Consumer Group由group name标识,可以同时消费多个topic。KBear里,Consumer Group细化为消费某一个确定的Topic的Group。
1个Kafka Cluster,由1个id(即cluster name)来唯一标识。
影响路由的因子。Client、Topic、Consumer都可能影响路由。
factor keys:
- client.id
- client.<metaKey>
- topic.id
- topic.<metaKey>
- consumerGroup.groupName
- consumerGroup.topicId
- consumerGroup.<metaKey>
路由规则。根据路由因子,决定使用哪个集群。
use cluster <cluster.id>
如:
use cluster fws
或
use cluster <cluster.id> when <factor.key>=<factor.value> [and <factor.key>=<factor.value> ...]
use cluster uat when client.env=uat
rule根据用途,分为3类:全局规则、topic特定的规则、consumer group特定的规则。以yaml配置为举例说明。
参与到所有路由寻址过程的规则。
如:
route-rules:
- id: r100001
meta:
rule.isGlobal: true
rule: use cluster fws
只对某个topic有效的规则。
route-rules:
- id: r100002
meta:
topic.id: fx.kafka.demo.hello.run
rule: use cluster uat
只对某个consumer group有效的规则。
route-rules:
- id: r100003
meta:
consumerGroup.groupName: fx.kafka.demo.hello.run.consumer
consumerGroup.topicId: fx.kafka.demo.hello.run
rule: use cluster prod
规则优先级是规则的1个整型属性。值越大,表明优先级越高,值越小,优先级越低。
默认为0,可不配置。
如:
- id: r100005
priority: 0
meta:
consumerGroup.groupName: fx.hellobom.string.consumer
consumerGroup.topicId: fx.kafka.demo.hello.run
rule: use cluster fws
- id: r100006
priority: 1
meta:
rule.isGlobal: true
rule: use cluster uat when client.env=UAT
如果相同优先级的规则有多条:
- consumer group特定的规则优先
- 其次为topic特定的规则优先
- 最后为全局规则
如:
route-rules:
- id: r100001
meta:
rule.isGlobal: true
rule: use cluster fws
- id: r100002
meta:
topic.id: fx.kafka.demo.hello.run
rule: use cluster uat
- id: r100004
meta:
consumerGroup.groupName: fx.kafka.demo.hello.run.consumer
consumerGroup.topicId: fx.kafka.demo.hello.run
rule: use cluster prod
priority都为0,优先级按类型排序:r100004 > r100002 > r100001
相同优先级,相同类型的多条规则,优先级未定义,随机排序。
按Producer和Consumer,分为2类。
Producer寻址和2类规则相关:
- topic特定的路由规则
- 全局路由规则
Consumer寻址和3类规则相关:
- consumer group特定的路由规则
- topic特定的路由规则
- 全局路由规则
把相关的路由规则汇总,按优先级从大到小排成一条链。从链首规则开始,如果当前规则能找到cluster,返回该cluster,路由结束。否则由下一个规则继续寻址。如果整条链都寻址完毕,仍然不能找到cluster,说明无cluster可用。
Client信息由用户在寻址时提供,Topic、ConsumerGroup、Cluster、RouteRule可在yaml文件里配置。
- clusters.yaml
- topics.yaml
- consumer-groups.yaml
- route-rules.yaml