基于 cookie 的 node 中间层灰度流程的一些思考
此文已由作者申国骏授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
前言
关于灰度发布的意义此处就不进行介绍了,可以先读下这两篇文章
灰度方案说白了就是,分配一定比例或者筛选有特殊身份的用户,让这部分用户提前试用产品的最新版本,以便尽早发现问题也可将问题的影响最小化。不同公司都有自己独特的灰度流程,此处仅仅讨论灰度方案中的其中一个小环节,用户分配。
灰度流程
粗粒度灰度流程图(存在细节问题)
粗粒度的流程看上去似乎没有多大问题,但如果往细里考究,就会看到,漏洞百出
首次访问的时候无 cookie 必然走 online 集群,但如果命中灰度,接下来的异步请求将被分流到 beta 集群,资源错乱
beta 集群下 cookie 过期后(浏览器自动清理),接下来的异步请求将会从新被灰度分配,如果未命中灰度,接下来的异步请求将被分流到 online 集群,资源错乱
失效时间如果设置较短,则达不到灰度的目的
接下来,优化是必然的
几个大的问题
1、同步资源和异步资源的问题
描述:
同一个会话下,由于时机不同,导致同步资源和异步资源流入不同集群,此处假设 online 集群和 beta 集群资源不一致
场景:
1、同步 online 异步 beta:同步资源在无 cookie 条件下流入 online 集群,同步命中灰度设置了 cookie,之后的异步请求将会流入 beta 集群
2、同步 beta 异步 online:同步资源在有 cookie 条件下流入 beta 集群,随后 cookie 失效,之后的异步请求将会流入 online 集群
方案 a) node 中台灰度命中后重新代理回 ngnix 进行分流。 (1-,-2){1:有效,1-:部分有效,-1:无效,下同}
方案 b) beta 集群资源兼容 online 集群。 (1,-2)
方案 c) beta 集群独立域名(302),使用域名区分 online & beta。 (-1,2)
综合方案 b,c 可解决场景 1,2
2、灰度 cookie 过期或重置问题
描述:
会话期间更新 disconf 配置,或 cookie 自然过期会出现以下场景,导致资源请求错乱问题
场景:
3a、同步请求前设置灰度配置(online -> beta,同步资源同步)
3b、同步请求前关闭灰度配置(beta -> online,同步资源同步)
4a、同步(online)请求后异步请求前重置灰度配置(beta)
4b、同步(beta)请求后异步请求前重置灰度配置(online)
5a、下一个同步请求前重置灰度配置(online -> beta,同步资源不同步)
5b、下一个同步请求前重置灰度配置(beta -> online,同步资源不同步)
方案 a) 同上。(3a,3b,-4a,-4b,-5a,-5b)
方案 b) 同上。(3a,-3b,4a,-4b,5a,-5b)
方案 c) 同上。(-3a,3b,4a,4b,-5a,5b)
综合 b,c 可解决场景 3,4,5
3、灰度 cookie 的有效期时长问题
描述:
假设上方问题都已经解决,那么 cookie 的 maxAge 该设置成多少才比较合理?
有效期较短,如 10s
问题:假设用户访问一个页面的时间大于10s,那么,此用户的异步请求将会在 online 和 beta 集群来回切换,虽然解决了资源错乱的问题,用户无感知,但 beta 集群受到的压力将会成倍增大。
同时,从目标用户分配的比例上来看,1天内机会所有的用户都会引流到 beta 集群,这样灰度将失去意义,且带来较大风险
有效时间较长,如 1 天或更高
问题:过期时间设置较长,其优点恰恰是有效规避了有效期较短的致命缺点,beta 集群的流入用户比例和服务器压力都比较低。
但是,另外一个方面,如果 beta 集群出错宕机,或者我们主动将 beta 集群下线。就会导致灰度用户在 1 天内的反馈就是 404,且无解,只能等 cookie 过期或者用户主动换浏览器。导致的结果就是,客服电话被打爆,然后甩一句【垃圾网站!】,这是完全不能接受的。
适中的有效期,如 10分钟到 1 小时
一般来讲,如果不是生产工具类的网站,用户一次的访问周期不会超过 1 小时,及时用户没有关闭网页的习惯,1 个小时候再次操作也不会对网站造成多大影响。
虽然说,宕机导致的 404 同样无解,但损失可以降到最小
总结
灰度细化流程图
综合来看,方案 b,c 基本可以解决我们的上述问题。
beta 集群资源兼容 online 集群,静态资源长发布到 CDN,所以只需对异步资源进行同步即可。
集群独立域名(302),使用域名区分 online & beta,做域隔离,即使 cookie 失效也可以保证用户的当前会话操作维持在 beta 集群。
另外针对 a 方案,针对不同的业务场景,还有有一定的作用,比如避免出现跨域请求等。
问题是相对的,方案是灵活的。不同类型的系统会用不同的问题,我们能做的就只有针对问题思考解决方案。
如果你有更好的解决方案,还请不吝赐教!拜谢!
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 代码在线编译器(下)- 用户代码安全检测
【推荐】 在Android中使用FlatBuffers(中篇)
【推荐】 亲近用户—回归本质
基于 cookie 的 node 中间层灰度流程的一些思考的更多相关文章
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- node中间层转发请求
前台页面: $.get("/api/hello?name=leyi",function(rps){ console.info(rps); }); node中间层(比如匹配api开头 ...
- node中间层实现文件上传
一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...
- 基于 Jenkins+Docker+Git 的CI流程初探
在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层
视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...
- 基于PassThru的NDIS中间层驱动程序扩展
基于PassThru的NDIS中间层驱动程序扩展 独孤求真 概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身 ...
- node中间层
node中间层 一.总结 1.node中间层作用:前端也是mvc,NodeJS之后,前端可以更加专注于视图层,而让更多的数据逻辑放在Node层处理 2.node中间层作用:当发现所有请求量太多应付不过 ...
- 基于cookie的用户登录状态管理
cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...
- Node中间层浅认知
Node中间层允许前端来做网站路由.页面渲染.SEO优化,对以往从来不接触这些内容的前端选手来说,正是锻炼我们网站架构的好机会.另外,这也是一次深入了解Node的好机会,准备好迎接即将到来的前端工程化 ...
随机推荐
- xunsearch基本使用
目录 基本实践 异常捕获 XSDocument 文档 添加操作 ini 更新.修改文档 删除文档 清空索引 平滑重建索引 使用索引缓冲区 自定义 SCWS 词库 基本实践 <?php // 引入 ...
- PHP面向对象深入研究之【高级特性】
静态属性 <?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHel ...
- python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的 iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...
- django 基于正则表达式的url
方式一: urls.py from mytest import views urlpatterns = [ url(r'^index-(\d+)-(\d+).html', views.Index.as ...
- Libevent使用例子,从简单到复杂
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39670221 本文从简单到复杂,展示如何使用libevent.网上的许多例子都是只有服务 ...
- HtmlHelper扩展
扩展 HtmlHelper类 public static class MyHtmlHelper { //扩展方法 //静态类,静态方法,this关键字 //调用方法<%=Html.MyLabel ...
- mysql外键约束总结
总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...
- XP下,移动窗口产生重影的问题
最近做了一个东西,其中有一个小窗口需要跟着主窗口一起移动,结果发现在Xp系统上总是产生重影,需要刷新桌面才能消失. 移动窗口我使用的是MoveWindow,最后一个参数bRepaint传递的是FALS ...
- 5-有道爬虫demo(post)
爬取有道页面,实现中文翻译成英文: #_*_ coding: utf-8 _*_ ''' Created on 2018-7-12 @author: sss 功能:爬取有道翻译 ''' import ...
- SpringMVC第二天
SpringMVC第二天 框架课程 1. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 2.@RequestMapping注解的使用 3.Controller方法 ...