如何按可用区循环遍历字典生成指定数量的服务器名称列表
实现思路
- 先做数据规整:固定可用区轮询优先级为
eu-west0-a→eu-west0-b→eu-west0-c,把原始字典里的服务器按所属可用区分组,每组内按服务器名称排序,保证取数顺序稳定。 - 轮询取数逻辑:从第1台开始计数,每台机器对应的可用区为「计数序号对可用区总数取模」对应的优先级AZ,每次从对应AZ的服务器列表里按顺序取未被选中的机器,直到取够用户请求的数量。
- 结果输出:如果只需要服务器名列表直接返回选中的名称即可,需要带可用区备注的话可以在输出时拼接原始映射里的AZ信息。
注意:如果请求的服务器总数超过所有可用区服务器总和,或者单个AZ的服务器被取空时,需要根据业务场景加异常处理,比如提示资源不足、循环复用同AZ服务器等。
可直接运行的Python实现
from collections import defaultdict # 原始服务器与可用区映射数据 server_map = { "v3bf33-srv01": "eu-west0-a", "v3bf33-srv02": "eu-west0-a", "v3bf33-srv03": "eu-west0-a", "v3bf33-srv04": "eu-west0-b", "v3bf33-srv05": "eu-west0-b", "v3bf33-srv06": "eu-west0-b", "v3bf33-srv07": "eu-west0-c", "v3bf33-srv08": "eu-west0-c", "v3bf33-srv09": "eu-west0-c" } def get_selected_servers(request_count: int) -> list: # 固定可用区轮询顺序 az_priority = ["eu-west0-a", "eu-west0-b", "eu-west0-c"] # 按可用区分组服务器,组内按名称排序 az_server_group = defaultdict(list) for srv_name, az in server_map.items(): az_server_group[az].append(srv_name) for az in az_priority: az_server_group[az].sort() selected = [] # 每个可用区维护独立的取数指针 az_index = {az: 0 for az in az_priority} for i in range(request_count): # 轮询定位当前要取的可用区 current_az = az_priority[i % len(az_priority)] # 取对应可用区指针位置的服务器,指针后移 current_srv = az_server_group[current_az][az_index[current_az]] az_index[current_az] += 1 selected.append(current_srv) return selected # 测试:请求5台服务器 if __name__ == "__main__": server_list = get_selected_servers(5) # 输出带可用区备注的yaml格式结果 for srv in server_list: print(f"- {srv} #{server_map[srv]}")
执行效果
运行上述代码请求5台服务器时,输出完全匹配需求示例:
- v3bf33-srv01 #eu-west0-a - v3bf33-srv04 #eu-west0-b - v3bf33-srv07 #eu-west0-c - v3bf33-srv02 #eu-west0-a - v3bf33-srv05 #eu-west0-b
内容的提问来源于stack exchange,提问作者maxime fou
相关产品推荐
相关产品推荐

