Ash*_*lix 2 distributed-system id-generation spring-boot kubernetes twitter-snowflake
当 Kubernetes Spring-Boot 应用程序启动有 8 个实例时,每个节点中运行的应用程序需要获取 pod/容器的序列号。运行同一应用程序的 Pod/容器不应有重复的数字。假设一个 Pod 运行单个容器,而一个容器仅运行应用程序的一个实例。
应用程序可以从 Kubernetes API 为每个 Pod 提取一些唯一标识符,例如:
networkInterface.getHardwareAddress()
)aks-default-12345677-3
my-sample-service-sandbox-54k47696e9-abcde
)aa7k6278-abcd-11ef-e531-kdk8jjkkllmm
)12.34.56.78
)但是从 API 获取此信息的应用程序无法在指定的 pod 范围 [0 - 最大节点计数-1] 内安全地生成并为其分配唯一的编号。任何在这些唯一标识符上运行的缩减器步骤(按位 &)最终都会重复这些数字。与其他 Pod 进行通信是一种反模式,尽管有些方法采用共识/协议模式来实现这一点。
我的问题是: Kubernetes 是否有一种简单的方法可以在创建每个节点/容器/pod 时为每个节点/容器/pod 分配一个序列号 - 可能是在 pod 中的环境变量中?这些数字可以从 0 或 1 开始,并且应该达到住宅区 pod 数量的最大计数。
背景信息和一些研究:
执行UUID.randomUUID().hashCode() & 7
八次将会重复 0 到 7 之间的数字。请参阅中存在此错误的文章createNodeId()
。上述减速器步骤实际运行的示例输出。
{0=2, 1=1, 2=0, 3=3, 4=0, 5=1, 6=1, 7=0}
{0=1, 1=0, 2=0, 3=1, 4=3, 5=0, 6=2, 7=1}
{0=1, 1=0, 2=2, 3=1, 4=1, 5=2, 6=0, 7=1}
Run Code Online (Sandbox Code Playgroud)
我继续执行了 1 亿次上述代码,发现只有 0.24% 的案例分布均匀。
Uneven Reducers: 99760174 | Even Reducers: 239826
应用程序启动时有 8 个实例,每个节点中运行的应用程序需要获取 pod 的序列号
听起来您正在请求稳定的 Pod 身份。如果您将 Spring Boot 应用程序部署为StatefulSet而不是Deployment,那么此身份是 Kubernetes 的“提供的功能”。
归档时间: |
|
查看次数: |
1362 次 |
最近记录: |