<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[酷家乐研发团队]]></title><description><![CDATA[酷家乐研发团队]]></description><link>https://tech.kujiale.com/</link><image><url>http://tech.kujiale.com/favicon.png</url><title>酷家乐研发团队</title><link>https://tech.kujiale.com/</link></image><generator>Ghost 2.22</generator><lastBuildDate>Wed, 15 Apr 2026 14:30:29 GMT</lastBuildDate><atom:link href="https://tech.kujiale.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[酷家乐国际化业务多语言保障实践]]></title><description><![CDATA[<p>酷家乐多语言技术架构</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image.png" class="kg-image"></figure><!--kg-card-end: image--><p>简单描述就是前端代码和后端代码在不同语种情况下，都是通过获取CDN中存储的各类多语言的信息，也就是创建多语言词条会返回一个唯一KEY，这个KEY对应的是各类语种的value，但是由于酷家乐双发到国际化之后，是同一份代码，会导致有一部分中文忘记用词条了，或者后端服务没有用，就导致中文对外漏出。针对于目前国际化多语言的情况，测试团队现有的语言检测只有【接口扫描】</p><p><strong>接口扫描流程图</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>即根据接口中返回是否为中英文以此作为判断，来校验是否包含中文，但是前端的内容大部分文本非接口返回，为词条中获取，以此为背景结合UI自动化对前端文本做中文扫描校验。以下图片中展示的是，22年至23年期间，出现的中文问题，几乎每个月都能出现一次，可以看出国际化的中文问题较多。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-2.png" class="kg-image"></figure><!--kg-card-end: image--><p>为了解决这类高频问题，思考通过别的途径解决该问题。<br><strong>价值</strong></p><p>现状：</p><ol><li>接口扫描所断言的中文信息不全</li><li>扫描缺少交互性：各个业务场景所用到的中文，会根据入参变化。目前是固定参数来获取固定返回</li><li>扫描覆盖度不高，不能完全覆盖各词条</li></ol><p>解决的问题：</p><ol><li>全HTML文本：扫描并做检验</li><li>根据用户操作习惯，所见即所得。将用户操作路径中携带交互所产生的文案，获取并检验</li><li>校验接口扫描不能透出的各类词条文案</li></ol><p><strong>具体实施方案</strong></p><p><strong>流程图：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-3.png" class="kg-image"></figure><!--kg-card-end: image--><p><strong>具体效果</strong></p><ul><li>我们假如当前页面是英文的情况下，出现了漏翻译的情况，如下图展示，几乎整片网页全是中文，</li></ul>]]></description><link>https://tech.kujiale.com/ku-jia-le-guo-ji-hua-ye-wu-duo-yu-yan-bao-zhang-shi-jian/</link><guid isPermaLink="false">666198668f9ebd00018ae2f5</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Thu, 06 Jun 2024 11:24:16 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2024/06/----_20240606192347.png" medium="image"/><content:encoded><![CDATA[<img src="https://tech.kujiale.com/content/images/2024/06/----_20240606192347.png" alt="酷家乐国际化业务多语言保障实践"><p>酷家乐多语言技术架构</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>简单描述就是前端代码和后端代码在不同语种情况下，都是通过获取CDN中存储的各类多语言的信息，也就是创建多语言词条会返回一个唯一KEY，这个KEY对应的是各类语种的value，但是由于酷家乐双发到国际化之后，是同一份代码，会导致有一部分中文忘记用词条了，或者后端服务没有用，就导致中文对外漏出。针对于目前国际化多语言的情况，测试团队现有的语言检测只有【接口扫描】</p><p><strong>接口扫描流程图</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-1.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>即根据接口中返回是否为中英文以此作为判断，来校验是否包含中文，但是前端的内容大部分文本非接口返回，为词条中获取，以此为背景结合UI自动化对前端文本做中文扫描校验。以下图片中展示的是，22年至23年期间，出现的中文问题，几乎每个月都能出现一次，可以看出国际化的中文问题较多。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-2.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>为了解决这类高频问题，思考通过别的途径解决该问题。<br><strong>价值</strong></p><p>现状：</p><ol><li>接口扫描所断言的中文信息不全</li><li>扫描缺少交互性：各个业务场景所用到的中文，会根据入参变化。目前是固定参数来获取固定返回</li><li>扫描覆盖度不高，不能完全覆盖各词条</li></ol><p>解决的问题：</p><ol><li>全HTML文本：扫描并做检验</li><li>根据用户操作习惯，所见即所得。将用户操作路径中携带交互所产生的文案，获取并检验</li><li>校验接口扫描不能透出的各类词条文案</li></ol><p><strong>具体实施方案</strong></p><p><strong>流程图：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-3.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p><strong>具体效果</strong></p><ul><li>我们假如当前页面是英文的情况下，出现了漏翻译的情况，如下图展示，几乎整片网页全是中文，具体如下</li></ul><ol><li>页面效果：<br></li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-5.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>我们想要的效果是将页面中的文字全部提取出来，然后对中英文做区分。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-6.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>实现过程：以puppeteer为例，页面每次点击或者对于页面做hover的时候，页面元素都会产生相应变化，那么在页面产生变化的时候，将整个HTML DOM元素获取下来。则会得到一个动态情况下，网页文本情况，具体实现细节：我们获取HTML网页的时候，需要确保整个网页完全加载完了，这里采用【<strong>window.performance.timing.loadEventEnd -window.performance.timing.navigationStart</strong>】，windows下的方法，可以获取到整个浏览器完全加载完成的时间，减去网页刚开始加载的时间，获取到一个时间差，如果大于0则认为当前网页已经完全加载完。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-7.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>然后通过：document.documentElement.innerHTML。方法获取整个网页的内容，最终存储在本地。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-8.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>通过传入的元素，对getHtml再做一层封装，hover也类似，最终hover和click都具备网页爬取的能力。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-9.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>分析HTML的逻辑是通过beautifulSoap的python标准库来进行扫描，通过将HTML内的中文提取出来，然后通过中文的Unicode的编码区间，来判断当前页面中是否有英文。</p><p>最终通过部署在远程机器的python脚本每天分析一次，将测试结果以邮件的形式推送出来。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-10.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p><strong>最终报告：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-11.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p><strong>最终得到的结果：</strong>截止2023-11-9  为起始时间至今（ 2024-2-20  ） 共扫描103次，非测试数据中文数：10个总共发现中文数：52次网络原因导致错误数：4次测试数据导致中文数：46次</p><p><strong>后续的展望：</strong><br></p><ol><li>和现有的平台做聚合网页巡检平台做配合，这样就可以脱离UI自动化代码，不需要人为去维护，只需要配置网页的URL自动去扒取网页中的文本，具体做法</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/06/image-13.png" class="kg-image" alt="酷家乐国际化业务多语言保障实践"></figure><!--kg-card-end: image--><p>我们网页巡检已经具备的能力：<br>从图中可以看到，当前网页如果存在A标签的话，会根据所设定的巡检层数来进行递归，例如当前巡检层数设置为3，网页有5个A标签，此时会将5个页面全部扫出来，5个网页继续打开，直到递归到第三层就算结束，但是由于此平台检测的能力只有3个</p><ul><li>console报错:浏览器F12控制台看到的Error类型内容</li><li>接口报错:状态码非200和非304的接口,响应内容中c!=0的接口</li><li>配置错误:外网网站配置了内网域名（需要开启“是否外网url巡检”开关）</li></ul><p>2. AI扫描</p><p>我们目前只能做最基础的中文文本检测，但是我们是否能根据大模型的能力来进行扫描，目前调研的结果是可以的，以市面上常见的chatgpt就能将翻译后的英文，语义、错别字、等等都能一一扫描出，我们可以将python脚本提取出来的文本，传递给chatgpt从而达到，语言是否有中文，以及语言是否翻译准确了。</p><p><strong>总结</strong></p><p>多语言的要想做到精准验证接入AI的辅助必然是一个趋势，不然扫描出来的文本无法得到准确性，以及正确性的验证。团队内其他重复测试场景且现阶段无法做到自动化的还有很多，例如白标（简单理解白标的含义，各商家的logo是否包含特定酷家乐的标识）这类图标有各类长短分辨率大小不一的图片，要做到批量验证，也需要借助AI的能力，后续我们将提供更多的AI结合自动化的探索！</p>]]></content:encoded></item><item><title><![CDATA[一次服务预热问题的定位排查记录(2)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="">背景</h1>
<p>酷家乐户型几何计算服务（下文简称kam）是计算密集型的服务，主要负责酷家乐户型业务的三维造体、渲染以及算量等模块，服务的特性是吞吐量低，cpu计算密集。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/dd0efb0a-9290-47d1-a18e-a910e4e135e1.png" alt="image"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/2b80ae4a-7bc6-40ee-82ec-b6a3582e75de.png" alt="image"><br>
在高峰期进行动态扩缩容的时候，kam冷启动的表现一直以来都比较严峻，cpu使用率和cpu限制率会迅速飚高，进而影响服务的rt，严重时响应时间会到5s的程度，亟需治理。<br>
在进行治理过程中，我们遇到2个奇怪的问题：</p>
<ol>
<li>高分期扩容时冷启动初始流量高，无权重变化。详细见<a href="https://tech.kujiale.com/warm-up-in-kam-1/">一次服务预热问题的定位排查记录(1)</a>。</li>
<li>prod环境开启预热反而比没有预热的效果更好，本文围绕这个问题，我们做了以下排查和定位。</li>
</ol>
<h1 id="">问题表现</h1>
<p>线上环境开启预热反而比没有预热的效果更好，表现如下：<br>
开启预热：服务cpu使用率飙升到100%，cpu限制率飙升到150%，响应时间飙升到5s以上。<img src="https://qhtbdoss.kujiale.com/pages/image/45fbedeb-2f75-48d1-8f5a-10373431b17e.png" alt="开启预热"><br>
关闭预热：服务CPU使用率偶尔会有90%，cpu限制率基本还在40%以下，响应时间基本不波动，偶尔会抖。<img src="https://qhtbdoss.kujiale.com/pages/image/cd568ec0-8e3e-4c26-9797-4ceb803d0b9f.png" alt="关闭预热"></p>
<h1 id="">定位过程</h1>
<p>观察prod的启动秒级流量，截图如下：<img src="https://qhtbdoss.kujiale.com/pages/image/ccff1eed-69e8-4856-add9-83ebc4b3c46e.png" alt="prod秒级监控"><br>
而开启预热的情况，截图如下：<img src="https://qhtbdoss.kujiale.com/pages/image/8e7d4266-0ccb-4c1a-a9b0-522f4434fe1e.png" alt="开启预热秒级监控"><br>
我们得到以下开启预热和关闭预热的两种启动流量趋势图：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/52ab3d31-5eaa-4a86-ba48-91b0dafb98d1.png" alt="开启预热流量趋势图"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/e1eee886-db59-4421-b090-151e229a37cd.png" alt="关闭预热流量趋势图"><br>
可以看到，发现不开启预热的时候，会出现流量截断的情况，会在初始几秒进来流量，过了几秒之后发现流量降到0，持续60s，然后再涌入流量；</p>]]></description><link>https://tech.kujiale.com/warm-up-in-kam-2/</link><guid isPermaLink="false">666aaec38f9ebd00018ae348</guid><dc:creator><![CDATA[sanli]]></dc:creator><pubDate>Tue, 04 Jun 2024 06:16:00 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2024/07/082450d4q8qnw1qnk5zkt8.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="">背景</h1>
<img src="https://tech.kujiale.com/content/images/2024/07/082450d4q8qnw1qnk5zkt8.jpg" alt="一次服务预热问题的定位排查记录(2)"><p>酷家乐户型几何计算服务（下文简称kam）是计算密集型的服务，主要负责酷家乐户型业务的三维造体、渲染以及算量等模块，服务的特性是吞吐量低，cpu计算密集。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/dd0efb0a-9290-47d1-a18e-a910e4e135e1.png" alt="一次服务预热问题的定位排查记录(2)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/2b80ae4a-7bc6-40ee-82ec-b6a3582e75de.png" alt="一次服务预热问题的定位排查记录(2)"><br>
在高峰期进行动态扩缩容的时候，kam冷启动的表现一直以来都比较严峻，cpu使用率和cpu限制率会迅速飚高，进而影响服务的rt，严重时响应时间会到5s的程度，亟需治理。<br>
在进行治理过程中，我们遇到2个奇怪的问题：</p>
<ol>
<li>高分期扩容时冷启动初始流量高，无权重变化。详细见<a href="https://tech.kujiale.com/warm-up-in-kam-1/">一次服务预热问题的定位排查记录(1)</a>。</li>
<li>prod环境开启预热反而比没有预热的效果更好，本文围绕这个问题，我们做了以下排查和定位。</li>
</ol>
<h1 id="">问题表现</h1>
<p>线上环境开启预热反而比没有预热的效果更好，表现如下：<br>
开启预热：服务cpu使用率飙升到100%，cpu限制率飙升到150%，响应时间飙升到5s以上。<img src="https://qhtbdoss.kujiale.com/pages/image/45fbedeb-2f75-48d1-8f5a-10373431b17e.png" alt="一次服务预热问题的定位排查记录(2)"><br>
关闭预热：服务CPU使用率偶尔会有90%，cpu限制率基本还在40%以下，响应时间基本不波动，偶尔会抖。<img src="https://qhtbdoss.kujiale.com/pages/image/cd568ec0-8e3e-4c26-9797-4ceb803d0b9f.png" alt="一次服务预热问题的定位排查记录(2)"></p>
<h1 id="">定位过程</h1>
<p>观察prod的启动秒级流量，截图如下：<img src="https://qhtbdoss.kujiale.com/pages/image/ccff1eed-69e8-4856-add9-83ebc4b3c46e.png" alt="一次服务预热问题的定位排查记录(2)"><br>
而开启预热的情况，截图如下：<img src="https://qhtbdoss.kujiale.com/pages/image/8e7d4266-0ccb-4c1a-a9b0-522f4434fe1e.png" alt="一次服务预热问题的定位排查记录(2)"><br>
我们得到以下开启预热和关闭预热的两种启动流量趋势图：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/52ab3d31-5eaa-4a86-ba48-91b0dafb98d1.png" alt="一次服务预热问题的定位排查记录(2)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/e1eee886-db59-4421-b090-151e229a37cd.png" alt="一次服务预热问题的定位排查记录(2)"><br>
可以看到，发现不开启预热的时候，会出现流量截断的情况，会在初始几秒进来流量，过了几秒之后发现流量降到0，持续60s，然后再涌入流量；而开启预热的时候没有出现这种流量截断的情况。</p>
<p>很奇怪，咨询了soa中间件，讨论后，发现这个是由于之前接入优雅上线的poststart脚本中，有soa下线和上线逻辑，两者中间刚好有个调服务预热的逻辑，而预热时间刚刚好是60秒。代码如下：</p>
<pre><code class="language-json"># 开始健康检查，直到成功或者超时（600秒超时）
http_code=0
for (( i = 0; i &lt; 60; i++ )); do
        http_code=$(curl -s --max-time 10 -w &quot;%{http_code}&quot; -s -o /dev/null -X GET --header 'Accept: application/json' &quot;${self_healthz_url}&quot;)
        if [ &quot;${http_code}&quot; = 200 ]; then
            echo &quot;调用健康检查接口成功：url:${self_healthz_url}, code:${http_code}&quot; &gt;&gt; ./logs/grace_log_
            break
        else
          echo &quot;调用健康检查接口失败：url:${self_healthz_url}, code:${http_code}&quot; &gt;&gt; ./logs/grace_log_
          sleep 10
        fi
done
 
# 健康检查是否通过
if [ &quot;${http_code}&quot; != 200 ]; then
        echo &quot;健康检查未通过！&quot; &gt;&gt; ./logs/grace_log_
            exit 1
fi
 
# 由于soa的原因，调用上线之前要先调用一下下线接口
self_shut_down_url=${self_start_up_url//&quot;${DEFAULT_START_UP_PATH}&quot;/&quot;${DEFAULT_SHUT_DOWN_PATH}&quot;}
resultCode=$(curl -s --max-time 10 -X POST -w &quot;%{http_code}&quot; -s -o /dev/null --header 'Accept: application/json' --header ${coops_header} &quot;${self_shut_down_url}&quot;)
if [ &quot;${http_code}&quot; != 200 ]; then
      echo &quot;调用shutDown接口出错，url:${self_shut_down_url},http_code：${resultCode}&quot; &gt;&gt; ./logs/grace_log_
          exit 1
fi
 
 
# 调用预热加载功能，对接口不敏感
resultCode=$(curl -s --max-time 150 -X GET -w &quot;%{http_code}&quot; -s -o /dev/null --header 'Accept: application/json' --header ${coops_header} &quot;${pre_start_up_url}&quot;)
 
 
# 调用上线接口
result=$(curl -s --max-time 10 -X POST --header 'Accept: application/json' --header ${coops_header} &quot;${self_start_up_url}&quot;)
if [ &quot;${result}&quot;x = '&quot;ALREADY_UP&quot;'x ] || [ &quot;${result}&quot;x = '&quot;OK&quot;'x ]; then
        echo &quot;soaPostStart成功：url:${self_start_up_url}, result:${result}&quot; &gt;&gt; ./logs/grace_log_
else
  echo &quot;soaPostStart失败：url:${self_start_up_url}, result:${result}&quot; &gt;&gt; ./logs/grace_log_
  exit 1
fi
</code></pre>
<p>同时我们搜索了对应的日志，发现注册和注销时间点和秒级日志时间点也对的上。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/c0ad47a2-c0a7-4177-ba97-4d77f5ed24d7.png" alt="一次服务预热问题的定位排查记录(2)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/5433edf1-1127-4b98-b34a-3e68f1ea92e9.png" alt="一次服务预热问题的定位排查记录(2)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/55b089e0-8a52-4676-bf75-b1f01b8d763b.png" alt="一次服务预热问题的定位排查记录(2)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/b025032e-df9f-4369-a735-690b82a5abe8.png" alt="一次服务预热问题的定位排查记录(2)"><br>
也就是说，如上述流程所示，因为用户请求被截断，前置请求被作为了服务预热的一部分，再加上1分钟的自定义逻辑的预热，当脚本调用上线接口恢复用户流量时，prod环境的接口耗时，cpu限制率都处于一个比较能接受的水平，服务指标如下：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/3c604153-348d-4230-9588-94fd379c9dec.png" alt="一次服务预热问题的定位排查记录(2)"></p>
<p>我们想到难道kam，用用户流量进行预热，比触发预热逻辑来进行预热，效果要更好。<br>
由此，我们有一个思路，是否可以在当前预热现状（prod流量迁移至prod_warm环境，预热表现尚可）的基础上，在poststart脚本中模拟关闭预热的情况，来进一步改善预热，思路：先调用服务接口进行hbase/redis等连接→ 调用上线接口，等待5s用户请求→ 调用下线接口→ 进行服务预热逻辑→ 调用上线接口，流程如下。这样相比于关闭预热，我们可以预处理一些中间件的连接，保证服务上线后第一次用户请求不会有连接超时导致的错误，同时也能起到加速jit编译的效果。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/0ff5b096-def6-4b39-9e1f-ed3595abc6e8.png" alt="一次服务预热问题的定位排查记录(2)"></p>
<h1 id="">验证</h1>
<p>为了验证上述结论：</p>
<ol>
<li>是否是poststart脚本导致“prod关闭预热反而比开启预热效果更好”。</li>
<li>新的思路“先调用服务接口进行hbase/redis等连接→ 调用上线接口，等待5s用户请求→ 调用下线接口→ 进行服务预热逻辑→ 调用上线接口”，是否可行，效果是否更好。</li>
</ol>
<p>我们尝试进行内网压测验证，总结压测结果，表现如下：</p>
<table>
<thead>
<tr>
<th>场景（每种压测两次）</th>
<th>最高rt</th>
</tr>
</thead>
<tbody>
<tr>
<td>不开启预热</td>
<td>平均4s</td>
</tr>
<tr>
<td>开启预热</td>
<td>平均2.7s</td>
</tr>
<tr>
<td>截断流量，用户请求预热</td>
<td>平均0.8s</td>
</tr>
</tbody>
</table>
<p>压测结论：通过内网压测，可以看出来，冷启动在不同配置下，确实效果会有这样一个效果差异：用用户流量进行服务预热 &gt;  关闭预热 &gt; 开启预热</p>
<h1 id="">结论</h1>
<p>所以我们可以得出结论：</p>
<ol>
<li>poststart脚本导致“关闭预热反而比开启预热更好”。</li>
<li>按照压测结果，先调用服务接口进行hbase/redis等连接→ 调用上线接口，等待5s用户请求→ 调用下线接口→ 进行服务预热逻辑→ 调用上线接口”，效果更好。</li>
</ol>
<h1 id="">如何解决：</h1>
<h2 id="">小流量服务预热模型：</h2>
<p>相⽐于⼀般场景下，刚发布微服务应⽤实例跟其他正常实例⼀样⼀起平摊线上总 QPS。⼩流量预热⽅法通过在服务消费端根据各个服务提供者实例的启动时间计算权重，结合负载均衡算法控制刚启动应⽤流量随启动时间逐渐递增到正常⽔平的这样⼀个过程帮助刚启动运⾏进⾏预热，详细 QPS 随时间变化曲线如图所示：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/2b31e948-83e4-4a03-9fe1-4377ea1297f8.png" alt="一次服务预热问题的定位排查记录(2)"><br>
服务提供端在向注册中⼼注册服务的过程中，将⾃身的预热时⻓ WarmupTime、服务启动时间StartTime 通过元数据的形式注册到注册中⼼中，服务消费端在注册中⼼订阅相关服务实例列表，调⽤过程中根据 WarmupTime、StartTime 计算个实例所分批的调⽤权重。刚启动StartTime 距离调⽤时刻差值较⼩的实例权重下，从⽽实现对刚启动应⽤分配更少流量实现对其进⾏⼩流量预热。<br>
开源 Dubbo 所实现的⼩流量服务预热模型计算如下公式所示：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/50c80025-86dc-4bf1-af8f-ac8cc74d2d03.png" alt="一次服务预热问题的定位排查记录(2)"><br>
模型中应用 QPS 对应的 f(x) 随调用时刻 x 线性变化，x 表示调用时刻的时间，startTime 是应用开始时间，warmupTime 是用户配置的应用预热时长，k 是常数，一般表示各实例的默认权重。<br>
这种方式需要soa做一次soa流量权重的控制，基于这个预热模型，再加上一层强制控制一段时间流量不超过上限，可以达到服务平稳上线的效果。</p>
<h2 id="">逐步开放流量：</h2>
<p>通过冷启动机器的流量大小, 用低流量来先去诱发JIT, 再把发布机器的流量设置到正常水位, 避免在JIT过程中, 因为全量流量进来导致的CPU飚高、LOAD飚高、RT飚高等问题, 使得应用发布或重启时顺滑平稳。较为典型的是应用中的RPC服务，通过将项目中的HSF服务分批发布，逐步放开HSF调用的流量，可以减小由于大流量导致的JIT编译，缓解c2 compiler线程骤增对CPU占用过高的问题。应用启动后，利用网关的流量控制功能，按照时间间隔逐步放入流量，如：10%，20%...100%，或者给予不同的访问权重，使得服务能够逐渐到达正常访问的热度。例如，如果发现应用是重启，则开启流量分步加载策略，每当入口流量达到流量上限， 线程就Sleep下一秒，过后继续放量。根据时间间隔，逐步放开流量限制。</p>
<p>这种方式其实就是我们公司的soa流量权重控制，可以通过qunhe.service.warmUpTimeInSeconds进行配置权重变化的时间。但是这种方式显然就是本文第一个问题所阐述的没办法解决吞吐量小、上游多的时候，初始流量高、无权重变化的问题。</p>
<h2 id="">龙井预热：</h2>
<p>阿里内部在OpenJdk的基础上进行了扩展形成Ajdk，拥有更多的功能，而龙井（DragonWell）是Ajdk定制版的开源版本，供各界使用学习。Jwarmup正是Ajdk的功能。</p>
<p>JwarmUp的基本原理：根据前一次程序运行的情况，记录热点代码以及类加载顺序等信息。在应用下一次启动的时候积极主动地对相关类进行加载，并积极编译相关代码，进而使得应用尽快使用上C2编译优化的指令。从而在流量进来之前，提前完成类的加载、初始化和方法编译, 跳过解释阶段, 直接执行编译好的native code, 避免一面解释执行一面后台编译带来的CPU与load飙高, rt超时等问题。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/b0365b9e-83d8-48b5-a0bf-819196e2f293.png" alt="一次服务预热问题的定位排查记录(2)"></p>
<p>jwarmup使用的场景如下图蓝色曲线所示：项目发布阶段，大量的解释执行时把CPU占满，导致没有足够的CPU进行编译，会导致CPU打满并长时间在解释运行，没有机会编译，CPU的利用率会长时间居高不下。而开启了jwarmup后如下图红色曲线所示，大大缩短了编译的时间。也就是说jwamup可以跳过解释直接进入编译阶段。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/73f0af6d-5836-42be-a07a-38cabadf7179.png" alt="一次服务预热问题的定位排查记录(2)"></p>
<p>对于kam来说，它是由于激进的jit编译导致cpu飙升。jwarmup可以跳过解释直接进入编译阶段，并不能解决kam的问题。</p>
<h2 id="appcdsjava10">AppCDS-java10特性</h2>
<p>CDS的全称是 Class-Data Sharing，CDS的作用是可以让类可以被预处理放到一个归档文件中，后续Java程序启动的时候可以直接带上这个归档文件，这样 JVM 可以直接将这个归档文件映射到内存中，以节约应用启动的时间。</p>
<p>这个特性其实JDK 1.5就开始引入了，但是CDS只能作用与Boot Class Loader加载的类，不能作用于App Class Loader或者自定义的 Class Loader 加载的类，其实有点鸡肋，而且这个是Oracle JDK的商业特性，在OpenJDK中似乎没有。</p>
<p>在Java 10中，则将CDS扩展为AppCDS，顾名思义，AppCDS不止能够作用于Boot Class Loader，App Class Loader和自定义的Class Loader也都能够起作用，大大加大了CDS的适用范围。有了AppCDS，可以给Java的应用程序带来两个方面的好处：</p>
<ol>
<li>可以提升一些大型的Java应用的启动速度。</li>
<li>可以提升Serverless的应用程序的启动速度。我觉得这个点可能是 Java 10 提供 AppCDS 的主要原因，Serverless 极可能成为未来的应用的一种非常常见的形态，而把 Java 应用在 Serverless 上，相比于其他的语言来说，一个很大的劣势就是 JVM 的启动速度太慢了，虽然像 AWS 的Lambda，会给Java的Serverless应用加上-client来用Client模式跑加快启动速度，但是实际上效果甚微。有了AppCDS，可以大大加快Serverless应用的启动速度，按照 AppCDS 的 JEP 的说明，对于一个JEdit来说，AppCDS可以为JEdit提升20%到30%的启动速度。</li>
</ol>
<p>AppCDS主要在于提高应用程序的启动速度，思路类似jwarmup，它可以跳过类加载提前进入解释和编译阶段，对于kam痛点主要在于初始流量高以及激进的jit编译导致的cpu超限问题，AppCDS不能解决kam的问题。而且公司目前仍旧使用java8，对于升级带来的工作量也是比较大的，但是可以作为一个新的思路尝试做探索。</p>
<h1 id="">总结</h1>
<p>kam因为吞吐量低、cpu密集的特性，冷启动的情况严峻，具体包括两个方面：</p>
<ol>
<li>冷启动初始流量大，导致cpu限制率飙升，rt变高。</li>
<li>会有反直觉的效果，开启服务预热，相比没有服务预热，效果反而会变差。</li>
</ol>
<p>我们深入分析了这两个问题，原因分别是：</p>
<ol>
<li>上游过多，并发比较高的时候，到下游起始流量高。</li>
<li>因为同时接入优雅上下线以及关闭了预热，导致有流量截断的情况，初始流量作为了预热的一部分，反而增强了服务冷启动性能。</li>
</ol>
<p>从而得出kam更加倾向于用户流量进行预热的预热方式。预热新思路：目前kam的预热已经优化至比较理想的状况，在此基础上，我们在poststart脚本中模拟流量截断的过程，来进一步增强冷启动的性能。</p>
<h1 id="">参考</h1>
<ol>
<li><a href="https://juejin.cn/post/7174610735434547236?searchId=2023110114254496068D380876535B044E">谈谈Java应用发布时CPU抖动的优化</a></li>
<li><a href="https://github.com/dragonwell-project/dragonwell8/wiki/Alibaba-Dragonwell8-User-Guide">Alibaba Dragonwell</a></li>
<li><a href="https://sentinelguard.io/zh-cn/docs/flow-control.html">Sentinel</a></li>
<li><a href="https://ionutbalosin.com/2022/04/application-dynamic-class-data-sharing-in-hotspot-jvm/">APPCDS</a></li>
<li>《微服务治理技术白皮书》</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何使用油猴插件提高测试工作效率]]></title><description><![CDATA[<h2 id="-">一、背景</h2><p>在酷家乐设计工具测试中，总会有许多高频且较繁琐的工作，比如：</p><ul><li>查询插件版本：需要打开Chrome控制台，输入好几个命令然后过滤出版本信息。</li><li>查询模型商品：需要先打开调试工具，查询得到模型商品id，然后跳转到测试平台进行加密，再去商家后台拼接url，最终访问到商品详情页。</li><li>修改定制高级配置：至少要点击4次页面跳转，才能开始配置。</li></ul><p>类似的重复性工作实在太多，无形中影响工作效率与体验。并且大量的命令记忆对新手特别不友好。</p><p>仔细分析这类行为，大多都属于"<strong>数据查询</strong>"、“<strong>命令输入</strong>” 、“<strong>页面访问</strong>” 等简单操作的组合，其实非常适合“<strong>插件化</strong>”，封装成各种【<strong>一键操作</strong>】。</p><h2 id="--1">二、思路</h2><p>基于上述背景，我们期望能开发一个插件来提高测试工作效率。</p><p>对于测试插件，主要有以下诉求：</p><ul><li>开发门槛低。能让更多人参与进来，实现丰富的功能，满足各种需求。</li><li>API 强大。便于扩展更多能力。</li><li>插件更新方便。便于新功能的推广。</li></ul><p>最容易想到有两种方案： <strong>酷家乐工具内部集成插件</strong><strong>、Chrome 插件。</strong>但是很明显，</p>]]></description><link>https://tech.kujiale.com/ru-he-shi-yong-you-hou-cha-jian-ti-gao-ce-shi-gong-zuo-xiao-lu/</link><guid isPermaLink="false">665033628f9ebd00018ae25e</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Fri, 24 May 2024 06:40:30 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2024/05/33.png" medium="image"/><content:encoded><![CDATA[<h2 id="-">一、背景</h2><img src="https://tech.kujiale.com/content/images/2024/05/33.png" alt="如何使用油猴插件提高测试工作效率"><p>在酷家乐设计工具测试中，总会有许多高频且较繁琐的工作，比如：</p><ul><li>查询插件版本：需要打开Chrome控制台，输入好几个命令然后过滤出版本信息。</li><li>查询模型商品：需要先打开调试工具，查询得到模型商品id，然后跳转到测试平台进行加密，再去商家后台拼接url，最终访问到商品详情页。</li><li>修改定制高级配置：至少要点击4次页面跳转，才能开始配置。</li></ul><p>类似的重复性工作实在太多，无形中影响工作效率与体验。并且大量的命令记忆对新手特别不友好。</p><p>仔细分析这类行为，大多都属于"<strong>数据查询</strong>"、“<strong>命令输入</strong>” 、“<strong>页面访问</strong>” 等简单操作的组合，其实非常适合“<strong>插件化</strong>”，封装成各种【<strong>一键操作</strong>】。</p><h2 id="--1">二、思路</h2><p>基于上述背景，我们期望能开发一个插件来提高测试工作效率。</p><p>对于测试插件，主要有以下诉求：</p><ul><li>开发门槛低。能让更多人参与进来，实现丰富的功能，满足各种需求。</li><li>API 强大。便于扩展更多能力。</li><li>插件更新方便。便于新功能的推广。</li></ul><p>最容易想到有两种方案： <strong>酷家乐工具内部集成插件</strong><strong>、Chrome 插件。</strong>但是很明显，这两种方式都存在开发门槛高、维护成本高、使用场景有限的缺点。</p><p>所以最后选择了另一种方案---<strong>油猴插件</strong>。</p><h3 id="--2"><strong>什么是油猴插件？</strong></h3><blockquote><strong>篡改猴 (Tampermonkey)</strong> 是拥有 <strong>超过 1000 万用户</strong> 的最流行的浏览器扩展之一。它适用于 <strong>Chrome</strong>、<strong>Microsoft Edge</strong>、<strong>Safari</strong> 等主流浏览器。<br>它允许用户自定义并<strong>增强您最喜爱的网页的功能</strong>。用户脚本是小型 JavaScript 程序，可用于向网页添加新功能或修改现有功能。使用 篡改猴，您可以轻松在任何网站上创建、管理和运行这些用户脚本。</blockquote><p>简单说，油猴插件是一个 Chrome 插件，但是它的功能是一个脚本管理器，能将自定义的脚本注入到当前页面，让你的代码成为网页的一部分。</p><p>举例：在油猴脚本管理器中，仅用数十行代码就能在任意页面挂载一个刷新按钮。本质上就是一段H5代码。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/1.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/2.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><p>所以它也正好符合我们的诉求：</p><ul><li>开发门槛低。仅涉及H5开发，了解 DOM、javascript 知识即可。</li><li>API 强大。脚本注入到当前page中，所以页面的元素、api都能直接访问。并且油猴还提供了许多内部Api，支持跨域、简单存储等。</li><li>更新方便。Tampermonkey 天然就是一个脚本管理器，脚本版本与更新管理非常便捷。</li><li>油猴工具作为一个前端插件，调用后端接口相对其他独立工具有一个天然优势，不需要额外登录，更加灵活高效</li></ul><h2 id="--3">三、插件设计</h2><h3 id="3-1-">3.1 功能组成</h3><p>为了尽可能简单、易扩展，插件实现为一个悬浮的可拖拽菜单。并分为【小工具】，【常用链接】两种模块。</p><p>【小工具】主要集成一些交互操作，包括数据查询、前端数据修改、命令执行等。【常用链接】则内置了一些快捷跳转方式，可根据模型数据、粘贴板拼接 URL。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/3.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/4.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="3-2-">3.2 可维护性</h3><p>为了便于功能扩展，菜单也采用配置的形式，动态挂载。在扩展功能时，无需关注 HTML、CSS，只需要给出工具需要触发的函数。为提升可用性，也支持配置每个小工具的显隐条件。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/X1.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/6.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/X2.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="3-3-">3.3 扩展性</h3><p>油猴脚本的形态是单个 js 脚本，其开发过程相对简单直观。但是当代码量扩张后，单个js文件难以维护。尤其是酷家乐业务线众多，不同产品对于小工具诉求不同，维护多个js插件更难。为此，我们将插件脚本扩展成为一个 TS 项目，并支持快速扩展，轻松管理多个插件。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/8.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h2 id="--4">四、插件能力的扩展</h2><p>前面用大约100多行代码，搭建了一个工具“壳子”，而真正有价值的是各种菜单功能的实现。要实现功能就需要借助各种API能力。下面介绍几类我们用到的API：</p><h3 id="4-1-api">4.1 浏览器API</h3><p>由于油猴脚本本身执行在当前页面中，所以浏览器提供的api都可以直接使用。如 window、document 对象，alert、prompt等。可以非常轻松地实现各种 url 操作、DOM 数据提取、前端数据提取等交互能力。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/9.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/10.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="4-2-">4.2 第三方库</h3><p>油猴脚本甚至可以直接引用第三方库。浏览器内置的 alert 对话框不太能满足我们的需求，所以我们引用了一个非常轻量级的UI库---xtiper ，提供了多种实用的弹窗、toast 等。前例中，我们还通过静态资源引入了 jsoneditor。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/11.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="4-3-">4.3 接口请求</h3><p>油猴插件支持跨域请求。往期的文章中介绍了我们内部的低代码平台--KUTA（<a href="http://mp.weixin.qq.com/s?__biz=MzU3Nzk2MTY3NA==&amp;mid=2247485694&amp;idx=1&amp;sn=2a2424b9ed026c083b445ac4d0d82fcb&amp;chksm=fd7de35bca0a6a4d3d9b4a1723bff395361aea454a00ecddbc79bc2ae71cd7433e8a99e60e21&amp;scene=21#wechat_redirect">服务端低代码实现和设计思路</a>），其提供了非常多的优质接口工具。所以小工具插件也可以封装这些接口能力，减少在各个测试平台间切换的成本。</p><h3 id="4-4-api">4.4 油猴API</h3><p>油猴插件提供了非常多的内部API，可以极大的丰富脚本能力。如 剪切板操作、网络请求、文件下载，甚至能持久化存储一些简单数据。</p><h3 id="4-5-api">4.5 工具前端API</h3><p>往期的文章中也介绍过，酷家乐设计工具提供了许多前端api，可以直接通过控制台交互，方便我们的自动化测试获取模型数据、方案数据等。我们也用这些前端 api 封装了许多辅助工具。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/12.png" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/13.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h2 id="--5">五、插件功能演示</h2><p>基于以上能力，我们将一些高频且繁琐的操作封装成快捷小工具。下面是几类典型的场景，以动画为大家演示接入油猴插件后的便捷操作方式：</p><h3 id="--6">数据查询</h3><p>以前：1.打开酷家乐调试台工具-2.选择内外网环境-3.切换到用户数据查询页面-4.选择查询项目-5.输入用户信息</p><p>现在：酷家乐设计工具任意页面点击常驻的小工具，选择用户信息查询功能输入内容即可查询</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/14-1.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="--7">模型交互</h3><p>以前：1.选择模型后通过内部工具查看对应模型的id信息-2.打开商家后台页面-3.跳转到商品管理页面-4.切换到对应的行业线-5.点击一个其他不相关模型-6.替换模型id信息后刷新页面</p><p>现在：选择模型一键跳转到模型详情页</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/15.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="-state-">前端state数据访问与修改</h3><p>以前：1.选择模型后通过内部工具查看对应模型的id信息-2.打开开发者工具-3.输入很长的命令执行相关API-4.再执行另一个复杂命令</p><p>现在：选择模型一键修改模型状态</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/16.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h3 id="url-">url切换</h3><p>以前：记忆不同环境的地址信息，记录当前方案信息后进行url拼接访问</p><p>现在：一键切换</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/05/17.gif" class="kg-image" alt="如何使用油猴插件提高测试工作效率"></figure><!--kg-card-end: image--><h2 id="--8">六、总结</h2><p>油猴脚本通常被网友广泛制作成各类神器，没想到引入到工作中也能有不错的效果。经过近一年的陆续迭代，测试插件里已集成了 40+ 小工具，整体代码仅1000多行。</p><p>由于其便利性，已经在产研、技术支持、实施团队内广泛使用，每天点击人次100+。</p><p>后续我们也会根据实际需要封装更多的便捷工具，提供更多个性化的配置能力。</p>]]></content:encoded></item><item><title><![CDATA[MTSC专题系列——酷家乐渲染质量保障体系建设]]></title><description><![CDATA[<h1 id="-">一、背景介绍</h1><p>渲染作为酷家乐通用的中台能力，一直承接面对较多上游业务。渲染类型多，渲染流量大。</p><p>面对大量业务问题反馈及工单数据，消耗了大量人工成本，尤其部分效果问题的沟通确认。</p><p>问题排查与回归压力大，快速迭代背景下对测试要求极高。</p><p>有限的人力面对海量业务时，总会捉襟见肘。</p><p>如何在此背景下做好业务质量保障，成为大家面对的一大难题。</p><p>我们的目标则是打造业务稳定质量可靠的中台，希望能做到以前几点：</p><ul><li>业务快速对接</li><li>工单快速处理</li><li>质量稳定可靠</li><li>回归高效快捷</li></ul><h1 id="--1">二、思路讨论</h1><p>任何问题的解决都离不开人、工具和方法。对于业务质量问题，我们同样认为，流程、工具和团队建设都是必不可少的。</p><ul><li>通过流程化规范化处理业务对接问题</li><li>通过平台工具建设提升业务效率，不断赋能业务</li><li>通过团队建设，建设一支协作紧密的团队，不断保障流程持续运转与平台建设</li></ul><h3 id="2-1-"><strong>2.1对于流程体系建设</strong></h3><p>建立完善需求、设计、推测、部署、灰度、线上变更一系列规范，通过工具的方式完成关键节点识别与通知，不断完善各个节点的流程对接</p><ul><li>产研流程建设：通过敏捷迭代治理，不断规范测试流程、线上操作与规范；规范发布标准流程，</li></ul>]]></description><link>https://tech.kujiale.com/mtsczhuan-ti-xi-lie-ku-jia-le-xuan-ran-zhi-liang-bao-zhang-ti-xi-jian-she/</link><guid isPermaLink="false">65f3a2388f9ebd00018ae1f8</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Fri, 15 Mar 2024 01:28:20 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2024/03/------_17098945047917.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">一、背景介绍</h1><img src="https://tech.kujiale.com/content/images/2024/03/------_17098945047917.png" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"><p>渲染作为酷家乐通用的中台能力，一直承接面对较多上游业务。渲染类型多，渲染流量大。</p><p>面对大量业务问题反馈及工单数据，消耗了大量人工成本，尤其部分效果问题的沟通确认。</p><p>问题排查与回归压力大，快速迭代背景下对测试要求极高。</p><p>有限的人力面对海量业务时，总会捉襟见肘。</p><p>如何在此背景下做好业务质量保障，成为大家面对的一大难题。</p><p>我们的目标则是打造业务稳定质量可靠的中台，希望能做到以前几点：</p><ul><li>业务快速对接</li><li>工单快速处理</li><li>质量稳定可靠</li><li>回归高效快捷</li></ul><h1 id="--1">二、思路讨论</h1><p>任何问题的解决都离不开人、工具和方法。对于业务质量问题，我们同样认为，流程、工具和团队建设都是必不可少的。</p><ul><li>通过流程化规范化处理业务对接问题</li><li>通过平台工具建设提升业务效率，不断赋能业务</li><li>通过团队建设，建设一支协作紧密的团队，不断保障流程持续运转与平台建设</li></ul><h3 id="2-1-"><strong>2.1对于流程体系建设</strong></h3><p>建立完善需求、设计、推测、部署、灰度、线上变更一系列规范，通过工具的方式完成关键节点识别与通知，不断完善各个节点的流程对接</p><ul><li>产研流程建设：通过敏捷迭代治理，不断规范测试流程、线上操作与规范；规范发布标准流程，降低业务影响</li><li>业务线支持机制：统一中后台对接业务模式，设置关键角色跟进响应；整套体系赋能</li><li>应急与oncall：建立应急响应手册与oncall制度，线上问题高速高效处理</li></ul><p>流程对不同业务大同小异，关键在于适用于当前团队，并能够持续推行完善。</p><h3 id="2-2-"><strong>2.2 团队共建</strong></h3><p>建设产研大团队，围绕不同业务属性，在对接和沟通中建设一支协作紧密运转流畅的团队。</p><p>对于测试本身来说，我们强调领头羊的作用，不断完善各项能力，鼓励探索各类有益实践。同时会将好的BP复制到其他业务线，实现以点带面的效果，并铺向大团队。</p><p>对于工作流，我们则跟进不同类型问题，推动相关角色的协作。如敏捷迭代治理，主要为产品、研发和测试同学的协作；工单问题排查，则为客服、技术支持、研发和测试对接模式。</p><h3 id="2-3-"><strong>2.3 工具建设</strong></h3><p>对于业务质量来说，从需求开始到上线后的一系列监控反馈，中间涉及多个环节，相应的也会有不同工具和平台支撑业务流转。</p><p>比如在敏捷迭代管理中，kaptain作为统一的任务管理平台系统，对于整个需求的生命周期管理非常重要。当然，这里更多会是基于流程的任务管理才会更加科学。</p><p>对业务测试与通用回归能力，我们有Apollo接口测试平台与Hades UI自动化测试框架，发布节点会执行CI卡点。</p><p>对于上线后的监控，有中间件监控以及业务巡检，可以实现日志、接口等不同维度的巡检能力，覆盖保障业务。</p><p>但是对于业务问题定位，及业务属性较强的回归能力，则需要业务线各自支持。</p><p>因而基于现状，我们实现了渲染的定位回归平台以及回归平台，进一步完善我们的质量保障手段。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/--.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h1 id="--2">三、平台能力建设</h1><p>基于上述讨论结果，在充分利用当前已有能力和平台框架的基础上，紧贴业务建设多维度工具满足业务保障需求，实现工具平台化生态化</p><h3 id="3-1-"><strong>3.1定位能力建设：</strong></h3><p>面对业务线多，数据量大，所有问题必须从渲染侧倒序排查的问题，我们对定位工具实现以下几个关键目标</p><ul><li>复杂链路下各个节点数据定位与排查能力</li><li>围绕渲染方案、渲染速度、渲染结果等各个维度的数据快速定位能力</li><li>复杂链路下的任务流转，串联场景并实现快速定位，并实现链接化定位能力</li><li>复杂业务场景数据的可视化建设</li><li>支持业务线数据定位能力快速接入</li><li>建设围绕渲染为核心的快速定位能力工具，支持业务线快速定位</li><li>围绕渲染链路数据，建设各类定位工具，完善渲染体系定位生态</li><li>赋能业务方与前线问题排查处理，释放人力</li></ul><p>下图是定位平台核心能力，将所有渲染任务通过生命流转树的方式，记录所有关键节点数据，包括准入准出，从而为问题定位提供了极大便利。</p><p>并在此基础上，围绕渲染业务链路，不断拓展相关问题定位能力</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/2.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--3">关键能力一：任务流转树</h4><p>如下图所示，定位平台实现任务全生命周期数据记录，并能够链路化展示关键节点状态，实现所有节点出入数据、状态、节点数据解析支撑。从而对渲染链路问题定位一目了然</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/3.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>上述的各个节点有不同的内部流转，比如 第一个关键节，点击我们可以看到该阶段下的关键数据和子节点</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/4.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--4">关键能力二：数据可视化</h4><p>对于3D业务数据复杂不直观的问题，我们将业务数据可视化，支持3D拖动展示、业务数据过滤，从而业务线数据一目了然。为问题定位提供了极大便利，尤其是3维数据变更相关问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/5.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--5">关键能力三：业务线赋能</h4><p>任务流转树的概念，也通过二方包的形式提供给业务线，对于其他非渲染链路的数据，可以快速接入，从而实现定位能力的复用。</p><p>支持业务线数据快速接入，可以业务线链路节点自定义，将上下游场景化串联，从而打通断头路。如用户模型上传解析处理链路的各个节点，完成接入，方便相关问题的问题节点识别与处理。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/6.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--6">关键能力四：渲染定位生态 丰富定位能力</h4><p>除了上述渲染链路相关问题定位，围绕渲染其他数据，我们不断完善了相关数据的快速定位工具，如：方案图册数据快速查询、速度耗时快速诊断、渲染结果定位与数据修复，对于用户反馈问题可提供快速处理能力。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/7.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h3 id="3-2-"><strong>3.2回归能力建设</strong></h3><p>渲染上游对接了几十个不同业务，任务类型可达300+。</p><p>中台的快速迭代背景下，频繁改动不可能每次都协调上游业务协助回归测试。</p><p>同时，渲染场景的差异、速度和效果，都是我们需要提前考虑的情况。因此我们设计的大概思路如下</p><ul><li>分别从前台、中台、后台三层，建设各类回归能力，多方位覆盖线上业务场景保障核心链路</li><li>提供用例快速生成及管理能力</li><li>支持回归结果的验收与效果的比对</li><li>打通回归能力与定位能力，回归能力工具化、业务化，通过回归能力实现快速问题定位，并反哺回归用例集</li><li>渲染回归能力好不好，如何评价？</li><li>如何实现渲染图效果的diff能力</li><li>回归能力如何快速实现问题定位</li><li>回归问题如何与定位能力快速打通</li><li>输出赋能业务线，降低中后台在业务线用例的回归成本</li></ul><h4 id="--7">关键能力一：多样化的回归能力</h4><p>回归能力分层，分别从前台、中台及后台不同维度支持独立回归能力，各自的业务回归不再强依赖上游， 只需关注自己业务的节点逻辑。实现发布与回归上的解耦，不再需要相互确认。</p><p>如下图所示，红线截断处即表示一个渲染任务在不同截断的节点。回归支持了从各个节点独立回归的能力，能保证互不依赖和数据的一致性。既可以独立回归，也可以为下游业务的回归提供协助。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/8.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--8">关键能力二：用例快速生成与管理能力</h4><p>测试用例一键录入、用例管理模块化场景化、定时回归与自由执行、中台场景收集、覆盖海量业务线、输出赋能业务线简单易上手</p><p>1、基于定位平台的任务流转树，我们可以快速将线上数据转化为测试用例，只需要提供一个任务的id，即可一键录入用例。极大提升了构造业务数据的效率。</p><p>录入方式上，支持多种方式的用例录入。除了流转树，也可以将用户自己保存的数据一键加入。</p><p>同时，可以根据不同业务线标识，快速从线上环境筛选数据转换。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/9.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>2、用例标签管理。如下图，用例完成后支持用户自行打标签，平台也会根据用例数据识别一些关键标签，方便其他用户筛选复用。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/10.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>3、同时将用例通过测试集的维度将同一类型的用例管理起来，方便同时回归测试。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/11.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>4、对用例集分析，排查确认当前用例类型覆盖情况，以及任务结果执行整体概况，省时省力。减少人力维护成本。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/12.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h4 id="--9">关键能力三：回归结果验收与效果比对</h4><p>快速展示回归进度与结果</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/13.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>支持类似任务效果比对，并通过diff效果图的方式展示，方便人工快速确认，如下图。</p><p>如同一类任务，上线前后，通过在beta环境和prod环境的效果验收对比，能够快速回归效果变化，尤其细微差异变化，能够减少人工误判</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/14.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>同样对视频，也支持同步播放能力，辅助确认效果变化差异</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/15.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h3 id="3-3-"><strong>3.3发布拦截能力建设</strong></h3><p>围绕业务发布痛点，建立日志比对能力，最大化问题前置暴露。尤其海量error日志识别，需要在前期识别正常业务日志，并将可能异常的问题抛出来由开发确认，并纳入到发布流程规范中。</p><p>如下图，我们在各个阶段提供了新增日志与存量日志的识别能力，并通过灵活的更新与通知方式，提升各个阶段的测试验收确认</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/16.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><h2 id="--10">四、总结</h2><p>通过一段时间的实践与完善，当前我们基本形成了以下固定协作模式</p><ul><li>建立渲染各类对接机制，流程反馈完善工具的循环</li><li>工单响应流程化</li><li>问题高效对接标准化</li><li>不同角色各司其职</li><li>效能工具建设，工具支持流程建立与流程驱动</li><li>问题定位前置，释放研发资源</li><li>研发重点处理高优工单、疑难问题</li><li>新的能力与方法进一步平台化前置赋能，实现正循环</li><li>定位平台提升前线自助定位能力</li><li>业务对接与排查团队共建</li><li>团队全员工具建设能力</li><li>专项问题建设最佳实践团队</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/17.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image--><p>从结果来看，月均故障由6降到不足1个，每周发布时间由1d降到不足2h，高效响应支持30+业务线，平均问题处理时间下降70%，整体提效较为明显。</p><p>同时对于测试同学，各个业务团队合作更加高效，面对研发同学的相关问题对接沟通方式，也由反复督促变为通过监控变更和数据度量的方式。团队对接高效顺畅。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/03/18.png" class="kg-image" alt="MTSC专题系列——酷家乐渲染质量保障体系建设"></figure><!--kg-card-end: image-->]]></content:encoded></item><item><title><![CDATA[有效防范活动资损]]></title><description><![CDATA[<h1 id="-">一、背景</h1><p>随着互联网的快速发展，邀请用户参与平台活动成为许多平台提升用户活跃度的重要手段。通过这类活动，平台可以实现拉新和促活的目标，同时也为用户提供了分享和推广的机会。然而，这类活动通常设置了诱人的激励机制，一些利益驱动者也看到了其中的机会，滥用活动规则进行不合规的薅羊毛行为。这些行为不仅会给平台带来经济损失，还会降低活动的公平性和用户参与的积极性。因此，每次进行邀请类活动的研发团队都需要高度重视如何尽可能地预防资损和薅羊毛事件的发生，以确保活动能够顺利进行并达到预期的效果。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/------_17065934938784.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="--1">二、激励活动框架</h1><p>激励活动的核心流程是用户主动参与平台发布的活动，通过完成活动中设定的任务去获取相应的权益奖励。因此为了有效预防平台权益资损的问题，需要从用户、活动、奖励三方面去考虑相应的防控措施。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-17_11-31-43.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="--2">三、措施和效果</h1><h2 id="1-">1、活动上线前</h2><h3 id="1-1-"><strong>1.1 活动接口和页面的上下线验证</strong></h3><p>活动必须具有快速上下线的能力配置，这种配置不仅可以帮助运营在活动效果达到预期后快速下线活动使效益最大化，还可以帮助研发在发生故障时快速关闭活动入口从而降低资损故障扩大的风险。</p><p>活动上下线配置是活动发生资损故障时，快速止损的有效手段之一。针对这一措施，在测试时应当注意以下几点：</p><p>1、上下线的配置是否各环境独立，不独立的配置可能导致活动下线后无法在预发环境进行路径复现的问题。</p><p>2、配置的有效性验证。配置上线状态时，页面正常可访问，各链路接口调用正常；配置下线状态，页面不可访问或展示活动下线状态，接口无法调用或返回活动下线提示。其中需要重点关注的是接口下线情况的测试，</p>]]></description><link>https://tech.kujiale.com/you-xiao-fang-fan-huo-dong-zi-sun/</link><guid isPermaLink="false">65bb3df98f9ebd00018ae1b0</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Thu, 01 Feb 2024 06:53:28 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2024/02/------_17065934938784-1.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">一、背景</h1><img src="https://tech.kujiale.com/content/images/2024/02/------_17065934938784-1.png" alt="有效防范活动资损"><p>随着互联网的快速发展，邀请用户参与平台活动成为许多平台提升用户活跃度的重要手段。通过这类活动，平台可以实现拉新和促活的目标，同时也为用户提供了分享和推广的机会。然而，这类活动通常设置了诱人的激励机制，一些利益驱动者也看到了其中的机会，滥用活动规则进行不合规的薅羊毛行为。这些行为不仅会给平台带来经济损失，还会降低活动的公平性和用户参与的积极性。因此，每次进行邀请类活动的研发团队都需要高度重视如何尽可能地预防资损和薅羊毛事件的发生，以确保活动能够顺利进行并达到预期的效果。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/------_17065934938784.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h1 id="--1">二、激励活动框架</h1><p>激励活动的核心流程是用户主动参与平台发布的活动，通过完成活动中设定的任务去获取相应的权益奖励。因此为了有效预防平台权益资损的问题，需要从用户、活动、奖励三方面去考虑相应的防控措施。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-17_11-31-43.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h1 id="--2">三、措施和效果</h1><h2 id="1-">1、活动上线前</h2><h3 id="1-1-"><strong>1.1 活动接口和页面的上下线验证</strong></h3><p>活动必须具有快速上下线的能力配置，这种配置不仅可以帮助运营在活动效果达到预期后快速下线活动使效益最大化，还可以帮助研发在发生故障时快速关闭活动入口从而降低资损故障扩大的风险。</p><p>活动上下线配置是活动发生资损故障时，快速止损的有效手段之一。针对这一措施，在测试时应当注意以下几点：</p><p>1、上下线的配置是否各环境独立，不独立的配置可能导致活动下线后无法在预发环境进行路径复现的问题。</p><p>2、配置的有效性验证。配置上线状态时，页面正常可访问，各链路接口调用正常；配置下线状态，页面不可访问或展示活动下线状态，接口无法调用或返回活动下线提示。其中需要重点关注的是接口下线情况的测试，防止活动下线后，出现通过调用接口的方式访问到活动并且获取奖励的违规行为。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-24_15-56-44.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h3 id="1-2-"><strong>1.2 活动用户人群验证</strong></h3><p>活动规则制定中很重要的一点是确定活动的目标人群。例如，一个面向人群A的活动中，一个非人群A中的用户可以完成活动任务并收到奖励，则会导致奖励超发从而引起资损。</p><p>针对这一项措施，在测试时应当注意以下几点：</p><p>1、活动页面的人群访问验证。不同用户人群访问页面需要给出相应的活动提示，提高用户的活动体验，也防止非活动人群参与活动出现客诉问题。</p><p>2、活动接口的人群访问验证。活动接口须对人群进行严格的判断，当非活动用户访问活动接口时需要有相应的错误提示，以免有非活动用户通过接口获取奖励。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-17_15-16-35.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-23_16-22-59.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h3 id="1-3-"><strong>1.3 用户信息的唯一性验证</strong></h3><p>用户信息包括用户id、手机号、邮箱、身份证、设备号等。参与活动的链路上根据活动规则校验用户信息的唯一性，是防止用户重复获取活动奖励的有效手段之一。</p><p>针对这一项措施，在测试时应当注意以下几点：</p><p>1、信息唯一性验证。根据活动规则，使用重复信息参与活动，验证接口是否会报错，页面是否给出相关引导提示。</p><p>2、数据存储验证。注意用户参与活动后，用户和设备信息存储的有效时间，是否和其他活动有冲突，以及存储内容是否正确。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-23_16-25-34.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h3 id="1-4-"><strong>1.4 奖励和规则验证</strong></h3><p>任务和奖励是确保邀请活动的成功与可持续性的关键因素。任务设置过难或奖励设置过小可能无法吸引用户参与，而任务设置过简单或奖励设置过大可能会对平台的成本收益产生负面影响。因此，设置合理的任务和奖励是非常重要的。</p><p>针对这一项措施，在测试时应当注意以下几点：</p><p>1、奖励发放准确性验证。奖励发放准确是活动测试最重要的点之一，若奖励超发那上线后会造成资损，若奖励发放不准确则会造成客诉。</p><p>2、奖励和规则的合理性验证。通过活动规则、任务难度和奖励价值，考虑价值匹配、奖励发放频率以及奖励的可变性是否合理。</p><p>3、规则在整个活动进行的过程中存在迭代优化的可能，因此记录测试方法、回归用例、测试数据、自动化测试脚本也十分重要，可以帮助在后续迭代中快速验证和回归。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-23_14-13-10.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h3 id="1-5-"><strong>1.5 <strong>同盾等第三方检测有效性验证</strong></strong></h3><p><strong></strong>同盾等第三方的风控技术可以用于验证用户身份、检测欺诈行为和评估风险。在激励活动中，可以使用同盾等第三方检测服务来增加对用户身份的验证和风险评估的准确性。</p><p>例如：邀请注册活动通过第三方封控平台拦截风险注册账号4000+，平均每日拦截风险账号40+。</p><p>针对这一项措施，在测试时应当注意以下点：</p><p>风控有效性验证。上线前使用风控用户参与活动，验证第三方风控是否拦截成功。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-24_15-59-50.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h2 id="2-">2、活动上线后</h2><h3 id="2-1-"><strong>2.1 奖励监测报警</strong></h3><p>一个激励活动会设定多种奖励类型，如会员资格、积分或第三方兑换券等。</p><p>在活动规划时，部分奖励会受到预算限制。为了避免达到预算后奖励超发对平台和用户双方造成损失，活动上线前设置奖励池余额的报警功能。当余额达到预设的阈值或出现异常波动时，系统会立即发出警报，以便进行进一步审查和处理。这样的措施有助于保护双方的利益和避免不必要的风险。</p><h3 id="2-2-"><strong><strong>2.2 用户获得奖励数目监控报警</strong></strong></h3><p>对于部分高价值的奖励，可以设置周期奖励数监控，当用户在某个周期内获得的奖励达到预设的阈值可以发出警报，并对该用户的获取路径进行排查，找出链路中是否有规则漏洞并及时完善。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2023-11-24_16-0-51.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h3 id="2-3-"><strong>2.3 奖励回收方法</strong></h3><p>当资损发生后，除了通过活动配置快速下线活动外，通过奖励回收工具对已发放但尚未使用的奖励进行最大程度的回收，也可以帮助平台有效减少损失。因此在上线前，需要准备相应奖励快速回收的手段，提供相关的回收工具等。</p><p>例如：邀请注册活动上线后，出现一次非目标人群用户可完成任务并获取奖励的资损故障，通过回收工具减少了70%的损失。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2024/02/image2024-1-12_17-56-17.png" class="kg-image" alt="有效防范活动资损"></figure><!--kg-card-end: image--><h1 id="--3">四、结语</h1><p>通过以上的措施，可以尽可能的降低活动资损的风险，以及快速排查和应对资损的发生。随着技术的不断进步和经验的积累，我们相信激励活动将会变得更加智能和安全。通过不断改进和创新，平台可以更好地应对资损和薅羊毛问题，为用户提供更有吸引力和可信赖的活动。</p>]]></content:encoded></item><item><title><![CDATA[酷家乐线下环境稳定性建设实践]]></title><description><![CDATA[<h1 id="1-">1 环境建设背景</h1><p>首先介绍下酷家乐的前后端架构，后端架构和大部分的互联网公司类似，分为前台、中台、基础设施，是一套微服务的架构体系，服务间依赖关系错综复杂，并且随着业务的发展服务粒度也逐渐细化，数量在增多，同时相对于线上环境，线下环境更加复杂，并且环境有多套，也加大了环境维护和治理的难度。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image.png" class="kg-image"></figure><!--kg-card-end: image--><p>再来看下我们的工具前端架构，工具前端承载了大量的业务逻辑和算法，非常复杂，它有这么几部分组成</p><ul><li>kaf框架，它包含了公共组件和通用操作</li><li>业务微应用，各业务微应用间的依赖错综复杂</li></ul><p>整体表现是层级多、依赖呈现环状、且高度耦合，这个复杂的依赖也加大了我们对环境治理的难度。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>业界对线下环境的认知：整个产品研发周期中一个重要的基石。线下环境在整个研发迭代周期中有着非常重要作用，一般的研发周期可以从需求分析开始中间经历各种环节，最终上线发布，从代码开发阶段开始，各种活动就已经和线下环境紧密相关联，它直接关系到我们整个迭代周期是否顺畅。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-2.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="-">挑战困难</h2><p>随着业务的发展，服务数量持续性增长， 线下测试环境的数量剧增，环境日常维护的难度也在上升， 同时我们对线下测试环境稳定性的要求也上升到新的高度。</p><h1 id="2-">2 线下环境标准化建设</h1><p>在环境治理早期，容器化在酷家乐还没推开来，要构建一套环境非常复杂，各种配置、资源申请等等。同时存在链路依赖长且不稳定、没有统一的使用规范，</p>]]></description><link>https://tech.kujiale.com/ku-jia-le-xian-xia-huan-jing-wen-ding-xing-jian-she-shi-jian/</link><guid isPermaLink="false">6577f8e78f9ebd00018ae159</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Tue, 12 Dec 2023 07:04:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="1-">1 环境建设背景</h1><p>首先介绍下酷家乐的前后端架构，后端架构和大部分的互联网公司类似，分为前台、中台、基础设施，是一套微服务的架构体系，服务间依赖关系错综复杂，并且随着业务的发展服务粒度也逐渐细化，数量在增多，同时相对于线上环境，线下环境更加复杂，并且环境有多套，也加大了环境维护和治理的难度。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image.png" class="kg-image"></figure><!--kg-card-end: image--><p>再来看下我们的工具前端架构，工具前端承载了大量的业务逻辑和算法，非常复杂，它有这么几部分组成</p><ul><li>kaf框架，它包含了公共组件和通用操作</li><li>业务微应用，各业务微应用间的依赖错综复杂</li></ul><p>整体表现是层级多、依赖呈现环状、且高度耦合，这个复杂的依赖也加大了我们对环境治理的难度。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>业界对线下环境的认知：整个产品研发周期中一个重要的基石。线下环境在整个研发迭代周期中有着非常重要作用，一般的研发周期可以从需求分析开始中间经历各种环节，最终上线发布，从代码开发阶段开始，各种活动就已经和线下环境紧密相关联，它直接关系到我们整个迭代周期是否顺畅。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-2.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="-">挑战困难</h2><p>随着业务的发展，服务数量持续性增长， 线下测试环境的数量剧增，环境日常维护的难度也在上升， 同时我们对线下测试环境稳定性的要求也上升到新的高度。</p><h1 id="2-">2 线下环境标准化建设</h1><p>在环境治理早期，容器化在酷家乐还没推开来，要构建一套环境非常复杂，各种配置、资源申请等等。同时存在链路依赖长且不稳定、没有统一的使用规范，大家都在一套环境上开发测试，导致并行问题，相互影响、相互阻塞。为什么会有这些问题？一个原因是受限于基础中间件和基础设施的能力，另一个原因是规范标准的不明确不统一 。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-3.png" class="kg-image"></figure><!--kg-card-end: image--><p>我们线下环境的建设和治理是随着基础设施、中间件的演进而逐步进行的。当我们具备soa路由的能力后，对线下环境做了标准化的定义。首先，我们定义了一套基线环境，基线（stable）环境的version是default，当其他版本进行请求的时候，没有找到对应的版本，会默认路由到default上。功能和项目测试环境也叫fe环境，是基于基线构建各自的测试服务，其余都是基于基线环境，包括服务、数据库等。集成测试环境（sit），也是有一套全量的服务，数据库、中间件和基线（stable）环境共用一套 。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-4.png" class="kg-image"></figure><!--kg-card-end: image--><p>定义了各环境后，我们对各环境的流转也做了规范。其中fe作为功能测试环境，sit是集成测试环境。当完成功能测试后代码会流转到sit环境，完成集成测试后再流转到beta环境，prod是生产环境，代码部署到prod后会会自动流转到stable，这样从流程上保证了stable环境的代码稳定性。数据库和中间件线上线下分为两套，好处是维护方便，没有数据同步的问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-5.png" class="kg-image"></figure><!--kg-card-end: image--><p>基于我们定义的环境流转标准化，在各环境阶段，配套定义了我们的研发活动，比如feature环境需要做什么事情、要达到什么程度才能进行流转，sit环境需要做哪些准备，bug如何修复流转等</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-6.png" class="kg-image"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-7.png" class="kg-image"></figure><!--kg-card-end: image--><p>在这一套环境标准、对应的流程、卡点落地后，基本上解决了并行测试、相互影响、相互阻塞、以及一些环境使用的规范性问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-8.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="3-">3 线下环境稳定性建设</h1><p>线下环境标准化建设完成后，按照这套标准，已经能较好的支持日常的研发测试活动。随着业务的发展和架构的变化，渐渐的暴露出一些新问题，线下环境前面也提到过复杂度高，比线上环境更加复杂，我们没有一个人或团队去做日常运维，出了问题去定位、解决效率比较低，基线环境由于是自动化部署的，关注度比较低，经常性会有服务挂了或缺失的情况。随着这些问题的积累，终于在21年底爆发了，一会网站挂了全崩、一会是工具进不去，近3个月的时间，测试环境挂了近30次，其中最严重的是我们的注册中心（zk）间歇性抖动，导致批量服务的掉注册的情况，要恢复得全量重启对应的问题服务，开发测试疲于本命，已经严重影响了日常开发测试的进度，也是借着这个契机我们展开了新一轮的线下环境稳定性治理工作。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-9.png" class="kg-image"></figure><!--kg-card-end: image--><p>那么我们该如何进行治理呢？上万的pod稳定性如何保障？首先我们先对问题进行分析，环境的组成可以大体上分为这几类：服务、基础中间件、硬件设施。他们出问题后影响面是依次提升的。硬件设施问题：基于成本问题考虑，我们线下环境是在自建机房搭建的，且自建机房的硬件设施稳定性不高，遍地都是过保的机器，机器经常会挂。基础中间件：出了问题难恢复、基本不能自愈、且数据库数据缺少备份，有数据丢失风险。业务服务：影响面小，但出问题的频繁高，比如代码问题导致的业务不可用、针对业务服务的线下监控也非常混乱，基于成本考虑，线下环境pod配置较低，也导致了经常性的性能问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-10.png" class="kg-image"></figure><!--kg-card-end: image--><p>剖析完问题后，下一步就是进行治理，我们整体的治理思路是：从问题出发，不局限于问题本身，进行拓展和体系化的治理。线下环境特性就决定了：他肯定会出问题。那么我们要考虑的是如何降低出问题的频率，出了问题如何快速恢复，并且在做到这些的前提下如何形成一套长效机制。针对硬件设施、基础中间件、业务服务，我们分别从基础建设、事前预防、事发应急、日常运营这几个方面入手进行治理。比如事发应急，在出问题后，如何快速定位、快速恢复，解决问题三板斧重启、回滚、扩容？我们在这几方面做了一些能力的拓展。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-11.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="3-1-">3.1 基础建设</h2><p>自愈和高可用：我们主要是利用了k8s提供的能力，我们把数据库也都统一迁移到了k8s上，实现数据库出问题也能分钟级恢复。启用Probe：Probe是用于检测和监控应用程序容器健康状态的一种机制，它可以通过定期执行预定义的检查来确定容器是否正常运行，并根据检查结果采取相应的操作。Kubernetes提供了三种类型的Probe：Readiness Probe（就绪探针）、Startup Probe（启动探针）、Liveness Probe（存活探针），应用了这三种probe后，服务存活能力大大提升。启用HPA：水平Pod自动伸缩器，通过检测应用cpu使用率判断是否进行动态扩缩容，这个很好的解决了因为服务性能问题导致的环境问题。关键节点防单点：核心服务和关键节点做到至少两个pod，防止单点的情况，这个点看着简单，但确实非常的有效。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-12.png" class="kg-image"></figure><!--kg-card-end: image--><p>在同步方面，prod环境部署后会自动部署到stable环境，同时对stable环境部署做了限制，除了prod环境流转的代码外，只允许部署release分支。除了代码同步部署，相对应的配置也会进行同步，确保基线（stable环境的稳定）。在备份方面，我们利用了Ceph的能力，Ceph是一个开源的分布式存储系统，将数据复制到多个节点上，并提供故障检测和自动恢复机制，确保数据的可靠性和持久性。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-13.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="3-2-">3.2 事前预防</h2><p>前面也提到了，线下环境肯定会出问题，那么如何进行事前预防，尽快、尽早的去发现问题或者扼杀在萌芽之中呢？我们对业务核心链路做了梳理定义，并针对每个环境（这里指sit、stable）做了自动化巡检，第一时间发现问题并处理。除了自动化巡检，还建设了中间件存活检查、业务服务的存活检查。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-14.png" class="kg-image"></figure><!--kg-card-end: image--><p>我们把线下环境相关的变更接入了变更管控系统，在发生问题的时候协助快速定位。卡点建设方面：结合我们的分支管控的规范，后端服务部署sit只允许部署release分支的代码，从一定程度上保证了sit环境的稳定性；这里重点讲一下前端的部署，前端微应用在集成后，会有一些运行时的错误，这类错误在构建的时候发现不了，在各自的测试环境也可能发现不了，只有当代码都集成到一个环境的时候会发现，当出现运行时报错后，前端页面也就挂了，为了避免这类问题，在sit的default版本前面新增了一个prepare版本，要流转sit的default版本只能从prepare进行流转，这样就可以提前把问题暴露在prepare，我们在prepare上会进行一些核心功能的巡检，巡检挂了就会在prepare流转default的时候进行卡点，只有解决了问题并通过巡检才能进行流转。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-15.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="3-3-">3.3 事发应急</h2><p>当出现问题时，时间是非常宝贵的，解决问题需要争分夺秒。但因为前端微应用间的高耦合，当出现前端问题时，单个微应用的回滚可能解决不了问题，且问题定位时间也比较久，基于这个原因，我们建设了前段批量回滚的能力，当前端出现问题时，可以一键批量回滚到指定的版本，做到分钟级恢复。</p><p>我们利用k8s的能力，实现不拉镜像的原地重启，可以选择性批量重启，分钟级就能重启完上千个pod。它可以很好的解决zk出现问题或抖动批量掉服务注册信息的问题，同时一些配置变更、数据库迁移需要批量重启时也能很好应对。解决问题首先要定位到问题，结合前面提到的变更管控我们可以快速知道是哪些变更引起的问题，但是还不能定位到具体的问题点，因此我们利用了应急大盘的能力，它对应的警报进行了分层，包括api层、应用层、主机层、基础中间件层，涵盖的范围非常广，通过这个大盘可以快速的知道当下我们的环境发生了什么，快速定位问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-16.png" class="kg-image"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-17.png" class="kg-image"></figure><!--kg-card-end: image--><p>3.4 日常运营<br>前面我们做的主要是能力和工具的建设，完成这一系列建设后，日常我们还有一个专门的虚拟小组在利用这些能力和工具进行线下环境的日常运营。环境小组的日常运作机制如下图。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-18.png" class="kg-image"></figure><!--kg-card-end: image--><p>做了这么多事情，那么线下环境到底稳不稳，健不健康，我们需要拿具体的数据出来证明。这里是我们在用的一些指标，通过这些指标基本上就能衡量出环境的稳定性情况。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-19.png" class="kg-image"></figure><!--kg-card-end: image--><p>经过这一系列的治理后，目前整套机制已经运作的比较流畅了，环境block次数和时长都呈现下降趋势。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-20.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="4-">4 总结展望</h1><p>在标准化建设方面，我们定义了线下基准环境，再辅助以规范、流程，这套落地后已经能较好的支持日常的研发测试活动。随着新的问题出现，我们又开展了新一轮的稳定性建设治理工作，主要从基础建设、事前预防、事发应急几个方面做了工具和能力的建设，再通过日常运营利用工具和能力形成完成的长效机制。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-21.png" class="kg-image"></figure><!--kg-card-end: image--><p>后续我们再资源成本、环境自愈、数据稳定性上还会做进一步探索。<br></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/12/image-22.png" class="kg-image"></figure><!--kg-card-end: image--><p></p><p>                                                       </p>]]></content:encoded></item><item><title><![CDATA[开放API稳定性保障]]></title><description><![CDATA[<h2 id="-">前言</h2><p>酷家乐提供了一套对外的开放API能力，以支持将客户系统与酷家乐系统打通，来实现双方合作共赢。而在酷家乐内部，又分为开放API平台方（提供基础能力）和业务方（提供底层业务接口）。但业务方众多，变动频繁且不受控，一旦出现问题会直接影响客户系统且问题排查困难：</p><ul><li>比如业务方接口多返回了一个字段，而作为平台方没有任何拦截措施，导致客户系统无法对这个字段进行解析，就有可能引发系统故障。</li><li>又比如客户系统进行压力测试，导致流量突然增大，如果没有干预可能引起整个服务崩溃进而影响其他客户的正常使用。</li></ul><p>作为直接面对客户的开放API平台方，必须对底层的业务API进行管控。基于此，我们需要开放API业务有更高的稳定性保障能力。</p><h2 id="--1">目标</h2><ul><li>对外的API接口文档所见及所得，接口返回字段不多也不少</li><li>接口异常问题第一时间发现，且通知到对应的开发人员</li><li>针对客户流量突增的状况能进行管控</li></ul><h2 id="--2">具体措施</h2><p>分为事前管控，事后监控两部分</p><p>事前管控：流程管控、自动化卡点</p><p>事后监控：网关字段映射、线上流量巡检、异常流量限流</p><h3 id="1-">1.流程管控</h3><p>API发布和变更变得没那么“简单”，它需要经过完整的内网环境-beta环境-外网prod环境审核流程，需要业务方研发、业务方测试验证确认，及API平台方审核才允许变动</p><p>同时也对API文档进行规范，包括文档格式及入参数据类型是否必填、返回参数数据类型是否一定返回、</p>]]></description><link>https://tech.kujiale.com/kai-fang-apiwen-ding-xing-bao-zhang/</link><guid isPermaLink="false">654a02218f9ebd00018ae0f0</guid><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Tue, 07 Nov 2023 09:34:29 GMT</pubDate><content:encoded><![CDATA[<h2 id="-">前言</h2><p>酷家乐提供了一套对外的开放API能力，以支持将客户系统与酷家乐系统打通，来实现双方合作共赢。而在酷家乐内部，又分为开放API平台方（提供基础能力）和业务方（提供底层业务接口）。但业务方众多，变动频繁且不受控，一旦出现问题会直接影响客户系统且问题排查困难：</p><ul><li>比如业务方接口多返回了一个字段，而作为平台方没有任何拦截措施，导致客户系统无法对这个字段进行解析，就有可能引发系统故障。</li><li>又比如客户系统进行压力测试，导致流量突然增大，如果没有干预可能引起整个服务崩溃进而影响其他客户的正常使用。</li></ul><p>作为直接面对客户的开放API平台方，必须对底层的业务API进行管控。基于此，我们需要开放API业务有更高的稳定性保障能力。</p><h2 id="--1">目标</h2><ul><li>对外的API接口文档所见及所得，接口返回字段不多也不少</li><li>接口异常问题第一时间发现，且通知到对应的开发人员</li><li>针对客户流量突增的状况能进行管控</li></ul><h2 id="--2">具体措施</h2><p>分为事前管控，事后监控两部分</p><p>事前管控：流程管控、自动化卡点</p><p>事后监控：网关字段映射、线上流量巡检、异常流量限流</p><h3 id="1-">1.流程管控</h3><p>API发布和变更变得没那么“简单”，它需要经过完整的内网环境-beta环境-外网prod环境审核流程，需要业务方研发、业务方测试验证确认，及API平台方审核才允许变动</p><p>同时也对API文档进行规范，包括文档格式及入参数据类型是否必填、返回参数数据类型是否一定返回、以及错误码的准确性等，都有相应的审核流程</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/api-----Copy-1.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="2-">2.自动化覆盖</h3><p>当然业务方也需要对自己提供的API负责，我们组织了开放API的自动化全覆盖，并通过统一的平台进行运行结果观测</p><ol><li>首先明确API接口研发负责人和测试负责人，由测试负责人负责对接口进行自动化覆盖</li><li>测试必须完成对外的API接口自动化，不允许只覆盖底层业务方API（模拟用户真实的调用）</li><li>每次发布必须通过接口自动化卡点</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image2023-5-29_20-44-24-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>3.网关字段映射能力和巡检<br><strong>字段映射：</strong></p><p>客户系统对接酷家乐API完成且上线之后，由于不确定客户系统的兼容性，一个接口返回字段的增多或减少都有可能导致客户系统异常甚至崩溃，为了实现对外接口文档所见及所得，开放API网关实现了一套字段映射的功能</p><p>首先业务开发的配置接口时，需要填写接口返回参数及每个返回参数对应的内部参数，平台会存储这份结构数据</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image2023-5-29_20-34-24-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>在接口调用时，按照存储的结构构建数据结构的层级和参数，根据对应的层级的参数映射字段去原jsonObject内获取对应的值，这样就能实现只有配置的参数能返回（约定的参数）</p><p>如果底层业务API多返回了一个字段，但这个字段没有被配置过，客户也是不会感知到的。如果底层业务API需要修改字段名称，也只需修改内部参数名称而不至于影响到外部参数名称</p><p><strong>线上流量巡检：</strong></p><p>针对接口异常或返回字段少了的情况，会通过对线上接口的巡检来补充保障</p><p>首先需要制定一个巡检规则，线上流量全采样显然性价比不高，我们对以下几种情况进行采样率设定：</p><ol><li>httpcode != 200，采样率 20%</li><li>httpcode = 200 &amp;&amp; response.c != 0，采样率 20%</li><li>httpcode = 200 &amp;&amp; response.c = 0，采样率 5%</li></ol><p>为了避免某些调用量较高的API采样过多，调用量较少的API采样不到的情况，采样额外加了每个API每小时上限条数的限制</p><p>当采集到第一异常场景数据时，会直接进行警报通知对应的研发人员</p><p>当采集到第二种业务异常场景数据时，会根据业务错误码进行分析，然后进行警报</p><p>当采集到第三种正常场景数据时，会利用储存的字段返回结构，将接口返回数据与结构化数据进行一一比对（包括字段存在和字段类型），如果不一致则进行报警</p><p>另外，接口入参或出参存在乱码的情况也会进行报警</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/3.png" class="kg-image"></figure><!--kg-card-end: image--><p><strong>主动巡检：</strong><br>前面是对线上问题发生之后的监控巡检，而针对底层API可以进行监控的主动巡检由平台侧拼接API密钥来主动调用接口，由接口返回是否200来判断底层API是否存在</p><h3 id="4-">4.异常流量限流</h3><p>另外平台侧基于sentinel-api-gateway-adapter-common实现了API限流功能，且支持自定义限流规则配置</p><p>限流规则维度：</p><ul><li>API类型（开放平台支持openapi、oauth、sdk、platform四个对外的访问类型）</li><li>单个API</li><li>商家/应用维度</li></ul><p>限流规则类型包含两类：</p><ul><li>泛类型：表示该维度下，每种类型</li><li>明确条件类型：明确指定该维度下的，特定类型</li></ul><p>由上面两种规则可以组合成各种配置，比如：</p><ol><li>每个接口最大qps 400</li><li>户型搜索接口最大qps 300</li><li>商家应用A最大qps 400</li><li>商家应用A下户型搜索接口最大qps 200</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/4.png" class="kg-image"></figure><!--kg-card-end: image--><p>当配置限流规则后，如果发生流量突增达到阈值的情况，超出流量之外的调用会被限制，以保护整个开放API服务正常运行</p><h2 id="--3">当前成果</h2><p>酷家乐目前900+开放API已接入管控且数量持续增长中。<br>90%以上API已完成自动化覆盖，90%以上API已开启字段映射功能，帮助研发测试在线下环境提前发现故障。<br>线上配置限流规则1w+条，API流量巡检稳定运行中，累计发送报警约200次，涉及48个api，研发测试对API线上问题的敏感度大大提高，一旦产生故障能快速反应将对客户的影响降到最低。</p>]]></content:encoded></item><item><title><![CDATA[一次服务预热问题的定位排查记录(1)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="">背景</h1>
<p>酷家乐户型几何计算服务（下文简称kam）是计算密集型的服务，主要负责酷家乐户型业务的三维造体、渲染以及算量等模块，服务的特性是吞吐量低，cpu计算密集。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/dd0efb0a-9290-47d1-a18e-a910e4e135e1.png" alt="image"><img src="https://qhtbdoss.kujiale.com/pages/image/2b80ae4a-7bc6-40ee-82ec-b6a3582e75de.png" alt="image"><br>
在高峰期进行动态扩缩容的时候，kam冷启动的表现一直以来都比较严峻，cpu使用率和cpu限制率会迅速飚高，进而影响服务的rt，严重时响应时间会到5s的程度，亟需治理。<br>
在进行治理过程中，我们遇到1个奇怪的问题：高分期扩容时冷启动初始流量高，无权重变化。围绕这个问题，我们做了一系列排查和定位。</p>
<h1 id="">问题表现</h1>
<p>通过sentinel的秒级监控，我们统计了kam启动的前180s流量变化，趋势图如下：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/9378ae6f-4f1d-4046-b50c-5cb52bb50844.png" alt="image"><br>
服务冷启动的时候初始流量很高，瞬间达到线上平均QPS，虽然配置了180秒的流量预热时间（机器流量的权重会在180s内从0均匀增加到100），但是并没有看上去并没有生效。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/baa2fc6f-8a16-4d8d-9b3a-935523fb4ec8.png" alt="image"><br>
而我们理想状况下，希望启动机器的流量如下分布，随着流量逐步增加，服务不会一下被打死，服务的性能随着jit编译预热的进行逐步提高。</p>
<h1 id="">定位过程</h1>
<p>先来看下kam目前的客户端负载均衡算法，用到的是平滑加权轮询算法，类似代码如下，流程详看注释：</p>
<pre><code class="language-json">public Server choose(final ILoadBalancer lb) {
    int maxWeight = 0;
    int minWeight</code></pre>]]></description><link>https://tech.kujiale.com/warm-up-in-kam-1/</link><guid isPermaLink="false">65421c3f8f9ebd00018ae035</guid><category><![CDATA[后端]]></category><dc:creator><![CDATA[sanli]]></dc:creator><pubDate>Thu, 02 Nov 2023 06:36:35 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/11/082450d4q8qnw1qnk5zkt8.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="">背景</h1>
<img src="https://tech.kujiale.com/content/images/2023/11/082450d4q8qnw1qnk5zkt8.jpg" alt="一次服务预热问题的定位排查记录(1)"><p>酷家乐户型几何计算服务（下文简称kam）是计算密集型的服务，主要负责酷家乐户型业务的三维造体、渲染以及算量等模块，服务的特性是吞吐量低，cpu计算密集。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/dd0efb0a-9290-47d1-a18e-a910e4e135e1.png" alt="一次服务预热问题的定位排查记录(1)"><img src="https://qhtbdoss.kujiale.com/pages/image/2b80ae4a-7bc6-40ee-82ec-b6a3582e75de.png" alt="一次服务预热问题的定位排查记录(1)"><br>
在高峰期进行动态扩缩容的时候，kam冷启动的表现一直以来都比较严峻，cpu使用率和cpu限制率会迅速飚高，进而影响服务的rt，严重时响应时间会到5s的程度，亟需治理。<br>
在进行治理过程中，我们遇到1个奇怪的问题：高分期扩容时冷启动初始流量高，无权重变化。围绕这个问题，我们做了一系列排查和定位。</p>
<h1 id="">问题表现</h1>
<p>通过sentinel的秒级监控，我们统计了kam启动的前180s流量变化，趋势图如下：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/9378ae6f-4f1d-4046-b50c-5cb52bb50844.png" alt="一次服务预热问题的定位排查记录(1)"><br>
服务冷启动的时候初始流量很高，瞬间达到线上平均QPS，虽然配置了180秒的流量预热时间（机器流量的权重会在180s内从0均匀增加到100），但是并没有看上去并没有生效。<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/baa2fc6f-8a16-4d8d-9b3a-935523fb4ec8.png" alt="一次服务预热问题的定位排查记录(1)"><br>
而我们理想状况下，希望启动机器的流量如下分布，随着流量逐步增加，服务不会一下被打死，服务的性能随着jit编译预热的进行逐步提高。</p>
<h1 id="">定位过程</h1>
<p>先来看下kam目前的客户端负载均衡算法，用到的是平滑加权轮询算法，类似代码如下，流程详看注释：</p>
<pre><code class="language-json">public Server choose(final ILoadBalancer lb) {
    int maxWeight = 0;
    int minWeight = Integer.MAX_VALUE;
    int weightSum = 0;
    // linked map记录加入顺序
    final LinkedHashMap&lt;Server, IntegerWrapper&gt; weightMap = new LinkedHashMap&lt;&gt;();
    final List&lt;Server&gt; svrs = serverList;

    for (int i = 0; i &lt; svrs.size(); i++) {
        final int weight = getWeight(svrs.get(i));
        // 所有weight中的最大值
        maxWeight = Math.max(maxWeight, weight);
        // 所有weight中的最小值
        minWeight = Math.min(minWeight, weight);
        if (weight &gt; 0) {
            weightMap.put(svrs.get(i), new IntegerWrapper(weight));
            weightSum += weight;
        }
    }

    final int curIndex = nextIndexAI.getAndIncrement();
    // 存在不同的权重，则使用weighted round robin算法
    if (maxWeight &gt; 0 &amp;&amp; minWeight &lt; maxWeight) {
        // 在total weight中的位置
        int mod = curIndex % weightSum;
        // 逆向推算mod位置是什么元素
        for (int i = 0; i &lt; maxWeight; i++) {
            // 按元素顺序轮询
            for (final Map.Entry&lt;Server, IntegerWrapper&gt; entry : weightMap.entrySet()) {
                final Server svr = entry.getKey();
                final IntegerWrapper w = entry.getValue();
                // 已完成mod次排放
                if (mod == 0 &amp;&amp; w.getValue() &gt; 0) {
                    return svr;
                }
                if (w.getValue() &gt; 0) {
                    // 排放一个svr
                    w.decrement();
                    mod--;
                }
            }
        }
    }

    // 退化为取模轮询
    return svrs.get(curIndex % svrs.size());
}
</code></pre>
<p>搞个简单的单测看下不同权重的调用情况：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/aa5b5379-0441-4235-b7e6-6c2c72a3b672.png" alt="一次服务预热问题的定位排查记录(1)"><br>
如果设置a的权重为3，b的权重为2，c的权重为1，并且是按照顺序调用的。那么结果的调用数量和调用顺序就是abc abc ab这样。  理论上kam新启动的机器应该有一个流量权重的变化。但是在问题表现中我们看到初始流量就很高了。<br>
有点奇怪，我们和中间件一起做了定位，定位后发现负载均衡有一个固有缺陷，如下：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/538ed35e-2dd8-4751-9c30-d3b74a77f963.png" alt="一次服务预热问题的定位排查记录(1)"><br>
如果一个服务有6个consumer，每台consumer的qps有5，我们不考虑网络阻塞或者服务器抖动这种外界因素，虽然会通过加权轮训算法进行负载均衡，但是到达provider的流量为（consumer*consumer qps）/provider机器数，瞬间就能够到达30qps。<br>
那么我们有理由猜测，没有权重变化的原因完全可能和服务特性和上游服务太多有关系，因为kam属于吞吐量小的服务，单台qps为20-30左右，而上游的consumer服务很多，有42个服务。<br>
假设每个服务有10台机器，qps为4，那么到达kam的流量就会到达1600qps，kam线上高峰有70台机器，所以单台就有20-30的qps，起始就会有一个比较大的基础流量，符合问题表现中启动流量趋势的表现。</p>
<h1 id="">验证</h1>
<p>我们再挑一个和kam本身比较类似的有较多上游服务A，以及一个上游数量少的服务B， 服务A上游有40个左右，服务B上游较少，只有7个。我们统计了他们的启动流量趋势，来做验证，趋势图如下：<br>
<img src="https://qhtbdoss.kujiale.com/pages/image/02bc4a43-96a2-406b-819d-d03cb6ca6d6d.png" alt="一次服务预热问题的定位排查记录(1)"><br>
<img src="https://qhtbdoss.kujiale.com/pages/image/c63760bf-305a-4978-b539-7af232335749.png" alt="一次服务预热问题的定位排查记录(1)"><br>
从上图表现可以看出：</p>
<ul>
<li>服务A上游较多，可以看到流量类似kam从一开始就到了一个比较高的水位50qps左右；</li>
<li>服务B上游较少，虽然没有明显的线性过程，但是有明显的从0到100权重变化的过程，到70s左右到达服务平均qps。</li>
</ul>
<h1 id="">结论</h1>
<p>所以我们就可以验证这个结论：<mark>上游越多，qps权重变化越明显，冷启动的qps越高；上游越少，qps权重变化越明显，冷启动的初始qps越低</mark>。<br>
换个角度思考，如果能做到冷启动时候起始qps足够低，有权重的变化，服务应该就能够有充足的cpu资源进行预热编译，那么服务在预热完成后启动表现出来的性能也就能更加稳定。</p>
<h1 id="">如何解决以及总结</h1>
<p>针对现实场景，对于kam这样上游如此多，流量基数特别大，而本身吞吐量又小的服务，在流量平稳的情况下，平滑加权轮询算法是非常合适的，它的流量分布比较均匀，有利于动态调整提供者权重。但是它仍然存在固有的缺陷：在冷启动的时候初始流量高。而且<a href="https://cn.dubbo.apache.org/zh-cn/overview/core-features/load-balance/">常用的客户端式负载均衡算法</a>比如随机、加权轮训、最小连接数、最小活跃数等都会有相同的问题 ，无法避免。除非可以在客户端做一些全局的限流，但是有待验证可行性。而且经过调研（比如sentinel的warmup的流控模式是个研究方向，但是对于请求来说是有损），业界貌似也没有相关的实践来解决这个启动流量的问题。</p>
<p>但是我们可以换个角度来解决这个问题，<mark>既然初始流量高我们暂时解决不了，那么我们就需要从提升服务性能的角度来提高冷启动的性能</mark>。那如何针对实际情况来提高kam启动性能，我们留到下一篇文章再来讨论这个话题。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2023-11 技术支持沙龙，报名已开启]]></title><description><![CDATA[<h3 id="-">前言</h3><p>在美好的11月18日，我们将迎来备受期待的杭州第四届技术支持沙龙大会。本次盛会由酷家乐携手e签宝、科大讯飞技术支持团队以及Testerhome社区精心主办。作为此次活动的主办方，我们荣幸邀请到了业界一流的技术专家，他们将为我们呈现不可多得、精彩纷呈的演讲和分享，为广大技术支持同行们带来一场不可错过的盛宴。</p><p>借此机会，我们热情邀请您莅临参加。</p><h3 id="--1">议题介绍</h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="--2">活动地点</h3><h4 id="-2023-11-18-13-00">时间：2023年11月18日 13:00</h4><h4 id="-515-2-13-">地点：杭州市拱墅区余杭塘路515号莱茵矩阵国际2号楼13层培训室</h4><p></p><h3 id="--3">日程安排</h3><p></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image-3.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="--4">报名方式</h3><p>扫描下方二维码即可参与报名</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image-4.png" class="kg-image"></figure><!--kg-card-end: image--><p>在这美丽的季节里，期待与您相聚！</p>]]></description><link>https://tech.kujiale.com/2023-11-ji-zhu-zhi-chi-sha-long-bao-ming-yi-kai-qi/</link><guid isPermaLink="false">654312cc8f9ebd00018ae041</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Thu, 02 Nov 2023 03:23:35 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/11/640.png" medium="image"/><content:encoded><![CDATA[<h3 id="-">前言</h3><img src="https://tech.kujiale.com/content/images/2023/11/640.png" alt="2023-11 技术支持沙龙，报名已开启"><p>在美好的11月18日，我们将迎来备受期待的杭州第四届技术支持沙龙大会。本次盛会由酷家乐携手e签宝、科大讯飞技术支持团队以及Testerhome社区精心主办。作为此次活动的主办方，我们荣幸邀请到了业界一流的技术专家，他们将为我们呈现不可多得、精彩纷呈的演讲和分享，为广大技术支持同行们带来一场不可错过的盛宴。</p><p>借此机会，我们热情邀请您莅临参加。</p><h3 id="--1">议题介绍</h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image.png" class="kg-image" alt="2023-11 技术支持沙龙，报名已开启"></figure><!--kg-card-end: image--><h3 id="--2">活动地点</h3><h4 id="-2023-11-18-13-00">时间：2023年11月18日 13:00</h4><h4 id="-515-2-13-">地点：杭州市拱墅区余杭塘路515号莱茵矩阵国际2号楼13层培训室</h4><p></p><h3 id="--3">日程安排</h3><p></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image-3.png" class="kg-image" alt="2023-11 技术支持沙龙，报名已开启"></figure><!--kg-card-end: image--><h3 id="--4">报名方式</h3><p>扫描下方二维码即可参与报名</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/11/image-4.png" class="kg-image" alt="2023-11 技术支持沙龙，报名已开启"></figure><!--kg-card-end: image--><p>在这美丽的季节里，期待与您相聚！</p>]]></content:encoded></item><item><title><![CDATA[MTSC专题系列——酷家乐线上稳定性保障体系实践]]></title><description><![CDATA[<h1 id="-">背景</h1><p>本次分享将从酷家乐面临的稳定性问题和挑战，在稳定性保障上的工作思路，建设实践，保障体系，价值经验等几个方面，与大家一起分享交流。稳定性工作是一个非常复杂的工作，希望通过这次分享交流，我们可以一起持续探索这个领域的最佳实践。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="--1">一. 问题和挑战</h1><p>随着用户体量变大和系统复杂度变高，酷家乐稳定性建设难度也越来越大。从酷家乐历年故障原因类型分析中可以看到，系统功能缺陷，系统设计缺陷，流程问题占比较高，接近80%。其中包括很多历史债，以及各种新的故障类型，在业务&amp;架构变得更复杂后，稳定性建设工作进入到了“深水区”。在经过了仔细地复盘后，我们发现了非常多的问题，集中体现在：</p><ul><li>能力问题</li><li>意识问题</li><li>流程机制</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>既然有这么多的问题和挑战，那么其他大厂是怎么做的呢？稳定性保障在很多“大厂”已经建设多年，在云原生观测，故障快速恢复&amp;自愈，平台系统建设，智能化&amp;移动化&amp;数字化运营，以及完善的流程规范&amp;度量&</p>]]></description><link>https://tech.kujiale.com/mtsczhuan-ti-xi-lie-ku-jia-le-xian-shang-wen-ding-xing-bao-zhang-ti-xi-shi-jian/</link><guid isPermaLink="false">654098728f9ebd00018adf62</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Tue, 31 Oct 2023 06:38:31 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/10/------_16987342807239.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">背景</h1><img src="https://tech.kujiale.com/content/images/2023/10/------_16987342807239.png" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"><p>本次分享将从酷家乐面临的稳定性问题和挑战，在稳定性保障上的工作思路，建设实践，保障体系，价值经验等几个方面，与大家一起分享交流。稳定性工作是一个非常复杂的工作，希望通过这次分享交流，我们可以一起持续探索这个领域的最佳实践。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><h1 id="--1">一. 问题和挑战</h1><p>随着用户体量变大和系统复杂度变高，酷家乐稳定性建设难度也越来越大。从酷家乐历年故障原因类型分析中可以看到，系统功能缺陷，系统设计缺陷，流程问题占比较高，接近80%。其中包括很多历史债，以及各种新的故障类型，在业务&amp;架构变得更复杂后，稳定性建设工作进入到了“深水区”。在经过了仔细地复盘后，我们发现了非常多的问题，集中体现在：</p><ul><li>能力问题</li><li>意识问题</li><li>流程机制</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-1.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>既然有这么多的问题和挑战，那么其他大厂是怎么做的呢？稳定性保障在很多“大厂”已经建设多年，在云原生观测，故障快速恢复&amp;自愈，平台系统建设，智能化&amp;移动化&amp;数字化运营，以及完善的流程规范&amp;度量&amp;考核等各方面都形成了相对健全的稳定性保障体系。</p><p>而对比“大厂”，酷家乐在这些方面的建设相对落后较多。面临着业务监控建设缓慢，故障监控发现率低；快速恢复故障手段单一，恢复时间长；稳定性平台零散不成体系，缺少开发资源；流程和度量不统一，考核要求低等一系列挑战。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-2.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>二.酷家乐稳定性工作思路针对这么多的问题和挑战，酷家乐的稳定性建设工作思路分别从<strong>组织管理，流程建设，数据运营&amp;文化建设，系统&amp;能力建设</strong>等四方面自上而下，循序渐进地做到日常工作中。</p><p>1.从组织管理出发，每年都要制定稳定性目标（比如：高P故障个数，故障平均恢复时长，高P警报个数，故障分等），从CTO到各业务线技术总监，再到研发经理&amp;一线技术人员，自上而下的为结果负责。同时由CTO授权稳定性委员会对各业务线的稳定性工作运作进行监管和追踪，明确各角色职责，做到权责利统一。</p><p>2.完善流程规范，重新梳理和优化稳定性相关流程，确定流程负责人，明确流程指标，并进行宣讲和实践，让流程能真正运作起来。在线下跑通跑顺流程后，以流程指导系统建设，逐步将流程固化到IT系统（避免建设资源的浪费）。比如最基本的故障应急流程，谁来拉群组织应急，谁来协调资源，谁来同步信息，都要有明确的流程规范，以及IT系统支撑高效运转。关于应急流程，我会在下面再具体展开来讲。</p><p>3.从流程中提炼出核心结果指标和关键过程指标，定期自上而下的通晒稳定性目标数据，运营指标，驱动业务线改进，形成文化&amp;氛围。比如我们会把故障分，故障恢复时长，故障监控发现率等通过周报，群内推送等方式通晒，自上而下的追踪和分析这些数据。包括做的好的业务线的一些最佳实践分享，以及定期组织一些演练比赛等等。</p><p>4.在指标数据推动各业务线同学分析改进的过程中，我们会将实践中的能力和经验沉淀到稳定性相关平台建设中。慢慢从单点突破，到由点带面，逐步形成体系能力。比如，通过故障原因分析，发现变更故障多，就重点抓变更管控系统建设，在业务高峰期，严格控制核心业务系统发布窗口等。再比如发现大家应急能力和预案不足，组织学习应急经验和实践，在提升能力的同时，也完善各种应急操作系统功能。</p><p>当然稳定性有很强的技术相关性，本次分享主要侧重点在整体体系的实践，所以会从整体角度来分享。</p><p><br>这四个步骤，相对直接借鉴“大厂”的体系化建设经验，搭建各种系统平台能力，会更“轻”一些，从成本上也能很好的控制。先从组织和流程能力双管齐下，通过数据运营和指标驱动，然后再逐步地完成系统和能力建设，有着<strong>先轻后重，先看效果，后建能力，低成本，重管理，抓指标</strong>的特点。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-3.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>三.酷家乐稳定性建设实践</p><p>下面我们就具体展开来讲酷家乐的稳定性建设实践。<br>1.意识问题</p><p>首先，我们看下我们面临的第一个问题，意识问题。这里的每个问题，背后都是一个个故障，这些结论都是通过深入的故障复盘总结出来的。</p><h3 id="--2"><strong>线上意识薄弱</strong></h3><p>发布时和发布后，需要做业务观测，看业务表现，日志，监控，客诉反馈等。但有一次变更，发布后没有做观测，连最基本的告警报出来，都没及时处理，本来当天晚上可以及时发现解决的，硬是等到第二天早上用户批量反馈后，才开始解决。</p><h3 id="--3"><strong>管理不重视日常应用运维能力</strong></h3><p>研发忙于日常业务需求，针对基本的应急能力，平常不重视学习和演练。真正发生故障时，手忙脚乱，忙中出错。</p><p> 比如某次故障，前端有个bug，导致请求流量翻倍，本来应该能通过限流快速解决，但错误的执行了切换集群，导致问题扩大化，本来只是打开慢，现在直接挂掉。</p><h3 id="--4"><strong>责任不清晰</strong></h3><p>部分同学的行为缺乏敬畏，认为出现故障很正常，修复就好了，反正也没有明确的责任要求。</p><p>比如某次故障，开发做一个线上配置变更，在没有完全搞清楚配置操作的影响范围的情况下，随意地执行了配置操作，直接导致线上所有文案类配置显示大量错误，导致各种用户投诉。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-4.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>稳定性组织保障-三级责任制</p><p>针对上述问题，为了保障稳定性，各产品线、各敏捷组，都需要在OKR中背负一部分稳定性指标，并明确地将其完成度纳入绩效考核中。</p><p>稳定性建设工作需要多方配合，涉及到开发，测试，SRE，运维，监控团队，中间件团队等各个角色的协作和配合。因此，需要从组织管理的角度，思考如何更好地让相关方能在各自的领域完成工作的同时，又能高效配合，共同为结果负责。<br>首先，明确稳定性保障工作的主体为各业务研发团队。各业务团队研发总监，研发经理等要以身作则，与CTO自上而下一起承担稳定性结果指标，作为绩效考核的依据。在组织保障层面构建出 “总监-&gt;研发经理→应用Owner/一线研发”的三级责任制。</p><p>其次，酷家乐创造性地建设了“稳定性委员会”的横向虚拟组织，由CTO和各技术总监授权，挑选横向团队中的精英骨干组成稳定性委员会，运作稳定性日常工作。包括流程规范的制定，监管，问责，追踪各业务线稳定性工作等。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-5.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>稳定性文化建设</p><p>有了组织保障之后，再配合文化意识建设等氛围的营造，往往能达到事半功倍的效果。</p><p>a.稳定性宣传针对稳定性目标和各种考核结果指标，定期通过海报，周报，月报等期刊通晒数据，以及同步最新的稳定性工作建设进展。同时，定期组织各种专项活动，比如突袭演练活动，让各业务线锻炼团队应急能力，验证服务容灾预案的合理性，提升团队应急止血速度，以及问题定位能力，选出故障应急最强战队，营造氛围。</p><p>b.稳定性培训&amp;分享上面提到的各种应急能力和意识（怎么处理监控告警，怎么快速执行预案恢复故障），需要通过各种培训分享来推广落地，尤其是新人培训，必须要纳入到新人的入职培训体系中，并组织理论考试和实操考试（演练）。</p><p>此外，各业务线在稳定性方面做的好的方面，也要鼓励他们写出最佳实践的文档，在研发内部分享，推广到其他业务线使用。</p><p>c.稳定性奖针对做的好的同学和团队，设定稳定性奖项：从稳定性盘点，演练，应急监控，预案，复盘等事前，事中，事后各方面设置奖项，鼓励做的好的团队。</p><p>d.稳定性惩：对于违反红线等情况，实行绩效考核，以及研发内部通报批评等。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-6.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>实际结果和价值<br>经过一段时间的治理：线上故障的平均响应时长大大降低，研发同学对警告的敏感度提升非常明显。在业务线和公司的整体应急警告处理群，都能有序的执行和运作起来。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-7.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>2.流程机制问题</p><p>第二个大问题：流程机制问题。</p><h3 id="1-"><strong>1.流程不完善</strong></h3><p>很多流程缺失，导致很多稳定性工作变的很混乱。比如提到的数据变更类操作，在发生那次故障以前，完全没有流程和规范要求技术同学应该怎么做。除了流程缺失外，有一些流程也只是停留在文档上，出现无人维护，无人推动和无法落地等情况。没有人为流程结果负责。</p><p> 比如有一次故障，做线上的批量数据更新，竟然没有按照数据变更流程去做数据的备份，出错之后无法短时间快速回滚，一堆开发花了4个小时重新修复了数据。<br></p><h3 id="2-"><strong>2.流程执行不到位</strong></h3><p>在故障应急时，各自为战，信息不通畅。比如有次故障应急，没有统一的指挥和协调，不同业务线的好几个同学大量做隔离和扩容操作，将原本负载偏高的机器再次推满，本来故障已经快恢复了，因为这些操作反而导致故障又恶化了，且恢复时间也变长了。</p><p>此外，我们的复盘流程规范对怎么做复盘做了非常明确的要求，部分开发同学在做复盘文档时出现分析不深入，改进措施无法避免再次发生等情况。比如在故障原因的分析方面，没有分析从故障引入到恢复的全部过程，而只是停留在表面上的技术原因。在原因分析不全面的情况下，制定出的改进措施可想而知效果也不会太好。导致故障的管理没有闭环。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-8.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>流程建设实践----以应急流程为切入点</p><p>针对上述问题，我们整体上盘点了稳定性相关的流程规范，下面就应急流程举例说明。</p><p>线上应急作为稳定性保障的重要日常工作，应急效果的好坏直接关系到是否能快速恢复故障，以及降低故障对用户体验造成的影响。因此，在流程建设中，以线上故障应急流程为切入点，我们重点梳理和优化了该流程，打造技术支持&amp;SRE值守&amp;业务线值班长owner机制。让值班长owner故障应急全流程，在响应，判断，通告，拉群，升级，解决，验证等各个关键节点，以降低损失，恢复线上业务为第一优先级，做到有序高效地应急。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-9.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>流程管理机制和指标建设<br>从应急流程切入后，由点及面的扩展相关流程建设，比如故障等级定义，监控&amp;巡检规范，封网流程规范，发布规范，演练流程规范，变更红线规范等等一系列稳定性配套流程规范。</p><p>同时，在流程中，明确各种稳定性关键结果指标，比如故障分，故障恢复时长，故障监控发现率，故障复盘分，演练分等，以便做目标管理和考核。<br>在流程和指标建设中，需要特别注意以下两点：</p><p>1.每个流程都要有owner，为流程结果负责；定期更新和维护流程，并持续推动流程落地，做好监督和检查。最后，通过IT系统固化流程，做到自动或强制执行。避免流程成为摆设，无法落地。</p><p>2.稳定性关键结果指标，一定要从CTO到研发自上而下的负责，落到绩效考核结果中。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-10.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>意识&amp;流程机制建设概况 <br>总结：针对上面提到的这些组织管理和流程能力的痛点，酷家乐进行了一系列针对性的措施。确认以稳定性委员会作为日常运营和监管的重要组织，明确各角色职责和流程规范。设立稳定性目标和各种结果指标，营造由CTO到一线研发自上而下的为稳定性结果负责的考核要求和文化氛围。以月报期刊，红黑榜，各种奖惩等手段，强化所有同学的稳定性意识。相对来说，成本适中，收效明显。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-11.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>3.能力问题<br>第三个问题：能力问题。</p><p>能力问题，是一个较大的问题，包括告警的治理和闭环能力， 应急处理和改进能力，变更管控的能力等等。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-12.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p><strong>1.能力痛点-----告警治理能力</strong><br>为什么要做SRE监控值守和巡检？</p><p>通过观察酷家乐的高P告警数量，发现平均每天有180+的高P告警。对研发同学来说，每天跟进和处理这么多的告警，是有一定的压力的。另一方面，也说明我们的系统处于亚健康状态，需要不断的优化和治理。</p><p>此外，很多告警&amp;巡检发现的问题，因无人跟进或排查难度大等原因，导致有一些问题没有被彻底解决，成为线上故障的隐患。</p><p>最后，做监控值守&amp;巡检，最主要还是为了提前&amp;主动发现和解决问题，避免因处理不及时导致故障。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-13.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p><strong>监控值守&amp;巡检闭环</strong><br>a.基于上面提到的问题，SRE和监控团队的同学，打造了一整套的监控和巡检体系。梳理监控&amp;巡检流程规范，打造7*24小时监控值守，聚合高P疑似故障告警，推送到公司监控大群，提前发现和解决隐患，并建立警报事件跟进排查出根因&amp;改进。</p><p>b.针对云服务器，中间件，网络，应用等系统自动每日巡检，对发现的异常，创建任务确定优先级，并指派到对应的研发负责人跟进解决。</p><p>c.每日汇总高P告警数量，重点警告概述&amp;分析，以及线上业务量情况等，形成SRE日报，每日推送到研发大群。</p><p>d.持续跟踪创建的任务，根除告警和巡检发现的问题，并完善全链路监控系统和监控诊断定位系统。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-14.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-15.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>监控和巡检发现的问题会创建相应的任务，根据优先级和任务归属，指定给对应的研发owner，并要求在规定时间解决。定期会通晒解决数据情况。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-16.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p><strong>2.能力痛点-----应急能力</strong><br>a.应急协同</p><p>分工不明确，不知道应急的时候应该做什么。</p><p>b.信息同步</p><p>故障期间,各个群内消息杂乱，容易漏掉关键故障进展信息。</p><p>c.复盘管理</p><p>故障复盘信息没有平台统一存放，散落在各个文档，不方便查看和回顾。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-17.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>a.应急响应能力：<br>一键拉群&amp;一键外呼，发送故障通告信息到公司应急群。定期更新故障通告，保障信息同步通畅。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-18.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p><strong>3.能力痛点-----变更管控能力</strong><br>随着业务的快速发展，系统之间的依赖耦合也越来越复杂。历年来酷家乐出现了多次因为A业务的变更导致B业务线上异常而出现故障。此类问题出现，都是有一方做了线上变更导致另外一方异常，并且排查的时候受影响方影响，比较难在第一时间快速定位到是哪方的变更导致，尤其是涉及一些线上配置变更的问题。</p><p>经过梳理和分析酷家乐线上变更数量和相关系统，发现以下几个痛点：</p><ul><li>变更数量多：平均每天350+变更量。</li><li>变更系统多：涉及到12+变更系统，包括发布，配置，数据变更，运维操作等。</li><li>定位变更难：故障时，无法快速定位到对应变更，无法快速准确的回滚。</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-19.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-20.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>变更和监控，巡检，故障应急，封网能力建设<br>因此，在变更管控方面我们做了以下几方面的事情：</p><ul><li>线上变更统一收口：将酷家乐95%以上的变更系统接入到变更管理系统。</li><li>变更打通监控告警：在告警中展示最近变更情况。</li><li>变更打通巡检：收到变更消息后及时触发线上巡检能力，利用线上自动化测试能力和及早发现线上问题能力。</li><li>变更打通故障应急：在故障发生时，及时拉特定时间范围内特定服务的变更数据推送到故障分析群，辅助故障定位和快速恢复。</li><li>核心系统的发布接入封网管控：封网期间，推送封网信息到各核心发布变更平台，禁止线上变更。业务高峰期的高危变更推送提醒。<br></li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-21.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>真正执行封网管控之后，从源头管控了无序变更导致的故障。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-22.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>1.为什么要做故障演练</p><p>衡量稳定性工作做的好不好，最直接的方式就是多搞演练。</p><p>通过演练，至少可以有以下作用：</p><p>1.故障突袭、联合演练：以战养兵， 提升DevOps能力。处理问题的人是否熟练？沟通机制是否有疏漏？</p><p>2.架构容灾测试：主备切换、负载均衡，限流降级&amp;熔断等手段的时效和效果，容灾手段本身健壮性如何。</p><p>3.预案等措施在故障发生时是否真的有效？</p><p>4.监控报警：报警的有无、提示消息是否准确。5.故障action验收。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-23.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>2.演练平台建设</p><p>沉淀通用的故障场景，以可控成本将故障重现，以持续性的演练来暴露问题，不断验证和推动系统、工具、流程、人员能力的提升。</p><p>从前期准备，故障注入，演练期间，复盘等四个阶段展示了突袭演练的流程。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-24.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>演练运营：</p><p>1.前期准备</p><p>分析历史故障，演练场景设计，活动方案和玩法制定，奖品准备，活动前期宣传和预热，报名等。</p><p>2.活动执行</p><p>每周执行突袭活动，演练后进行复盘&amp;打分，通晒数据&amp;营造氛围。</p><p>3.活动颁奖</p><p>根据打分评选优胜队伍，组织颁奖仪式，邀请CTO等颁奖嘉宾，活动总结复盘和推送。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-25.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p><a href="https://tech.kujiale.com/mtsczhuan-ti-xi-lie-ku-jia-le-xian-shang-wen-ding-xing-bao-zhang-ti-xi-shi-jian/四.酷家乐稳定性保障体系总结">四.酷家乐稳定性保障体系总结</a></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-26.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><p>最后：价值和经验</p><p>通过上面一整套体系化的治理和建设，我们的高P故障恢复时间缩短30%，高P告警准确率90%+，巡检发现和解决问题数量100+，改进措施完成率99%，90%以上变更系统接入变更管控。</p><p>除了本身对酷家乐的价值，对于其他公司实践可以从以下几个方面借鉴：</p><p>1.组织管理，自上而下的重视程度。</p><p>2.抓流程建设&amp;流程owner落地。</p><p>3.重视文化建设&amp;营造氛围。</p><p>4.以流程指导系统建设。</p><p>5.持续建设&amp;将稳定性做到日常。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-27.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/10/image-28.png" class="kg-image" alt="MTSC专题系列——酷家乐线上稳定性保障体系实践"></figure><!--kg-card-end: image-->]]></content:encoded></item><item><title><![CDATA[前端性能保障体系]]></title><description><![CDATA[<h2 id="-">一、背景</h2><p>酷家乐是全球领先的3D云设计平台，作为一款主打室内装修设计软件，面向家居、公装、建筑、房产等领域，为企业和个人提供设计、营销、生产、管理等一站式解决方案，致力于“用设计让未来生活所见即所得”。那么要支撑云设计工具用户体验丝般顺滑，快速渲染出效果图、全景图和720°漫游图，离不开端到端的性能保障体系的支撑，这边重点介绍一下酷家乐前端性能保障体系：从2022年H2开始，明确提出前端性能领域体系化建设思路，全方位覆盖以云设计工具为主，包含酷家乐、美间、Coohom国际站、模袋云为产品代表的端到端用户体验的标准化性能保障体系。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/1.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="--1"><strong>二、性能标准&amp;流程规约</strong></h1><p>目前酷家乐主要是2套性能标准、1套线下性能卡口流程规约：</p><ul><li>web页面标准一套：主要是酷家乐网站、美间网站、国际站主站使用。《 W3C标准 》、《 Google Lighthouse性能体验标准 》</li><li>web应用标准一套：</li></ul><p>			线上：主要是酷家乐工具、美间工具、国际站工具、模袋云工具为代表。《 云设计工具性能标准 》</p><p>			线下：《 线下宽口径性能标准及卡口流程规约 》；</p><p>那么我们接下来了解一下相关性能标准。</p>]]></description><link>https://tech.kujiale.com/qian-duan-xing-neng-bao-zhang-ti-xi/</link><guid isPermaLink="false">64f14af48f9ebd00018ade77</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[闪电]]></dc:creator><pubDate>Fri, 01 Sep 2023 02:47:07 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/09/111.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="-">一、背景</h2><img src="https://tech.kujiale.com/content/images/2023/09/111.jpg" alt="前端性能保障体系"><p>酷家乐是全球领先的3D云设计平台，作为一款主打室内装修设计软件，面向家居、公装、建筑、房产等领域，为企业和个人提供设计、营销、生产、管理等一站式解决方案，致力于“用设计让未来生活所见即所得”。那么要支撑云设计工具用户体验丝般顺滑，快速渲染出效果图、全景图和720°漫游图，离不开端到端的性能保障体系的支撑，这边重点介绍一下酷家乐前端性能保障体系：从2022年H2开始，明确提出前端性能领域体系化建设思路，全方位覆盖以云设计工具为主，包含酷家乐、美间、Coohom国际站、模袋云为产品代表的端到端用户体验的标准化性能保障体系。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/1.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><h1 id="--1"><strong>二、性能标准&amp;流程规约</strong></h1><p>目前酷家乐主要是2套性能标准、1套线下性能卡口流程规约：</p><ul><li>web页面标准一套：主要是酷家乐网站、美间网站、国际站主站使用。《 W3C标准 》、《 Google Lighthouse性能体验标准 》</li><li>web应用标准一套：</li></ul><p>			线上：主要是酷家乐工具、美间工具、国际站工具、模袋云工具为代表。《 云设计工具性能标准 》</p><p>			线下：《 线下宽口径性能标准及卡口流程规约 》；</p><p>那么我们接下来了解一下相关性能标准。</p><p>W3C性能标准</p><p>W3C-window.performance是W3C提供的用来测量网页和Web应用程序的性能api</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/2.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>按图所示，window.performance就记录从用户在浏览器输入url开始到前端页面onload达到页面加载完成达到完全可交互状态，酷家乐当前各业务站点的网页性能也是结合W3C业界通用标准梳理出相关核心性能指标。</p><ul><li><strong>TTI</strong>:time to interactive，可交互时间，测量页面从开始加载到主要资源完成渲染</li><li><strong>FMP</strong>:first meanning print，首次绘制有意义内容，当整体页面的布局和文字内容全部渲染完成后时间</li><li><strong>TTFB</strong>:页面首字节响应的时间，衡量服务端响应以及网络情况。</li><li><strong>FP</strong>:白屏，衡量用户白屏等待的情况。页面开始展示的时间点(domLoading)-开始请求时间点(navigationStart)</li></ul><p>Goole Lighthouse性能体验标准</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/3.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>Google在2020年5 月5日提出了新的基于用户体验量化方式 Web Vitals 来衡量网站的用户体验来综合评估移动友好性、浏览安全性，以及Core Web Vitals 中关于加载性能、交互性、视觉稳定性等，而且google本身提供系列指标项，将这些衡量结果用作其排名算法的一部分，所以我们一般会使用google lighthouse的指标做行业的竞争性能的排行。为了更好地理解这些内容，让我们来看看这些重要指标是什么</p><h3 id="--2">核心指标</h3><ul><li>加载性能（FCP指标）— 首次内容绘制</li><li>加载性能（LCP） — 最大内容绘制</li><li>交互性（TTI） — 持续可交互时间</li><li>视觉稳定性（CLS） — 累积布局配置偏移</li><li>渲染阻塞（TBT） — 总阻塞时间</li></ul><p>目前这套标准部分指标，比如LCP（Largest Contentful Paint）用于衡量加载体验，从真实用户的角度衡量网页的加载速度，作为Coohom国际站主站线上很重要的一个性能指标。同时，网站线下性能自动化，也广泛地应用了这FCP、LCP、TTI、CLS、TBT进行web页面的线下性能自动化评判标准。那么怎么样算是优秀的，google通过给出一套标准的性能体验评级推荐。</p><p>例如，LCP耗时在2.5秒之内被认为当前页面处于<strong>性能优秀</strong>，LCP指标耗时在2.5秒和4秒内，<strong>性能有待提升</strong>，而大于4秒则属于<strong>性能较差</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/4.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/5.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>再比如，当某些时候网页中的元素在加载时出现移动，这不是用户期待的优秀体验。在这样的场景中，CLS（Cumulative Layout Shift）测量在页面的整个生命周期中发生的每个意外的样式移动的所有单独布局更改得分的总和，可以方便地用来度量 web 页面的视觉表现。布局的移动可能发生在可见元素从一帧到下一帧改变位置的任何时候。为了提供良好的用户体验，网站应努力使 CLS 分数小于 0.1</p><p><strong>设计工具性能标准</strong></p><p>作为酷家乐的主营业务，不可不提云设计工具，这套是公司自定义的性能标准。《 云设计工具性能标准 》 、《 线下宽口径性能卡口标准 》当前定义了非常详细的标准，主要分为加载类和消耗类两大类性能指标项，具体见下图：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/6.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/7.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>其中难点在于卡顿类的指标，平均帧率和最长帧耗时、最长帧耗时之间的关系是怎么样的，可以从下面这部分内容了解</p><p><strong>屏幕成像原理及卡顿原因</strong></p><p><strong>屏幕显示原理</strong> 屏幕会把像素点上，由左往右，完成第一行的像素扫描，然后等待水平同步信号的到来，电子枪会来到第二行的初始位置，这样由左往右，从上往下，逐行扫描，来到显示器的右下方，等待垂直同步信号（vertical synchronization）的到来。这样就完成第一帧画面的绘制，电子枪复位，回到左上角。上面第二张图，主要描述，计算机系统中CPU、GPU、显示器相关模块的协同工作。CPU 计算好显示内容提交到 GPU，GPU 渲染完成后将渲染结果放入帧缓冲区，随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据，经过可能的数模转换传递给显示器显示。</p><p><strong>屏幕卡顿</strong> 在 VSync 信号到来后，系统图形服务会通过 CADisplayLink 等机制通知 App，App 主线程开始在 CPU 中计算显示内容。随后 CPU 会将计算好的内容提交到 GPU 去，由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去，等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制，如果在一个 VSync 时间内，CPU 或者 GPU 没有完成内容提交，则那一帧就会被丢弃，等待下一次机会再显示，而这时显示屏会保留之前的内容不变，中间这个等待的过程就造成了掉帧，也就是会卡顿。如图所示，是一个显示过程，第 1 帧在 VSync 到来前，处理完成，正常显示，第 2 帧在 VSync 到来后，仍在处理中，此时屏幕不刷新，依旧显示第 1 帧，此时就出现了掉帧情况，渲染时就会出现明显的卡顿现象</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/8.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><ul><li>平均帧率（avgFps）：连续操作的帧率，如拖动家具等连续操作过程中的帧率，平均帧率的标准40帧，满帧一般情况60帧，即每一帧16.67毫秒</li><li>稳定帧率（stableFps）：当前工具稳定帧，是去除了前面3帧，最后3帧，剩下54帧的平静帧率</li><li>最大帧耗时（maxFrameDuration）：除之后一帧之外的行为最大帧耗时，单位毫秒，当前最大帧上限标准300ms<strong> 丢帧卡顿感主要参考指标</strong></li><li>最后帧耗时（lastFrameDuration）：最后一帧耗时，单位毫秒，当前最后帧耗时上线标准300ms，为啥最后帧耗时作为单独指标，是因为当前酷家乐工具在尾帧的时有model层的数据提交，一般会比较卡，所以单独列出来进行性能度量，而美间工具会以设置首帧耗时，是因为首帧有一些耗时操作需要单独衡量。<strong>丢帧卡顿感主要参考指标</strong></li></ul><p><strong>最长帧/最大帧耗时对屏幕是否卡顿进行辅助性能分析</strong>，大家看上图-卡顿掉帧原因，Vsync垂直同步信号发生的间隔为16.67毫秒，也就是一帧的耗时。<strong>蓝色CPU计算和红色GPU渲染并行处理时间如果在2次Vsync间隔时间也就是16.67毫秒内完成不了，那么这一帧就丢了</strong>，这种行为就像赶公交车，连续赶不上10趟公交车，那么<strong>总卡顿时长=16.67*10约为167ms</strong>，可能发生在中间就可能成为最大帧耗时，发生在最后就是最尾帧耗时。</p><p><strong>性能卡口流程规约</strong></p><p>参照云图发布流程 ，要求云图发布<strong>双周大版本实施性能卡口</strong>，卡口范围包含<strong>方案加载耗时</strong>、核心场景<strong>平均帧率/最长帧/最后帧&amp;内存增长、包体积</strong>卡点，线下性能基线新老版本对比性能退化<strong>超5%卡住不予以发布</strong>。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/9.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>测试owner在云图大版本迭代的前一周周三/周四/周五部署sit环境，当周周一/周二beta环境，进行性能自动化持续集成（定时任务不低于1小时/次，单日性能采样大于15次以上）。<strong>严重/大范围影响</strong>：方案加载耗时<strong>超20%</strong>；内存增长<strong>超10%</strong>（大范围表示核心场景超过50%及以上），<strong>不能走紧急报备</strong>，问题插件方排查修复后才能发布。局部/小范围影响:场景平均帧率/最大帧耗时/最大帧耗时超<strong>5%</strong>但小于10%局部场景、内存<strong>超5%</strong>局部场景，包体积：<strong>超5%</strong>短期不发修复，可走紧急发布邮件审批流程，<strong>限期整改修复上线</strong>。详见流程规约《 线下宽口径性能标准及卡口流程规约 》</p><p><strong>性能卡口问题处理流程</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/10.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><h2 id="--3">三、性能体系优化方法&amp;手段</h2><p>性能监控度量分析体系</p><p>在整个性能保障体系中，性能度量及性能监控体系作为很重要的一环。通过监控发现问题，进行专项治理，结合性能标准等进行长效治理，做到性能长效保鲜防退化。同时结合线上/线下基线，结合业务关联特性，对监控体系的数据进行有效分析度量。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/11.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>性能监控体系产品介绍</strong></p><ul><li>tesseract数据小站：离线T+1数据，各个站点核心性能度量分析主要来自数据小站</li><li>tetris：</li><li>	监控告警数据：实时分钟级细分性能告警数据。</li><li>	线下性能卡口性能基线看板，助力于线下性能卡口自动数据按照业务线维度展示。</li><li>	用户行为分析（下钻）：给到技术团队，以及技术支持团队，进行线上单点性能问题排查，用户性能行为回朔提供很好的数据分析支撑。</li><li>	性能月报综合度量分析：形成闭环，通过性能月报定义反馈线上性能大盘水位线，持续跟进线上问题情况，同时核心业务增设线下性能准出，对比性能基线，长效保险防退化。</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/12.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/13-1--1-.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/14.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/15.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/16.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/17.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>监控完善关键事件</strong></p><p><strong>国内酷家乐工具前端前端监控告警建设-2023H1</strong>经过2023上半年的工具前端告警监控事项的推进，目前已覆盖国内酷家乐工具前端整体性能及云图工具、户型、定制、硬装、渲染、BIM施工图、水电等主要插件方。</p><ul><li>工具性能整体及各插件告警监控范围确认</li><li>数据小站（离线T+1）迁移tetris实时告警库、告警监控需求完善落地</li><li>性能告警实时大盘：灰度gray实时告警监控大盘、灰度+人群实时告警大盘建设</li><li>工具性能整体和各插件方制定性能故障等级定义，和告警监控项形成一一映射&amp;咬合</li></ul><p><strong>国内酷家乐线下性能卡口性能看板建设-2023H1</strong> 为支撑国内酷家乐工具前端在2023年1月启动云图大版本性能卡口事项，各业务插件方逐步完善核心场景性能检查项，通过tetris看板持续关注大版本发布前的线下性能表现情况</p><p><strong>用户行为回朔-2023H1</strong></p><ul><li>【监控产品功能完善】tetris用户行为回溯，增加过滤PC崩溃率，客户端崩溃率的日志，方便排查线上用户崩溃情况；</li><li>基于tetris用户行为回溯，完成排查工具分析，产出文档&amp;宣导并提供技术支持日常使用</li></ul><p><strong>美间性能优化性能看板建设-2023H1</strong> 为支撑美间工具及美间平台，美间工具性能攻坚项目：美间工具性能瓶颈和低性能优化、美间工具操作性能优化、美间工具加载性能（图片性能优化）、渲染耗时长的页面数据和分析、慢渲染；平台侧性能优化项目：客户端内核升级、客户端监控SDK对接、全站webp支持(美间主站、插件、企业版)</p><p><strong>国际站性能一期-2022H2</strong> 国际化性能专项一期，结合国际站前端性能基线，完善国际站前端线上性能分析度量体系、前端性能监控SDK、基线告警（分国家）、静态资源网络性能等基础建设</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/18.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>大场景专题</p><p><strong>大场景性能benchmark思路</strong></p><p>酷家乐发展至今，其实大场景性能前面已经做了3期（ 2021年-工具大场景三期）了，架构为了适应业务快速增长不断垒叠本身已非常庞大负担不堪，本身所带来各种性能&amp;用户体验问题，工具性能优化技术在当下已经进入性能深水区；那么随着我们的客户诉求提升，我们为了能支撑更大的面积，更复杂的模型，更流程的性能体验，于2022年底继续起航！</p><ul><li>商业诉求聚焦<strong>商空办公行业</strong>：基于商空之前梳理的《 [2207]大场景需求描述 》逐个行业、案例分析讨论性能问题点，以及跟工具产品线的合作模式探讨。</li><li>工具性能<strong>各业务线大场景性能定义，阶段性找寻和商空办公行业商业诉求的match点</strong>，各业务线对齐大场景标准和定义后，针对商空办公行业，针对性提供几个典型方案，不同复杂度区间的方案，分别分析差距和缺口，时机合适立项优化。<strong>商空办公、全屋定制、云图工具平台启动P99大场景性能基线专项</strong></li><li><strong>震旦大场景性能优化项目</strong>：目前主要在支持震旦大场景的性能优化，具体见：《【震旦】性能&amp;算量清单需求冲刺计划 》、《 施工图震旦项目仪表盘 》</li><li><strong>性能极限探测</strong>：为了提升酷家乐设计工具的性能上限，目标支持一万平的设计方案，我们需要对云设计系统综合分析系统性问题对设计方案的性能极限探索所影响的点，并给出精细化的技术评估结论。《 云设计系统性能优化思路 》。第一轮：性能规模化问题分析：线上征集真实用户反馈的《 “崩溃/卡顿”问题跟进 》。第二轮：大场景（极限）复杂模型单一维度性能极限探测，不断地挑战技术能力上限。《 大场景性能极限探测 》</li></ul><p><strong>大场景性能自动化能力建设</strong></p><p><strong>大场景专题关键事项描述</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/19.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>线上P99大场景性能分析报告</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/20-1--1-.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/21.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/22-1--1-.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/23.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>大场景性能技术优化项</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/24.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>图片专题</p><p><strong>图片性能标准</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/image.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>图片优化技术</strong></p><p>对于图片性能优化，目前最有效且高ROI的主要是图片的压缩策略，目前酷家乐主要的CDN厂商腾讯云提供了几种标准的图片压缩策略，接下来主要讲一下webp图片转化技术</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/25.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>图片压缩指在图片质量保持不变的情况，尽可能地减小图片大小，以达到节省图片存储空间、减少图片访问流量、提升图片访问速度的效果。对象存储（Cloud Object Storage，COS）基于 数据万象（Cloud Infinite，CI） 产品推出了 WebP 压缩功能，可将图片转换为 webp 压缩图片格式，其在压缩方面相比 jpg 格式更优越。在相同图片质量的情况下，webp 格式图片要比 jpg 格式图片减小25%以上，可以适配多终端使用场景。那么webp图片转化策略，是通过支持将 jpg、png、bmp、gif、tpg、heif、avif 等格式图片转换为 webp 格式，从美间及酷家乐实测《 图片webp格式转化实测记录 》，对于png图片转webp压缩比在75%以上，jps图片转webp压测在25%以上。</p><p><strong>图片优化效果</strong></p><p>美间《 工具教程图片webp优化项目 》图片优化效果非常好，不仅是美间工具这边的教程图片，还是gif教程动图等，结果来看体积优化和耗时优化可以说都到了极限（比如之前图片性能优化webp75%，还实际提升了不少）</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/26.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/27.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/28.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>图片专题相关事项介绍图片问题跟进</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/29.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>图片监控完善</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/30.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>美间图片优化项目</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/31.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>酷家乐线下性能基建能力建设</p><p><strong>性能自动化能力基础</strong></p><p>从2023H1酷家乐国内工具开始对云图发布双周大版本实施线下性能卡口，为了能具备<strong>性能高度自动化持续集成能力，且覆盖核心业务线场景诸多性能指标项</strong>，在大版本发布前3天做到<strong>性能问题发现，有效拦截，定位并修复上线</strong>，给云图各业务插件提出非常<strong>高的要求和挑战</strong>。</p><p><strong>应对挑战关键事项</strong></p><p><strong>提升业务线核心场景覆盖密度</strong>  覆盖密度从最开始不足20-30% ——&gt; <strong>95%性能自动化脚本能力提升</strong> 性能指标原理解读↑ &amp;&amp; 编写技巧提升↑ &amp;&amp; 性能公共方法API丰富↑<strong>性能自动化环境问题解决</strong> 工具半年累计持续集成 <strong>3万+</strong> 次 &amp;&amp; 发现问题 <strong>33+</strong> &amp;&amp; 不断总结积累↑</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/32.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/33.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/34-1--1-.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/35.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/36.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/37.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/38.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/39.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>其他端到端性能优化技术介绍</p><p><strong>前端性能优化总体策略：空间换时间，异步化，并行</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/40.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>如上图所示，从最开始容器初始化之后，把load JS、JS Parse&amp;Run、请求发送之前都是串行的独立任务统一并行提前到初始化后，缩短整体端到端耗时，同时对页面dom节点数进行优化减小，同时对JS包体积进行瘦身也很关键，以及对JS包的提前预加载来缩减其downLoad耗时，这样提前自动更新，推送到用户本地侧，对页面性能加载优化提升起到了明显的效果。</p><p><strong>SW缓存机制（Service worker）</strong></p><p>Service Worker是运行在浏览器背后的一个脚本，可以使网页具备离线访问、推送通知和缓存数据等能力。其中，Service Worker的缓存机制是其重要功能之一。Service Worker缓存机制允许开发人员将资源（如HTML文件、CSS样式表、JavaScript脚本和图像等）存储在客户端，而无需每次请求都从服务器获取。这提供了更快的加载速度和离线访问功能。它有两重意义：1、JS资源在页面打开前就预先下载好，降低js下载时间；2、让JS到machine code的compile结果可以被缓存，从而降低js编译时间。</p><p><strong>预加载（Prefatch）</strong></p><p>在页面加载生命周期，把相关资源提前发起，同时利用浏览器的空闲时间进行异步任务，当前要保证几点：</p><ul><li>不能阻塞主线程：即使开始prefetch的时刻浏览器是idle的，prefetch过程中涉及到的parse等计算，可能会占用比较长的CPU时间，在此过程中如果用户进行了交互，会感受到卡顿</li><li>不能占用太多内存：prefetch的数据和代码默认留在了内存中，如果占用内存过大，会增加程序整体OOM的崩溃风险</li><li>不能占用太多带宽：避免挤占带宽，导致其他正在使用的功能loading时间过长</li></ul><p><strong>懒加载（lazyLoad）</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/41.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p><strong>JS包体积瘦身</strong></p><p>JS包体积，目前主要指云图yunDesign工具、BIM工具应用层代码包体积。其JS包代码体积大小和空方案/非方案加载有正相关性。在2022H2《 云图加载性能优化及包体积瘦身项目 》对于云图应用的代码体积包大小进行优化完成30%的瘦身。到2023年5月，云图和bim工具包体积持续下降创新低，云图包体积70多m接近80m左右，那会儿云图空方案12秒，最近云图总体积接近60m(瘦包26-28%左右)，空方案耗时8.5秒(28%)</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/42.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/09/43.png" class="kg-image" alt="前端性能保障体系"></figure><!--kg-card-end: image--><p>项目<strong>优化成果保鲜持续防范挑战大，这是一个长期过程</strong>，还好从2023年开始云图发布大版本实施<strong>包体积大小性能卡口，从根本抑制</strong>了对云图&amp;BIM工具整体及各插件微应用细分<strong>包大小随着不断的需求发布导致JS体积增长，效果非常明显</strong></p><p><strong>酷品秀端到端性能优化</strong></p><ul><li>前端</li><li>	SDK包下载耗时任务优化，-&gt;预加载</li><li>	连接耗时优化（DNS查询+TCP+SSL）</li><li>	页面渐进式加载体验优化：loading蒙层-&gt;页面骨架图秒开</li><li>后端：</li><li>	参数化模型接口优化</li><li>	架构设想→业务侧增加一层服务编排层</li></ul><p><strong>四、未来展望</strong>酷家乐是以分布式并行计算和多媒体数据挖掘为技术核心，推出的家居云设计平台，致力于云渲染、云设计、BIM、VR、AR、AI等技术的研发，实现“所见即所得”体验，5分钟生成装修方案，10秒生成效果图，一键生成VR方案，极大提升行业整体效率。作为“设计入口”，酷家乐致力于打造一个连接全球设计师、家居品牌商、装修公司以及业主的强生态平台，实现全人类的“所见即所得”体验。</p><p>正如酷家乐员工手册中映入眼帘的第一句话，我们在这条道路上始终坚信，并持之以恒......</p><p><strong>重云端</strong> 利用云的CPU/GPU，将云端海量的运算及渲染能力发挥到极致，充分利用云端的资源，未来我们所有的产品设计理念及技术改造思路一定秉持这个理念继续前行。除了之前大量的篇幅介绍了前端性能之外，未来我们也会重点持续对应用集群的综合性能更清晰的去衡量和要求，作为稳定性&amp;性能非常重要组成部分，整体的内存（频繁导致GC、OOM、内存异步化消峰）、方案大对象、长生命周期对象、是否支持分布式处理，计算维护：CPU飙高、请求维度：大量的请求出现流量尖峰（读写放大、负载不均衡、无线轮询、不合理不必要的请求）、任务积压、实例负载飙高等，配合长期的稳定性&amp;性能专项保障及预案专项治理。</p><p><strong>更大更复杂 </strong>未来，我们要实现1万平，甚至去探索10万平，支持更大更复杂的方案，更好的服务商业空间，商超，办公行业，室外建筑等大型生态行业客户。整体的架构为支持这个目标需要不断的迭代和革新，性能在此启动关键作用，作为评判用户交互体验的准绳。</p><p><strong>国际化</strong> 驰骋在全球化的海洋中，做深做广，拥抱全人类。目标是宏远的，要做到此，未来还有很多事情需要去做，酷家乐当前的架构绝大部分还是以国内机房为主，升级改造衍生为国际化架构，解决跨国机房所有服务海外对等部署，全方位打造并逐步升级为跨国多机房标准模式，和海外云服务商共同合作，完善全球化网络拓扑节点，和国家POP边缘节点加速策略，以提升并有效适配海外不同国家和地区，努力打造访问酷家乐就如同访问本国本地机房的丝般顺滑的性能体感。</p><p><strong>更智能</strong> 随着AI、AR等技术的飞度发展，酷家乐也会拥抱和全面迎接AI时代的到来。</p><p><strong>～～未来所见即所得～～</strong></p>]]></content:encoded></item><item><title><![CDATA[UE材质效果回归平台]]></title><description><![CDATA[<h1 id="-">背景</h1><p>酷家乐的UE中台项目，期望打造统一的酷家乐数据到UE（Unreal Engine，即虚幻引擎）的数据中台，已实现将酷家乐场景转换为UE场景，其中一个重要能力就是将场景内材质数据(vrscene)转换为UE材质格式。通过转换为UE材质后，该材质数据可以被UE引擎识别，用于具体的UE场景中。</p><p>由于项目前期UE材质转换算法存在大量效果问题，UE4中台将渲染效果的优化调整为项目当前阶段的核心目标。但另一方面项目前期的UE材质效果评估链路很长。从调整算法后部署材质服务，到确认渲染效果并输出报告，整个操作链路耗时可能长达半小时以上，非常影响算法同学工作效率。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/--111.png" class="kg-image"></figure><!--kg-card-end: image--><h1 id="--1">架构设计</h1><h2 id="--2">初版架构</h2><p>为了解决UE材质效果验证的低效问题，我们在与相关人员对齐需求概要后，设计出了材质回归平台第一版的架构，涉及的相关服务方包括：</p><ul><li>渲染回归平台：负责材质渲染测试数据、回归任务状态的管理</li><li>材质中台：酷家乐的材质处理中台，处理UE材质转换业务（UE材质转换算法就搭载于该服务中）</li><li>离线计算中台：酷家乐的离线计算业务中台，负责离线计算任务的调度工作</li><li>离线计算集群：由离线计算中台管理的服务器集群，负责执行定制化的离线计算任务，如图片渲染任务</li></ul><p>材质回归平台整体架构设计：</p><ol><li>回归平台触发材质中台批量材质UE格式转换</li><li>材质中台通知回归平台UE材质可用</li><li>回归平台携带UE材质信息，向云计算平台提交一个UE材质渲染任务</li><li>云计算中台将调度其下的计算集群，创建定制的windows容器下载指定UE材质并执行渲染，然后上传渲染图</li><li>回归平台收到UE材质的渲染图，</li></ol>]]></description><link>https://tech.kujiale.com/uecai-zhi-xiao-guo-hui-gui-ping-tai/</link><guid isPermaLink="false">64d478928f9ebd00018ade2c</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[炬尧]]></dc:creator><pubDate>Thu, 10 Aug 2023 05:51:52 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/08/----_20230808104105.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">背景</h1><img src="https://tech.kujiale.com/content/images/2023/08/----_20230808104105.png" alt="UE材质效果回归平台"><p>酷家乐的UE中台项目，期望打造统一的酷家乐数据到UE（Unreal Engine，即虚幻引擎）的数据中台，已实现将酷家乐场景转换为UE场景，其中一个重要能力就是将场景内材质数据(vrscene)转换为UE材质格式。通过转换为UE材质后，该材质数据可以被UE引擎识别，用于具体的UE场景中。</p><p>由于项目前期UE材质转换算法存在大量效果问题，UE4中台将渲染效果的优化调整为项目当前阶段的核心目标。但另一方面项目前期的UE材质效果评估链路很长。从调整算法后部署材质服务，到确认渲染效果并输出报告，整个操作链路耗时可能长达半小时以上，非常影响算法同学工作效率。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/--111.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><h1 id="--1">架构设计</h1><h2 id="--2">初版架构</h2><p>为了解决UE材质效果验证的低效问题，我们在与相关人员对齐需求概要后，设计出了材质回归平台第一版的架构，涉及的相关服务方包括：</p><ul><li>渲染回归平台：负责材质渲染测试数据、回归任务状态的管理</li><li>材质中台：酷家乐的材质处理中台，处理UE材质转换业务（UE材质转换算法就搭载于该服务中）</li><li>离线计算中台：酷家乐的离线计算业务中台，负责离线计算任务的调度工作</li><li>离线计算集群：由离线计算中台管理的服务器集群，负责执行定制化的离线计算任务，如图片渲染任务</li></ul><p>材质回归平台整体架构设计：</p><ol><li>回归平台触发材质中台批量材质UE格式转换</li><li>材质中台通知回归平台UE材质可用</li><li>回归平台携带UE材质信息，向云计算平台提交一个UE材质渲染任务</li><li>云计算中台将调度其下的计算集群，创建定制的windows容器下载指定UE材质并执行渲染，然后上传渲染图</li><li>回归平台收到UE材质的渲染图，通过PSNR和SSIM算法，对比材质转换前后渲染图的差异，得出差异值；同时通过像素差异对比，输出图片差异可视化图像</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/--.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><h2 id="--3">方案调整</h2><p>这套方案依赖的docker镜像是一个定制化的windows镜像，预期将包含UE渲染工具和一个渲染图上传工具。然而在前期容器构建调试过程中，我们遇到容器无法识别GPU硬件问题。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-5-4_12-3-46.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><p>而UE渲染工具对GPU设备有强依赖。在一段时间探索确认win容器方案当下不可行之后，我们调整了系统架构设计。新架构的业务流程中，发生较大调整的是原先的云计算中台部分被替换为一台搭载GPU的真实windows物理机，调整架构之后整体的材质回归任务流程如下：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/----3--1.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><h1 id="--4">需求迭代</h1><p>由于UE4中台项目工期非常紧迫，在材质回归平台的早期调试阶段，UE业务方就积极参与试用并提出了很多新需求.</p><h2 id="--5">材质转换本地化</h2><p>回归平台加快了材质回归验收速度，UE算法工程师对转换算法迭代速度加快，这时他们迫切希望能将材质转换中台相关能力本地化部署，方便工程师直接修改算法并部署回归。由此我们对平台需求做出调整并开发新功能，落地了材质转换本地化需求：</p><ol><li>本地物理机部署材质转换服务</li><li>回归服务支持发起本地的材质转换流程</li><li>回归服务负责管理所有本地磁盘的材质缓存</li></ol><h2 id="--6">稳定性需求</h2><p>回归平台使用过程中频繁出现批量材质任务失败，经定位确认主要是以下两种情况导致：</p><ol><li>UE材质转换服务本身存在概率失败（算法问题或网络抖动）</li><li>UE材质渲染图工具渲染失败</li><li>网络抖动导致的回归任务运行失败</li></ol><p>基于业务方的强烈需求，我们通过以下两个方向对平台后端逻辑进行了开发调整，并大幅提升了材质回归流程的稳定性。</p><h3 id="ue-"><strong>UE材质转换任务检测</strong></h3><p>通过对比UE转换任务与材质渲染任务差异，判断是否出现了上述1类型的异常问题，并适时拉起本地材质转换服务再次运行UE转换逻辑。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-4-28_18-6-3.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><h3 id="--7"><strong>渲染线程检测</strong></h3><p>回归任务状态管理逻辑调整，检测物理机上渲染中的任务数量与数据库中待处理渲染记录后，适时重启渲染任务，防止上述2、3类型的异常问题</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-5-4_12-2-23.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><h2 id="--8">其他需求</h2><p>上面提到的两个需求之外，还有许多其他新增需求点：渲染多并发、动态渲染配置、材质转化提速、本地任务排队、独立基线等等，这里不再赘述了。</p><h1 id="--9">项目成果</h1><p>材质回归平台实现了丰富的UE渲染回归功能选择，包括：</p><ol><li>选择回归物理节点</li><li>指定材质所在环境</li><li>数据转换类型分支</li><li>自定义材质版本和引擎版本</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-4-28_18-10-8.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><p>UE回归任务结果数据展示：直观的基线对比与diff图，给出了通用的图像对比指标SSIM/PSNR，并且通过tag展示UE任务基本信息</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-4-28_18-12-10.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><p>截止12月12日已支持6批次测试集总计9000+的UE材质回归，发掘材质效果基础问题30+，回归效率相比原流程提升90%以上</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-4-28_18-14-47.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/08/image2023-4-28_18-15-3.png" class="kg-image" alt="UE材质效果回归平台"></figure><!--kg-card-end: image-->]]></content:encoded></item><item><title><![CDATA[聊聊服务间的网络通信 - TCP 与 HTTP]]></title><description><![CDATA[<h1 id="-">前言</h1><p>阅读前你可能需要了解这些：</p><ul><li>了解 TCP/IP、OSI 模型</li><li>了解 HTTP 协议</li><li>了解 Node.js</li></ul><p>从几个问题入手：</p><ul><li>服务间调用的长连接如何设置</li><li>服务器上 TCP 连接数限制</li><li>服务器上 TCP 连接数对业务的影响</li></ul><h1 id="--1">服务间的长连接</h1><p>假设我们的目标服务，存在服务的消费者和提供者，服务之间存在上下游依赖关系：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac71efda6a2343df9f78ed6bf9f5e00e~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image"></figure><!--kg-card-end: image--><p>我们期望服务间的连接是长连接，即 TCP 连接只建立一次，无需每次请求调用都发起 3 次握手、4 次挥手，以提升网络 IO 吞吐量。但是事实跟期望可能有所出入。</p><p>假设微服务间通信使用的应用层协议是 HTTP 1.1，单个 TCP 连接同时只能发出单个 HTTP 请求。即当同一时间请求并发数为 n ，会存在</p>]]></description><link>https://tech.kujiale.com/liao-liao-fu-wu-jian-de-wang-luo-tong-xin-tcp-yu-http/</link><guid isPermaLink="false">6497bd4e8f9ebd00018adddf</guid><category><![CDATA[前端]]></category><dc:creator><![CDATA[洋葱]]></dc:creator><pubDate>Sun, 25 Jun 2023 04:16:00 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/06/v2-e081bff5e82ebc29b76e161529fd3583_1440w.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">前言</h1><img src="https://tech.kujiale.com/content/images/2023/06/v2-e081bff5e82ebc29b76e161529fd3583_1440w.png" alt="聊聊服务间的网络通信 - TCP 与 HTTP"><p>阅读前你可能需要了解这些：</p><ul><li>了解 TCP/IP、OSI 模型</li><li>了解 HTTP 协议</li><li>了解 Node.js</li></ul><p>从几个问题入手：</p><ul><li>服务间调用的长连接如何设置</li><li>服务器上 TCP 连接数限制</li><li>服务器上 TCP 连接数对业务的影响</li></ul><h1 id="--1">服务间的长连接</h1><p>假设我们的目标服务，存在服务的消费者和提供者，服务之间存在上下游依赖关系：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac71efda6a2343df9f78ed6bf9f5e00e~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>我们期望服务间的连接是长连接，即 TCP 连接只建立一次，无需每次请求调用都发起 3 次握手、4 次挥手，以提升网络 IO 吞吐量。但是事实跟期望可能有所出入。</p><p>假设微服务间通信使用的应用层协议是 HTTP 1.1，单个 TCP 连接同时只能发出单个 HTTP 请求。即当同一时间请求并发数为 n ，会存在 n 个 TCP 连接，并且会存在 3 * n + 4 * n 次握手挥手动作，甚至可能会触发 sockets 连接数用满。</p><h2 id="--2">长连接示例</h2><p>我们通过一个示例，感受并发调用场景下，TCP 建连的过程。</p><p>以下为代码启动一个 HTTP server 作为上图中的 Provider Service：</p><ul><li>建立 TCP 连接时，打印 new connection 日志</li><li>收到 HTTP 请求时，返回 ok 作为 response body，并打印 request 日志</li></ul><!--kg-card-begin: code--><pre><code>const http = require('http');

var server = http.createServer(function (req, res) {
  res.end('ok');
  console.log('request');
});

server.on('connection', function (socket) {
  console.log('new connection');
});

server.listen(3000);
</code></pre><!--kg-card-end: code--><p>以下代码为客户端代码作为 Target Server（由于我们想要测试长连接，双方交互的服务一定是长期存活的，所以这里我们启动一个服务，而不是直接写个 client.js 做测试）：</p><ul><li>服务端口监听在 3001</li><li>当收到 <code>/batch</code> 请求时，并发调用 Provider Service 10 次</li></ul><!--kg-card-begin: code--><pre><code>const http = require('http');

var server = http.createServer(async function (req, res) {
  if (req.url === '/batch') {
    await Promise.all(Array(10).fill(1).map(request));
  }
  res.end('ok');
});

server.listen(3001);

async function request() {
  return new Promise((resolve) =&gt; {
    http
      .request('http://127.0.0.1:3000', (res) =&gt; {
        res.on('data', resolve);
      })
      .end();
  });
}
</code></pre><!--kg-card-end: code--><p>以 curl 作为客户端（或者作为 Consumer Service）</p><p><code>$ curl http://127.0.0.1:3001/batch</code></p><p>Provider Service 输出如下日志：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/201e04f609ab4edf96622abbffae9eb8~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>整理下完整的调用链为：curl -&gt; Target Service -&gt; Provider Service。</p><p>可见 10 次 HTTP 并发调用产生了 10 次 TCP 连接，符合预期，因为 HTTP 1.1 并发调用一定会产生相对应数量的 TCP 连接。</p><p>再次 curl ，Target Service 与 Provider Service 之间继续新建 10 条 TCP 连接，原因也很简单，之前的 TCP 连接都是用完即销毁的。</p><p>假设我们想要第二次并发的 10 次请求，继续复用之前的 10 个 TCP 连接就需要做如下处理，代码变更如下：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2d67f7c97e6544f9bef7f9e5406241dc~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>连续手动操作进行 3 次 curl 调用：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2f97ab2d624a4d85bd12478727dd4d82~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>对输出做一下分析：</p><ul><li>首次 curl 调用，建立 10 次 TCP 连接，符合预期</li><li>二次 curl 调用，复用原有的 TCP 连接，符合预期</li><li>三次 curl 调用，又建连了 10 次 TCP 连接，不符合预期</li></ul><p>大家可能对第三次调用结果比较疑惑，这里直接放下结论：因为 TCP 连接只存活 5s ，超时后，自动断连了。</p><h1 id="wireshark-">Wireshark 网络分析</h1><p>为了对如上的调用做解释，我们需要一个工具去查看 TCP、HTTP 的完整过程，这里我们用到一个工具： Wireshark。</p><p>Wireshark 是一个强大的网络分析工具，它工作于 OSI 网络模型的 <code>Data Link Layer</code> 层，即数据链路层，所以可以分析 <code>Data Link Layer</code>以上的所有层数据，包括本次分析的 TCP、HTTP 过程。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/528088f7147d4e90aea610bd6bdf1947~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>Wireshark 相对于一些其他常用的网络分析工具，例如 Fiddler、Charles、Whistle 等工具，其有如下优势：</p><ul><li>实现机制更底层，所以能捕获 <code>Data Link Layer</code>上层的数据，而其他代理工具只能看应用层数据，顶多再看个传输层数据</li><li>由于更底层，所以无需配置应用的代理配置（部分应用可能不走默认系统代理，需要手动配置，例如你启动的 Node.js 服务）</li></ul><p>话不多数，关于 Wireshark 的使用，有兴趣直接看官网文档吧： <a href="https://www.wireshark.org/docs/wsug_html_chunked/">https://www.wireshark.org/docs/wsug_html_chunked/</a></p><h2 id="--3">对单条请求做分析</h2><p>为了减少干扰，我们仅发出一条请求 Target Server -&gt; Provider Service。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c24540f108504588b6fc50ce410c40ef~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><p>关于图例说明下：</p><ul><li>绿底的输入框，由于网卡比较活跃，减少干扰过滤出 Provider Service 3000 端口号的网络交互</li><li>图中我们可以很直观的看到熟悉的三次握手、HTTP 请求、四次挥手</li><li>Keep Alive Check：我们还发现每隔 1s Target Service 于 Provider Service 都会进行一次双向交互，这是为了：</li></ul><ul><li>检查死连接，及时断连</li><li>防止长时间无网络交互，导致断连</li><li>具体参考：<a href="https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html">https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html</a></li></ul><p>对图例的细节进行分析：</p><ul><li>存在四次挥手，而且是在大概 5s 后，这个我们从 HTTP response 中得到验证</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1877ec6452cd4fa4ab04874d191e9037~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><h2 id="-curl-">对 curl 三次结果做分析</h2><p>从上述单个请求分析中，我们基本可以论证 <code>curl</code>手动触发第三次不符合预期的原因，重复说明一下原因：因为 TCP 连接只存在 5s ，超时后，自动断连了。</p><p>我们再次重复 3 次手动 <code>curl</code>：</p><ol><li>触发第一次</li><li>1s 后触发第二次</li><li>8s 后触发第三次（此时之前的 TCP 长连接已断连，需要重新连接）</li></ol><p>具体操作如下，到这一步已经非常清晰了：</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/20c9f74460114fbbbe166dc9e28ebeb2~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><h1 id="--4">如何操作长连接</h1><p>回到问题，这里列一些解法：</p><h2 id="--5">如何配置长连接，以及超时时长</h2><ul><li>对于客户端，上述 Demo 已经很明确了，Node.js 上直接设置 http agent 即可。</li><li>对于服务端，可以调整 keepalive timeout 增长 TCP 连接的时长，可以设置 <code>Server.keepAliveTimeout</code>属性，但是也要注意其可能频繁 <code>TCP Keep-Alive Check</code>，需要做好取舍，多次测试找到合适的阈值</li></ul><h2 id="demo-10-tcp-">Demo 里 10 次批量的请求，在 TCP 连接还没销毁前，二次并发调用时会重用，那么这个最大重用限制多少？</h2><p>与客户端配置 <code>Agent.maxFreeSockets</code>相关：</p><ul><li>默认 256，即连接池的最大默认空闲容量，当下次请求来时会优先复用</li><li>当超过时，客户端在 http 结束时会立即发起断连</li></ul><h2 id="-tcp-">并发数过大时，TCP 连接数会建很多么，是否有限制？</h2><p>与客户端配置 <code>Agent.maxSockets</code>和 <code>Agent.maxTotalSockets</code>相关：</p><ul><li>前者限制单 host、后者针对所有 host</li><li><code>Agent.maxSockets</code> Node 0.12 以上就是不限制了</li><li>设置此值的效果为：超出的数量的 HTTP 请求不会发出，直到 TCP 空闲</li></ul><ul><li>例如设置为 1，则所有请求都会是串行的效果，TCP 连接也仅仅存在一个</li><li>具体示例如下图，No.23 为第二个请求，在 No.19 第一个请求完全结束后才发出</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4bfed15f60fb41d5ad58651389ad1aa0~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><h1 id="tcp-">TCP 连接数限制</h1><p>通过 {Source IP, Source Port, Destination IP, Destination Port} 四元组确定唯一的 TCP 连接。</p><p>对于服务提供方：只需要一个暴露一个端口给客户端，即可接收<strong>无限数量的 TCP 连接</strong>，在不考虑内存的前提下，客户端的 IP, Port 只要不同即可。</p><p>对于客户端：连接数量限制在 2^16 - 1 内，即 65535 个端口，去掉 0 这个特殊端口。</p><p>客户端存在限制的核心原因：<strong>TCP 规范的要求</strong>。</p><ul><li>端口号只能是 16 bits 内，如果超出可能会导致对方服务无法解析或解析错误</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b1023f76e60a4c85b12ca9eb5a47d755~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7e7cc27e00624632be0911066bfde7dc~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><ul><li>以上为 Wireshark 的示例，整个 TCP header 都是固定顺序与固定格式的</li></ul><h2 id="-65535-">作为客户端 65535 个数量是否够用</h2><p>个人电脑当然够用的，假设每个程序 100 个 TCP 连接，同时运行 100 个程序，也才 10000 个罢了。</p><p>微服务中的一台服务：也是够用的</p><ul><li>假设你的服务都是短连接，每次客户端请求过来都要转发给相对应数量的上游其他服务，并且假设每个请求你都需要处理 5s</li><li>那么 5s 你能接受的最大单机请求数是 6w+ 个，基本单个服务是达不到这个数量的。除非你接收一个请求，分散出 10+ 的请求。况且存在这么高的并发时，内存和 CPU 可能更先刚不住，而不需要先担心 TCP 的数量是否够用</li></ul><h1 id="http-1-1-2">HTTP 1.1 与 2</h1><p>相比之下，HTTP 2 带来了如下特性：</p><ul><li>二进制，而不是文本</li><li>完全多路复用，而不是有序和阻塞，故可以使用一个连接进行并行</li><li>使用 Header 压缩来减少开销</li><li>允许服务器主动将响应“推送”到客户端缓存中</li></ul><p>具体参考：<a href="https://http2.github.io/faq/">https://http2.github.io/faq/</a></p><p>那么，我们是不是可以把服务间的通信协议升级到 HTTP 2 来解决并发流量导致的重复 TCP 建连开销？</p><p>立即开干，以下是 Provider Server：</p><!--kg-card-begin: code--><pre><code class="language-javascript">const http2 = require('http2');
const fs = require('fs');

const server = http2.createSecureServer(
  {
    key: fs.readFileSync('localhost-privkey.pem'),
    cert: fs.readFileSync('localhost-cert.pem'),
  },
  function (req, res) {
    res.end('ok');
    console.log('request');
  },
);

server.on('connection', function (socket) {
  console.log('new connection');
});

server.listen(3000);
</code></pre><!--kg-card-end: code--><p>我们创建了一个基于 TLS 的 HTTP 2，说明下为啥不使用 HTTP2 over TCP（即不加密的 HTTP 2）：</p><ul><li>浏览器等客户端无法识别</li><li>Wireshark 无法识别（重点，不方便看明细）</li></ul><p>以下是 Target Server。</p><!--kg-card-begin: code--><pre><code>const http2 = require('http2');
const http = require('http');

var server = http.createServer(async function (req, res) {
  if (req.url === '/batch') {
    await Promise.all(Array(10).fill(1).map(request));
  }
  res.end('ok');
});

server.listen(3001);

const client = http2.connect('https://localhost:3000');
async function request() {
  return new Promise((resolve) =&gt; {
    const req = client.request({ ':path': '/', ':method': 'GET' });
    req.on('data', () =&gt; {});
    req.on('end', resolve);
    req.end();
  });
}
</code></pre><!--kg-card-end: code--><p><code>curl http://localhost:3001/batch -v</code> 进行测试结果：</p><ul><li>TCP 连接只在 Target Server 启动时即建连，且不主动销毁</li><li>批量 10 次请求，复用现有单个 TCP 连接，结果符合预期</li></ul><h2 id="--6">注意事项</h2><p>如果你想要按照上面的示例进行测试，有一些 TLS 带来的调试问题注意事项：</p><ul><li>Provider Server：需要自行生成证书，参考：<a href="https://nodejs.org/api/http2.html#server-side-example">https://nodejs.org/api/http2.html#server-side-example</a></li><li>Provider Server：增加 Node.js 启动参数 <code>node --tls-keylog=/somewhere/ssllogfile.txt provider-server.js</code>，用于 Wireshark</li><li>Target Server：增加环境变量 <code>NODE_TLS_REJECT_UNAUTHORIZED=0 node target-server.js</code>解决自建证书的安全问题</li><li>Wireshark：配置日志文件，用于解析 TLS 层数据包</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fca0fd0178794696b036fb996ceaf53d~tplv-k3u1fbpfcp-zoom-1.image" class="kg-image" alt="聊聊服务间的网络通信 - TCP 与 HTTP"></figure><!--kg-card-end: image--><h1 id="--7">总结</h1><p>文章主要探讨了 TCP 长连接的相关知识。首先通过示例解释了长连接的基本原理和流程，包括 TCP 连接、HTTP 请求、Keep Alive 检查等。然后分析了在手动 curl 触发第三次请求时的问题，说明了因为 TCP 连接只存在5秒，超时后会自动断连。</p><p>接着，给出了如何配置长连接的解决方案，包括客户端和服务端的设置，以及超时时长的调整。同时还讲解了一些与客户端配置相关的参数，如 Agent.maxFreeSockets、Agent.maxSockets 和 Agent.maxTotalSockets 等，并解释了 TCP 连接数的限制和客户端存在限制的原因。</p><p>最后，我们探讨了 HTTP 2 对于微服务架构的可用性，我认为是可以实践的，不过要去掉 TLS ，走 HTTP2 over TCP。</p><p>完，希望对大家有所帮助。</p><h1 id="--8">参考</h1><ul><li><a href="https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B">https://zh.wikipedia.org/wiki/OSI模型</a></li><li><a href="https://www.wireshark.org/docs/wsug_html_chunked/">https://www.wireshark.org/docs/wsug_html_chunked/</a></li><li><a href="https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html">https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html</a></li><li><a href="https://www.geeksforgeeks.org/layers-of-osi-model/">https://www.geeksforgeeks.org/layers-of-osi-model/</a></li><li><a href="https://www.youtube.com/watch?v=o-EkdZW4zbA">https://www.youtube.com/watch?v=o-EkdZW4zbA</a></li><li><a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol">https://en.wikipedia.org/wiki/Transmission_Control_Protocol</a></li><li><a href="https://wiki.wireshark.org/TLS">https://wiki.wireshark.org/TLS</a></li><li><a href="https://gist.github.com/dfrankland/0fec2cd565f1f7b78fb0e3ededf36b89">https://gist.github.com/dfrankland/0fec2cd565f1f7b78fb0e3ededf36b89</a></li><li><a href="https://http2.github.io/faq/">https://http2.github.io/faq/</a></li><li><a href="https://nodejs.org/api/http2.html#server-side-example">https://nodejs.org/api/http2.html#server-side-example</a></li></ul>]]></content:encoded></item><item><title><![CDATA[微信小程序自动化实践]]></title><description><![CDATA[<h1 id="-">前言</h1><p>小程序是一种全新的连接用户与服务的方式，它可以在微信内被便捷地获取和传播，同时具有出色的使用体验。</p><p>现在公司有许多产品通过小程序来进行使用与分享，了解微信小程序的测试常识变得必不可少</p><h1 id="--1">概述</h1><p>本文主要介绍一下小程序测试的基础知识,自动化测试相关的实践</p><p>1.基础部分包含:小程序测试环境搭建、小程序测试基础、测试注意点</p><p>2.自动化测试使用在pytest中以插件的方式封装官方提供的<a href="https://minitest.weixin.qq.com/" rel="nofollow">MiniTest</a>库</p><h1 id="--2">小程序测试环境搭建</h1><h2 id="--3">微信开发者工具</h2><p>在进行小程序测试的时候,有时候会有如下的一些需求</p><ol><li>查看小程序在不同机型上的展示</li><li>查看接口请求与响应</li><li>开发修改后快速验证</li><li>查看js的报错</li><li>分析代码质量\性能情况\主包大小...</li><li>...</li></ol><p>这时候可以使用「微信开发者工具」</p><ol><li>前往官网进行下载IDE</li><li>联系小程序负责人申请小程序的开发者权限</li><li>打包小程序</li><li>使用微信开发者工具打开小程序打包产物</li></ol><h1 id="--4">小程序测试基础知识</h1><h2 id="--5">渲染层和逻辑层</h2><p>小程序的渲染层和逻辑层分别由2个线程管理：</p><ul><li>渲染层的界面使用了WebView 进行渲染；</li><li>逻辑层采用 JsCore 线程运行 JS 脚本。</li></ul><p>一个小程序存在多个界面，所以渲染层存在多个 WebView 线程</p><p>这两个线程的通信会经由微信客户端（</p>]]></description><link>https://tech.kujiale.com/wei-xin-xiao-cheng-xu-zi-dong-hua-shi-jian/</link><guid isPermaLink="false">646ae88b547f700001a013df</guid><category><![CDATA[测试]]></category><dc:creator><![CDATA[炬尧]]></dc:creator><pubDate>Mon, 22 May 2023 04:18:21 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/05/------_16843914209751.png" medium="image"/><content:encoded><![CDATA[<h1 id="-">前言</h1><img src="https://tech.kujiale.com/content/images/2023/05/------_16843914209751.png" alt="微信小程序自动化实践"><p>小程序是一种全新的连接用户与服务的方式，它可以在微信内被便捷地获取和传播，同时具有出色的使用体验。</p><p>现在公司有许多产品通过小程序来进行使用与分享，了解微信小程序的测试常识变得必不可少</p><h1 id="--1">概述</h1><p>本文主要介绍一下小程序测试的基础知识,自动化测试相关的实践</p><p>1.基础部分包含:小程序测试环境搭建、小程序测试基础、测试注意点</p><p>2.自动化测试使用在pytest中以插件的方式封装官方提供的<a href="https://minitest.weixin.qq.com/" rel="nofollow">MiniTest</a>库</p><h1 id="--2">小程序测试环境搭建</h1><h2 id="--3">微信开发者工具</h2><p>在进行小程序测试的时候,有时候会有如下的一些需求</p><ol><li>查看小程序在不同机型上的展示</li><li>查看接口请求与响应</li><li>开发修改后快速验证</li><li>查看js的报错</li><li>分析代码质量\性能情况\主包大小...</li><li>...</li></ol><p>这时候可以使用「微信开发者工具」</p><ol><li>前往官网进行下载IDE</li><li>联系小程序负责人申请小程序的开发者权限</li><li>打包小程序</li><li>使用微信开发者工具打开小程序打包产物</li></ol><h1 id="--4">小程序测试基础知识</h1><h2 id="--5">渲染层和逻辑层</h2><p>小程序的渲染层和逻辑层分别由2个线程管理：</p><ul><li>渲染层的界面使用了WebView 进行渲染；</li><li>逻辑层采用 JsCore 线程运行 JS 脚本。</li></ul><p>一个小程序存在多个界面，所以渲染层存在多个 WebView 线程</p><p>这两个线程的通信会经由微信客户端（ Native ）做中转，逻辑层发送网络请求也经由 Native 转发。</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-13.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h2 id="--6">小程序不同版本</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-14.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>不同版本的入口</p><ul><li>开发版:使用「微信开发者工具」预览,二维码有效期30分钟</li></ul><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-2_10-44-29--2-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>体验版:酷家乐小程序平台-对应的小程序-版本管理,二维码固定不变,永久有效</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-2_10-47-47--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>正式版:微信中直接搜索</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-21.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>在使用开发版或者体验版进行测试的时候需要开启调试模式</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-22.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-23.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>如果不开启调试会出现</p><p>1.无法访问没在小程序后台配置的域名    会提示表现为「获取失败,请检查网络链接」</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-24.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>2.无法查看调试信息</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-26.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>公司内部平台上可以进行环境切换</p><p>修改env变量切换线上或线下等环境</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-27.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h2 id="--7">启动机制</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://res.wx.qq.com/wxdoc/dist/assets/img/life-cycle.5558d9eb.svg" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p><strong>为了保证⼩程序的快速访问和⽤户体验，微信会缓存整个⼩程序</strong>，包括⼩程序⽂件、授权数据、登录数据等等。因此⽤⼩程序常碰到缓存问题，例如切换环境（线上线下互切）、发布、登陆等有时候会发⽣数据切换不过来的场景，为了避免⼀些不必要的缓存问题，简单粗暴的⽅法就是，将⼩程序删掉重新进⼊。</p><ul><li>冷启动:用户首次打开，或小程序销毁后被用户再次打开，此时小程序需要重新加载启动，即冷启动。</li><li>热启动:用户已经打开过某小程序，然后在一定时间内再次打开该小程序，此时小程序并未被销毁，只是从后台状态进入前台状态，这个过程就是热启动。</li></ul><h2 id="--8">访问外部网页限制和公众号文章限制</h2><p>很多小程序中会内嵌H5页面</p><p>在非正式版的时候可以选择「不校验合法域名、web-view(业务域名）、TLS 版本以及 HTTPS 证书」来进行测试,但是到了正式版本后需要将外部链接加入到白名单</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-29.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-2_11-3-41--2-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-31.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>小程序内关联的文章也是有限制，必须是当前小程序关联的公众号</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-32.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h2 id="--9">程序包限制</h2><p>目前小程序分包大小有以下限制：</p><ul><li>整个小程序所有分包大小不超过 20M；</li><li>单个分包/主包大小不能超过 2M。</li></ul><p>开发者工具中如何查看分包大小</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-2_11-2-53--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-2_11-3-15--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h2 id="--10">性能数据</h2><p>在「微信开发者工具」中的调试器中的「Show console drawer」中点击「Task」即可看到实时的性能数据了</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-36.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h2 id="mock-">Mock数据</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-4_15-5-5--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>有一个获取客户列表的接口:<a href="https://beta.kujiale.com/kuaida/intelligent/match/customer/pagelist" rel="nofollow">https://beta.kujiale.com/kuaida/intelligent/match/customer/pagelist</a></p><p>现在需要修改它的返回值</p><h3 id="--11"><strong>准备数据</strong></h3><p>数据格式为:</p><!--kg-card-begin: markdown--><p>{<br>
&quot;data&quot;: &quot;&quot;,<br>
&quot;statusCode&quot;: &quot;&quot;,<br>
&quot;header&quot;: &quot;&quot;<br>
}</p>
<!--kg-card-end: markdown--><p>这次mock后让它就返回一个客户的信息</p><!--kg-card-begin: markdown--><p>{&quot;c&quot;:&quot;0&quot;,&quot;m&quot;:&quot;&quot;,&quot;d&quot;:{&quot;pageIndex&quot;:1,&quot;pageSize&quot;:20,&quot;rowTotal&quot;:1,&quot;pageTotal&quot;:1,&quot;data&quot;:[{&quot;obsCustomerId&quot;:&quot;3FO4K4VYBUKQ&quot;,&quot;customerName&quot;:&quot;听白&quot;,&quot;customerPhone&quot;:&quot;&quot;,&quot;designNames&quot;:null}]},&quot;f&quot;:null}</p>
<!--kg-card-end: markdown--><p>合并一下</p><!--kg-card-begin: markdown--><p>{<br>
&quot;data&quot;: {&quot;c&quot;:&quot;0&quot;,&quot;m&quot;:&quot;&quot;,&quot;d&quot;:{&quot;pageIndex&quot;:1,&quot;pageSize&quot;:20,&quot;rowTotal&quot;:1,&quot;pageTotal&quot;:1,&quot;data&quot;:[{&quot;obsCustomerId&quot;:&quot;3FO4K4VYBUKQ&quot;,&quot;customerName&quot;:&quot;听白&quot;,&quot;customerPhone&quot;:&quot;&quot;,&quot;designNames&quot;:null}]},&quot;f&quot;:null},<br>
&quot;statusCode&quot;: 200,<br>
&quot;header&quot;: &quot;&quot;<br>
}</p>
<!--kg-card-end: markdown--><h3 id="--12"><strong>匹配接口</strong></h3><p>使用正则的方式匹配的接口为<code>https:\/\/beta.kujiale.com\/kuaida\/intelligent\/match\/customer\/pagelist</code></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-4_15-7-40--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h3 id="--13"><strong>测试</strong></h3><p>刷新一下页面进行测试,查看是否mock成功</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-4_15-9-12--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>修改一下响应的内容</p><!--kg-card-begin: markdown--><p>{<br>
&quot;obsCustomerId&quot;: &quot;3FO4K4VYBUKQ&quot;,<br>
&quot;customerName&quot;: &quot;听白1111111111111111111111111111111111111&quot;,<br>
&quot;customerPhone&quot;: &quot;123&quot;,<br>
&quot;designNames&quot;: null<br>
}</p>
<!--kg-card-end: markdown--><p>查看效果</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2022-12-4_15-9-46--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h1 id="--14">测试注意点</h1><h2 id="--15">免登录场景</h2><p>分享出去的⻚⾯，这个链接⼀般是免登录的，需要使⽤完全没有登录过的⼿机或者清理干净缓存再去验证</p><h2 id="--16">右上角操作</h2><p>右上⻆开放出了哪些功能，我们都需要验证⼀边，确保正常。</p><p>特别是浮窗切换，前台后台切换的时候，容易出现⻚⾯错乱或者⽩屏的现象</p><h2 id="--17">支付功能</h2><ul><li>微信支付</li><li>二维码支付</li><li>第三方支付</li></ul><p>需要测试各个支付方式都能正常唤起并支付</p><h2 id="--18">缓存</h2><p>⼩程序为了快速流畅的⽤户体验缓存了整个⼩程序，⼏乎每个⻚⾯都会存在⼤量的缓存.</p><p>我们需要明确哪些我们需要缓存，哪些⽆需缓存，注意⻚⾯切换或者账号切换时数据的正确性。</p><h2 id="--19">入口有效性</h2><ul><li>可以通过「发现」模块下的「⼩程序」中的搜索框搜索到对应的⼩程序；</li><li>可以通过「附近的⼩程序」找到⼩程序；</li><li>已打开过的⼩程序，还可以通过微信聊天⻚⾯的下拉框找到⼩程序；</li><li>分享链接可正常打开⼩程序；</li><li>⼩程序码扫描可正常打开⼩程序；</li><li>删除⼩程序后重新发现正常可正常进⼊。</li></ul><h2 id="--20">兼容性</h2><h3 id="--21"><strong>操作系统兼容性</strong></h3><p>不同运行环境下，脚本执行环境以及用于组件渲染的环境是不同的，性能表现也存在差异：</p><ul><li>在 iOS、iPadOS 和 Mac OS 上，小程序逻辑层的 JavaScript 代码运行在 JavaScriptCore 中，视图层是由 WKWebView 来渲染的，环境有 iOS 14、iPad OS 14、Mac OS 11.4 等；</li><li>在 Android 上，小程序逻辑层的 JavaScript 代码运行在 <a href="https://developers.google.com/v8/" rel="nofollow">V8</a> 中，视图层是由基于 Mobile Chromium 内核的微信自研 XWeb 引擎来渲染的；</li><li>在 Windows 上，小程序逻辑层 JavaScript 和视图层都是用 Chromium 内核；</li><li>在 开发工具上，小程序逻辑层的 JavaScript 代码是运行在 <a href="https://nwjs.io/" rel="nofollow">NW.js</a> 中，视图层是由 Chromium Webview 来渲染的。</li></ul><p>JavaScriptCore 无法开启 JIT 编译 (Just-In-Time Compiler)，同等条件下的运行性能要明显低于其他平台。</p><h3 id="--22"><strong>机型兼容性</strong></h3><p>主要是屏幕的适配</p><p>微信小程序定义了一个新的尺寸单位 <code>rpx</code>(responsive pixel) 可以适配不同尺寸的屏幕，在页面上定义对象的单位是 <code>rpx</code> 就可以在不同的屏幕上适配。</p><p>部分机型会出现边框缺失:<a href="https://developers.weixin.qq.com/community/develop/article/doc/000c289924cb28a714ba9fc4451413" rel="nofollow">小程序1rpx边框不完美解决方案</a></p><h3 id="--23"><strong>微信版本兼容性</strong></h3><p><a href="https://developers.weixin.qq.com/miniprogram/dev/framework/client-lib/" rel="nofollow">基础库</a></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-41.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>为了避免新版本的基础库给线上小程序带来未知的影响，微信客户端都是携带 <strong>上一个稳定版</strong> 的基础库发布的。</p><p>小程序的能力需要微信客户端来支撑，每一个基础库都只能在对应的客户端版本上运行，高版本的基础库无法兼容低版本的微信客户端。</p><p>有条件可以切换多个版本的微信来进行测试</p><h3 id="--24"><strong>交叉事件</strong></h3><ul><li>与微信的交叉事件:微信视频,语言通话等打断小程序操作</li><li>与手机的交叉事件:手机电话,闹钟,文件接收等打断小程序操作</li></ul><p>小程序不会阻止交叉事件的发生(不会打不进电话等)</p><p>查看小程序会不会出现中断,白屏,卡死,闪退等问题</p><h3 id="--25"><strong>网络</strong></h3><ol><li>测试3G、4G、5G、wifi 网络下应用运行的速度。</li><li>网络不好时，提交数据是否一直处理提交中，是否会有延迟，数据交换失败是否会有提醒。</li><li>有网到无网再到有网环境时，数据是否可以自动恢复，能正常加载。</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-42.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h1 id="--26">自动化测试</h1><h2 id="pytest-mini">pytest-mini</h2><p><a href="https://pypi.org/project/pytest-mini/" rel="nofollow">https://pypi.org/project/pytest-mini/</a></p><p>该项目基于<a href="https://minitest.weixin.qq.com/" rel="nofollow">MiniTest</a>进行pytest改造</p><p>在保留原有特性的情况下,可以使用pytest来进行代码编写,提高编写效率</p><h3 id="--27"><strong>安装</strong></h3><p>pip install pytest-mini --upgrade</p><h3 id="--28"><strong>项目结构</strong></h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-43.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h3 id="-components_page-py"><strong>页面元素:components_page.py</strong></h3><!--kg-card-begin: markdown--><p>from pytest_mini import Mini, Locator</p>
<p>class ComponentsPage(Mini):<br>
view_container = Locator('view', inner_text='视图容器', desc='组件页-视图容器')</p>
<!--kg-card-end: markdown--><h3 id="-conftest-py"><strong>前置条件:conftest.py</strong></h3><!--kg-card-begin: markdown--><p>import pytest</p>
<p>from pytest_mini import plugins<br>
from demo.pages import ComponentsPage</p>
<p>pytest_plugins = plugins(<br>
&quot;/Users/zhongxin/github/miniprogram-demo&quot;,  # 待测试的小程序项目路径<br>
&quot;/Applications/wechatwebdevtools.app/Contents/MacOS/cli&quot;  # 微信开发者工具路径<br>
)</p>
<p>@pytest.fixture(scope=&quot;session&quot;)<br>
def components_page(mini):<br>
yield ComponentsPage(driver=mini.driver)</p>
<!--kg-card-end: markdown--><h3 id="-test_home-py"><strong>测试代码:test_home.py</strong></h3><!--kg-card-begin: markdown--><p>import allure</p>
<p>from pytest_mini import compose</p>
<p>@compose(feature=&quot;小程序官方组件展示&quot;, story=&quot;组件&quot;, title='容器视图操作')<br>
def test_view_container(components_page):<br>
with allure.step(&quot;点击容器视图&quot;):<br>
components_page.click(components_page.view_container)<br>
assert False, &quot;故意失败,查看报告截图&quot;</p>
<!--kg-card-end: markdown--><h3 id="demo-"><strong>demo测试结果</strong></h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-47.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h3 id="--29"><strong>真实项目测试结果</strong></h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2023-4-21_16-4-39--1--1.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><p>查看网络请求信息</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image2023-4-21_16-4-54--1-.png" class="kg-image" alt="微信小程序自动化实践"></figure><!--kg-card-end: image--><h1 id="--30">相关文档</h1><p><a href="https://developers.weixin.qq.com/miniprogram/dev/framework/" rel="nofollow">微信官方文档-小程序</a></p>]]></content:encoded></item><item><title><![CDATA[测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！]]></title><description><![CDATA[<p>​</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/351b4ab7-6882-411d-87f3-09a39b7f77ee.jpg" class="kg-image"></figure><!--kg-card-end: image--><p>疫情至今，TesterHome社区已经有3年多没有举办线下沙龙了，目下花开正艳，TesterHome也将陆续恢复线下沙龙活动~</p><p>本次由<strong>酷家乐与TesterHome社区联合主办</strong>的【流量回放】主题技术沙龙，邀约大家共探：<strong>流量回放在质量保障中的技术实践</strong>。</p><p>鲜衣怒马少年时，不负韶华行且知。期待和各位对流量回放感兴趣的朋友们一起相约6月，共品一场质量保障的技术盛宴！</p><h1 id="-"><strong>酷家乐简介</strong></h1><p>酷家乐是一家面向未来的大家居全案设计平台及生态解决方案提供商，致力于为数字化升级提供一站式的解决方案。平台以设计为入口，链接大家居行业生态，为家居企业提供设计、营销、生产、管理、供应链等场景的解决方案和服务，助力全行业实现 “所见即所得” 的愿景。</p><h1 id="--1"><strong>沙龙安排</strong></h1><p><strong>日程安排：2023年6月3日下午</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-2.png" class="kg-image"></figure><!--kg-card-end: image--><p><strong>活动地点：</strong>杭州市拱墅区余杭塘路515号矩阵国际中心2号楼13楼  酷家乐</p><h1 id="--2"><strong>议题及讲师介绍</strong></h1><h3 id="--3"><strong>议题一：流量回放在酷家乐的实践</strong></h3><p><strong>讲师介绍：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-12.png" class="kg-image"></figure><!--kg-card-end: image--><p>方胜军（花名：罗曼），测试开发专家，先后就职于新浪、51信用卡、酷家乐等公司，现为酷家乐大用户平台测试负责人，酷家乐流量回放平台负责人。</p><p><strong>议题介绍：</strong></p><p>流量回放是提升回归效率和质量的一种有效手段。酷家乐在实践流量回放能力的过程中，</p>]]></description><link>https://tech.kujiale.com/ce-shi-zhi-mei-liu-liang-hui-fang-zhu-ti-xian-xia-ji-zhu-sha-long-6yue-hang-zhou-ju-xing-yi-kai-qi-bao-ming/</link><guid isPermaLink="false">64562513547f700001a013a4</guid><dc:creator><![CDATA[炬尧]]></dc:creator><pubDate>Sat, 06 May 2023 10:07:11 GMT</pubDate><media:content url="https://tech.kujiale.com/content/images/2023/05/------_16833598282270.png" medium="image"/><content:encoded><![CDATA[<img src="https://tech.kujiale.com/content/images/2023/05/------_16833598282270.png" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"><p>​</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/351b4ab7-6882-411d-87f3-09a39b7f77ee.jpg" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p>疫情至今，TesterHome社区已经有3年多没有举办线下沙龙了，目下花开正艳，TesterHome也将陆续恢复线下沙龙活动~</p><p>本次由<strong>酷家乐与TesterHome社区联合主办</strong>的【流量回放】主题技术沙龙，邀约大家共探：<strong>流量回放在质量保障中的技术实践</strong>。</p><p>鲜衣怒马少年时，不负韶华行且知。期待和各位对流量回放感兴趣的朋友们一起相约6月，共品一场质量保障的技术盛宴！</p><h1 id="-"><strong>酷家乐简介</strong></h1><p>酷家乐是一家面向未来的大家居全案设计平台及生态解决方案提供商，致力于为数字化升级提供一站式的解决方案。平台以设计为入口，链接大家居行业生态，为家居企业提供设计、营销、生产、管理、供应链等场景的解决方案和服务，助力全行业实现 “所见即所得” 的愿景。</p><h1 id="--1"><strong>沙龙安排</strong></h1><p><strong>日程安排：2023年6月3日下午</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-2.png" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p><strong>活动地点：</strong>杭州市拱墅区余杭塘路515号矩阵国际中心2号楼13楼  酷家乐</p><h1 id="--2"><strong>议题及讲师介绍</strong></h1><h3 id="--3"><strong>议题一：流量回放在酷家乐的实践</strong></h3><p><strong>讲师介绍：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-12.png" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p>方胜军（花名：罗曼），测试开发专家，先后就职于新浪、51信用卡、酷家乐等公司，现为酷家乐大用户平台测试负责人，酷家乐流量回放平台负责人。</p><p><strong>议题介绍：</strong></p><p>流量回放是提升回归效率和质量的一种有效手段。酷家乐在实践流量回放能力的过程中，经历了基于 goreplay+diffy 的 kudiffy 平台到基于 jvm-sandbox-repeater 的 kurepeater 平台。</p><p>那这两种技术在流量回放方面各有什么优缺点？</p><p>它们的实现原理有什么区别？</p><p>基于 jvm-sandbox-repeater 的流量回放平台如何搭建？</p><p>常见的坑和解决之道有哪些？</p><p>平台的流量除了用于回放还有哪些较好的使用场景实践？</p><p>这些都将在这个议题中一一介绍。</p><h3 id="--4"><strong>议题二：得物流量录制回放落地实践</strong></h3><p><strong>讲师介绍：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-11.png" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p>周官宝，资深后端开发工程师，先后在美团、喜马拉雅从事后端研发工作，目前在得物从事后端开发工作，主要负责流量回放。</p><p><strong>议题简介：</strong></p><p>1.流量录制回放如何在得物落地及最佳实践</p><p>2.演进过程中遇到的难题</p><p>3.沙箱挂载、录制等的稳定性</p><p><strong>议题大纲：</strong></p><p>1.平台成果</p><p>2.预发布 mock 回放</p><p>3.线下 mock 回放</p><p>4.稳定性</p><p>5.展望</p><h3 id="--5"><strong>议题三：移动端录制回放实践</strong></h3><p><strong>讲师介绍：</strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-8.png" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p>李嘉华，阿里云EMAS技术专家，拥有长期的自动化测试工具研发、实施经验。</p><p><strong>议题简介：</strong></p><p>EMAS 移动测试为移动应用提供一站式的兼容、功能、性能测试平台。</p><p>这里主要介绍面对各种的应用，如何设计与实现录制回放工具，如各种回放步骤的实现；</p><p>如何提高回放的成功率与稳定性，如提升 wda 的稳定性与兼容性问题；</p><p>以及在生产过程中遇到的一些困难与解决方案。</p><h2 id="--6">报名方式</h2><p>进入百格进行报名：https://www.bagevent.com/event/8353186</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://tech.kujiale.com/content/images/2023/05/image-4.png" class="kg-image" alt="测试之美 | 流量回放主题线下技术沙龙，6月杭州举行，已开启报名！"></figure><!--kg-card-end: image--><p></p><h2 id="--7">活动说明</h2><p>1.报名沙龙收取的费用，将用于线下沙龙的茶点等。</p><p>2.报名后，会创建微信群邀请参会同学，若有更新消息也会通过群通知大家。</p><p>3.参加沙龙同学有机会获得由TesterHome社区提供的MTSC2023上海站大会门票、咖啡杯、T恤。</p><p></p>]]></content:encoded></item></channel></rss>