【发布时间】:2023-02-13 15:58:01
【问题描述】:
我指的是Confluent Schema Registry:
有可靠消息吗单个模式注册表可以支持多少个不同的模式?
根据我对模式注册表的理解,它在启动时从 kafka 主题读取可用模式。
因此可能的限制可能是内存消耗(=一次内存中的模式数量)或性能(=从 Kafka 查找模式)。
【问题讨论】:
标签: apache-kafka confluent-schema-registry
我指的是Confluent Schema Registry:
有可靠消息吗单个模式注册表可以支持多少个不同的模式?
根据我对模式注册表的理解,它在启动时从 kafka 主题读取可用模式。
因此可能的限制可能是内存消耗(=一次内存中的模式数量)或性能(=从 Kafka 查找模式)。
【问题讨论】:
标签: apache-kafka confluent-schema-registry
在内部,它使用 ConcurrentHashMap 来存储该信息,因此,理论上,限制大致是支持 Java 数组的最大大小。
Do Java arrays have a maximum size?
但是,有多个map,因此,JVM heap constraints也会存在。如果你有更大的原始模式字符串,那么就会使用更多的内存,所以没有很好的计算。
【讨论】:
我创建了自己的基准工具来查找可能的限制。 Github 存储库的链接是here。
长话短说:
正如@OneCricketeer 所怀疑的那样,可扩展性因素是 ~ nr of schemas * size of avg schema。我创建了一个工具来查看注册表内存和 cpu 使用量如何扩展以注册许多相同大小的不同 AVRO 模式(使用模式中的自定义字段来区分它们)。
我为 ~48 个模式运行了该工具,用于 CPU 使用率低的 ~900 MB 内存。
发现:
SCHEMA_CACHE_SIZE_CONFIG,默认 1000),但至少在我的测试中我看不到缓存未命中的负面影响,它既有命中也有未命中 ~1 -2ms 用于检索模式。
内存使用情况(x 比例 = 100 个模式,y 比例 = 1 MB):
CPU 使用率(x 比例 = 100 个模式,y 比例 = 使用百分比):
Java 堆中的前 10 个对象:
num #instances #bytes class name (module)
-------------------------------------------------------
1: 718318 49519912 [B (java.base@11.0.17)
2: 616621 44396712 org.apache.avro.JsonProperties$2
3: 666225 15989400 java.lang.String (java.base@11.0.17)
4: 660805 15859320 java.util.concurrent.ConcurrentLinkedQueue$Node (java.base@11.0.17)
5: 616778 14802672 java.util.concurrent.ConcurrentLinkedQueue (java.base@11.0.17)
6: 264000 12672000 org.apache.avro.Schema$Field
7: 6680 12568952 [I (java.base@11.0.17)
8: 368958 11806656 java.util.HashMap$Node (java.base@11.0.17)
9: 88345 7737648 [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@11.0.17)
10: 197697 6326304 java.util.concurrent.ConcurrentHashMap$Node (java.base@11.0.17)
【讨论】: