_clusterId 生成规则
在KafkaServer中调用的方式是getOrGenerateClusterId,生成唯一值
具体实现
private def getOrGenerateClusterId(zkClient: KafkaZkClient): String = {
zkClient.getClusterId.getOrElse(zkClient.createOrGetClusterId(CoreUtils.generateUuidAsBase64)) //递归的生成zk地址
}
其中关键的还是 CoreUtils.generateUuidAsBase64
def generateUuidAsBase64(): String = {
val uuid = UUID.randomUUID()
Base64.getUrlEncoder.withoutPadding.encodeToString(getBytesFromUuid(uuid)) //base64编码,降原来128位的uuid(36字符),简化成24字符
}
def getBytesFromUuid(uuid: UUID): Array[Byte] = {
// Extract bytes for uuid which is 128 bits (or 16 bytes) long.
val uuidBytes = ByteBuffer.wrap(new Array[Byte](16))
uuidBytes.putLong(uuid.getMostSignificantBits) //提取最重要的64位
uuidBytes.putLong(uuid.getLeastSignificantBits) //提取最不重要的64位
uuidBytes.array
}
这种实现方式为了降低UUID生成的字符串大小。看了后发现其实一件很有意思的事情,顺便查了一下,大家都是这么用的。
如何是最佳时间,社区的讨论:https://stackoverflow.com/questions/772802/storing-uuid-as-base64-string 从这个看大家都希望降低原生UUID的大小。
另一个孩子提的建议:http://sakthipriyan.com/2017/04/02/creating-base64-uuid-in-java.html
看这个源码也算是学习到了一个小技巧。
0 条评论。