在应用的迭代更新中,灰度发布是一种常见策略,通过逐步增加用户的更新覆盖范围,确保系统在上线过程中更加稳定。本文将分享如何使用 Python 实现一个灰度发布策略,帮助开发者控制应用的逐步更新过程,特别是确保部分用户逐渐接收更新提示,从而减少发布风险。在 Python 中实现灰度发布策略对于开发者至关重要,尤其是在大型应用的逐步发布过程中,确保不同用户群体按不同时间段逐步接收到更新。
什么是灰度发布策略?
灰度发布(Canary Release)是一种软件发布方法,允许开发者将应用的新版本逐步提供给小部分用户,之后根据反馈逐渐扩大覆盖范围。通常,它通过设备 ID 等唯一标识符来随机挑选一部分用户。本文的策略实现,将用户按一定比例分组,并通过计算设备 ID 是否命中灰度条件来决定是否提示更新。
灰度发布的 Python 实现方案
以下是具体的实现步骤:
- 生成用户组分配规则:通过
device_id
的哈希值转换为十进制数,根据控制比例的概率范围确定哪些用户收到更新提示。 - 按时间阶段灰度发布:定义了一个三天的发布窗口,第一天仅 10%的用户收到更新提示,第二天则扩大到 30%,第三天则向所有用户开放。
import hashlib
import datetime
def gray_publish_check(app_lastest_pub_time, device_id):
'''灰度发布策略:
将device_id进行hash后转为十进制数,若想要10%的用户收到升级提示,
则需保证这个十进制数的最后一位为0-9中固定的一个数(每个数出现的概率为1/10,按0-9的顺序)
若想要30%的用户收到提示则保证最后一个数是0-9中的某三个数中之一。
若1%,则同理的限定末尾两个数,1/10 * 1/10 = 1/100
规则:
这里通过gray_probability设置的比例小数控制升级率,
只支持0.1-1.0(step=0.1) 0.01-1.0(step=0.01) ...
0.15这种是不允许的。
实现方法:
将device_id使用md5进行hash
将其hex字符串转换为十进制数
将比例控制的小数转为字符串
验证其格式时候符合规则
如果比例为1这全部都会进行灰度发布
将比例小数的字符串按照小数点分为两部分,主要通过小数部分进行控制
通过小数部分转为整数后的值判断具体的分子(百分之多少和千分之多少)
通过小数部分的字符串长度判断具体的分母(百分之还是千分之)
比如0.2,小数转整为2,长度为1,则为20%,即只需确定十进制字符串的最后一位是否在0或1
比如0.03,小数部分转正为3,长度为2,则为3/100,即只需确定最后两位即可:
1.最后一位在[0-2]之中 3/10
2.倒数第二位为固定值0 1/10
'''
# 三天内全部发完,第一天10%的用户可以收到更新提醒,第二天30%的用户收到更新提醒,第三天全部都会收到更新提醒
app_publish_date = datetime.datetime.strptime(app_lastest_pub_time,
'%Y-%m-%d').date()
today = datetime.date.today()
if today - app_publish_date <= datetime.timedelta(days=1):
gray_probability = 0.1
elif today - app_publish_date == datetime.timedelta(days=2):
gray_probability = 0.3
elif today - app_publish_date >= datetime.timedelta(days=3):
gray_probability = 1.0
digits = '0123456789'
device_id_hex = hashlib.md5(device_id.encode()).hexdigest() # 修复编码错误
device_id_decimalism_str = str(int(device_id_hex, 16))
gray_publish_probability = str(gray_probability)
digit, decimal = gray_publish_probability.split('.')
if int(digit) == 1:
return True
if device_id_decimalism_str[-1] in digits[:int(decimal)]: # 判断最后一位
# 小数长度大于1,即1/100, 1/1000 ...判断倒数第2,3...位是否为0
if len(decimal) > 1:
return all(device_id_decimalism_str[-len(decimal) + i] == '0'
for i in range(len(decimal) - 1))
else:
return True
return False
灰度发布策略如何适用于你的项目?
在实际项目中,灰度发布策略帮助开发者减少大规模发布可能带来的不稳定性,尤其是在大规模的应用升级场景下。通过限制初始的用户更新范围,开发者能够更轻松地发现问题并快速修复,避免影响大量用户。
在大型应用的发布过程中,开发团队利用灰度发布策略,在前两天分别仅向 10%和 30%的用户推送了应用更新。通过收集早期用户的反馈,开发者迅速发现并修复了几个性能问题,确保了第三天向所有用户推送更新时没有出现重大故障。这种逐步升级的方式极大地减少了潜在的用户流失和系统崩溃风险。
结论
通过本文的 Python 代码示例,你可以轻松实现应用的灰度发布策略,有效控制应用发布的节奏,确保在逐步更新过程中提升用户体验并减少发布风险。