C++网络服务迭代开发-模板

需求分析

需求相关内容

系统设计

系统升级方案

系统设计、更改相关内容

测试用例设计

No. case 预期
1
2
3
4 回归测试-点

发布方案

包含灰度、全量发布流程

人力评估

项目 人力
合计

编码开发

grerrit code review地址:

测试结果

功能测试

No. case 预期结果 测试通过(✅ or ❌)
1
2
3 回归测试

性能测试

qps cpu idle 内存 失败率 延时P99 是否通过(✅ or ❌)
实验 50%
基线 50%
实验 30%
基线 30%

稳定性测试

测试项目 qps 内存是否异常增长 是否产生core文件 是否通过(✅ or ❌)
cpu idle 保持50%以下,持续压力测试4小时

特征打分一致性验证

测试项目 是否通过(✅ or ❌)
预发环境验证打分一致性,bdsp任务结果是否通过

上线部署

预发验证

功能验证

性能验证

分类 项目 是否通过
性能 CPU
内存
延时
带宽
服务 失败率
超时率
错误日志
特征大小变化
数据打分 ctr 骤变
cvr 骤变,各类cost type
cvr2 骤变
ecpm
特征一致性监控 观察特征一致性报警

灰度上线并验证

功能验证

性能验证

分类 项目 是否通过
性能 CPU
内存
延时
带宽
服务 失败率
超时率
错误日志
特征大小变化
数据打分 ctr 骤变
cvr 骤变,各类cost type
cvr2 骤变
ecpm
特征一致性监控 观察特征一致性报警

主干上线并验证

功能验证

性能验证

分类 项目 是否通过
性能 CPU
内存
延时
带宽
服务 失败率
超时率
错误日志
特征大小变化
数据打分 ctr 骤变
cvr 骤变,各类cost type
cvr2 骤变
ecpm
特征一致性监控 观察特征一致性报警

Mini Server问题集锦

Nextcloud

更新版本时错误,[version 22.2.x]

Step 4 is currently in process. Please reload this page later

解决方法:

nextcloud路径/data/updater-xxxxxxx文件夹

frp

运行时错误, [verion 0.33、0.37.1 、0.38]

2021/11/16 22:23:50 [E] [control.go:158] [dbf0bbaf2a7be98c] work connection closed before response StartWorkConn message: read tcp 192.168.199.111:59690->xx.xx.xx.x:443: read: connection reset by peer

当天流量太大,网络运营商切断了链接,过一天就好了。

分布式系统讲义(一、什么是分布式系统?)

同学们大家好,今天由我来同大家一起,通过大白话的方式,聊一聊分布式系统的那些事儿。

到今天为止,分布式系统已经是一种非常基础或者说非常通用的一种技术了。在互联网应用的后端服务中,分布式技术几乎无所不在,那么到底什么是分布式系统?我们为什么要用分布式系统?它到底有哪些优势?以及我们今后工作中面临的一些问题,如何通过设计分布式系统,解决这些问题呢。围绕着这些问题,我们在这门课中展开来讨论。

回到这门课的最开始的一个问题,什么是分布式系统?在给出这个定义之前,我们先来看一下一个后端服务的演化过程,拿一个外部网站来举例,最早的时候,它只部署在一台机器上,这一台机器承受的用户的数量是很有限的,一台服务器大概只能承受住300个人同时进行访问,但是用户量会慢慢的变大,从最开始的300到后来的1000人,在到后来的几万人。中国现在大概有接近10个亿的网民,这么1个数量级的用户数,我们这么一台服务器绝对是承受不住的,这个时候应该怎么办?

一般想到的它有两种方法,我们说的第一种方法升级我们的服务器,把我们的服务器从一个性能比较差的变成一个性能比较好的,它数据的存储本来是比如说只有几百g然后把它变成几个t这么一个容量的磁盘放到这个服务器里边去,这样子也能解决问题,但是它只解决了比如说用户数从300到1000这么一个问题,但是我们的用户数如果是几个亿,那个时候怎么办?

我们会有一个第二种方法,就是用几千台机器,然后让几千台机器,然后相互协作,去满足几亿用户的这么一个数量的这么一个访问,所以这个方法基本上已经给出了一个分布式系统的一个雏形了,由此我们其实是可以引出来,那么分布式系统到底是一个什么样的定义。然后出自分布式的概念与设计这么一本书,就是国外的一个经典的用来用来介绍分布式的这么一本经典巨著。

他说分布式系统是指位于联网计算机上的组件,仅通过传递信心进行通信和协调行动的系统。同时他又给了这么一句话叫分布式系统,它是一个即便是已经崩溃了部分机器,但是它仍然能够完成工作这么一个系统。除此听到这么几个定义,大家可能还是感觉比较细。

我来给大家举一个例子,我所在的智能平台部,我所负责的系统就是一个服分布式系统效果广告的预估服务,那么这个预估服务现在有多少台机器,这个事情我给大家说一下,大概是就是说大概是有3000台左右的机器,那么我们的小广告服务大概有3000台机器这么一个数量级的,而且这3000台机器各有分工,相互协作,然后能够满足我们现在广告这么一个业务。

同时它也满足这么一个定义。如果只有一部分机器宕机,那么它仍然能够满足效果广告,预估的工作,而不至于整个服务都不可用。

今天的例子,介绍什么是分布式系统,我们就是到此为止,下节课我们会去探索分布式系统它面临哪些技术挑战。谢谢大家。

算法工程团队的测试方法总结

服务于算法的工程团队的测试需求

测试的目的是为了保证在线服务的可用性、稳定性、正确性、找到并能消除系统的性能瓶颈。

后端服务的测试一般包含下面几个方面:

  • 功能测试
  • 性能测试(压力测试,测试cpu、内存、io)
  • 稳定性测试

除此之外,服务于算法的工程团队有一种特有的测试需求,就是一致性测试,包含如下两项:

  • 特征一致性验证,为了保证在线服务要保证所使用的特征传入
  • 打分一致性验证,在线模型打分与离线打分进行对比,主要为了保证在线模型的准确性。(在其他因素都不变的情况下,通过md5验证一下模型文件也能验证模型文件的准确性)

当前团队的开发特点

  • 使用C++语言开发在线服务,少数服务由python编写
  • 网络框架和协议使用 grpc/brpc/tars+protobuf
  • 微服务化,没有测试工程师,由研发工程师自主把控软件质量
  • 算法工程师和架构工程师,彼此分工协作,架构工程师需要向算法工程师提供简单便捷的测试工具。

因为上面前两点原因,当前团队无法使用当前业界里优秀的开源测试工具或平台,比如JMeter、iago 、Gatling、Grinder、Locust,还有阿里云的性能测试PTS等。因为这些工具或平台仅适用于http协议,无法满足当前团队使用的网络框架和rpc协议。

那行业中有没有其他公司做过类似的工具呢?有的公司在这方面进行了尝试,比如美团技术团队自有一套针对thrift的压测工具,可惜并不开源,参考https://tech.meituan.com/2016/01/08/loading-test.html。

最终团队只能自己开发测试工具。

团队测试开发的几个发展阶段

团队在从0到1开发在线服务过程中的同时,也在搭建团队自己的开发测试工具。工具不停地被完善,其中过程包含了下面3个阶段。

  • 测试脚本、小工具
  • 工具升级,做出流量回放工具、面向模型服务的专用测试工具等
  • 通用的后端压力测试平台

测试脚本、小工具

团队初期是通过编写测试脚本,来构造测试用例。用随机数生成的方式或通过简单的参数样本集合构造请求。

压力测试则是通过编写小工具来进行模拟上游服务的大量请求。

脚本和工具虽然简陋,但满足了项目初期的测试需求。这种测试方法持续了比较长的时间,逐渐发现如下问题:

  • 随机数生成的参数与实际情况差异较大;
  • 随着业务复杂度的提高,请求参数越来越多,参数的组合越来越多,测试脚本变多,无法管理。
  • 自动化程度低,效率不高

流量回放工具

通过拷贝线上少部分流量,落地到文件,在有测试需求时,把文件中的请求发送给待测试的服务。

这种方式存在如下问题:

  • 自动化程度依然较低,效率不高,尤其测试样本的管理
  • 录制的流量容易过时。

专用测试工具

除了流量回放工具,团队也开发了专用的测试工具,比如面向运载算法模型的在线服务。

运载算法模型的在线服务是算法工程团队运维最多的服务,占用服务器达几千台,加载近百个版本的模型。模型频繁的迭代,需要最频繁的测试,测试最多的情况则为特征一致性测试和模型的一致性测试。

专用工具实现了白屏化、可视化,但缺少通用性。不能适用于其他模块,也难以推广给其他团队使用。

通用的压力测试平台

为了解决自动化、可视化、平台化的问题,通用的压力测试工具被提出。如何设计一套通用的压力测试工具呢?

整体流程

通用的压力测试工具的基本流程,即流量的录制和回放。

但除了基本的流量回放,需要满足下面几点。

自动化、白屏化

包含两方面:

  • 流程管理的自动化
  • 流量样本的存储自动化
  • 进程管理自动化

前端管理页面由html+css+js实现;流程、存储、进程的管理的实现由脚本语言,比如python来完成;进程的所需的资源交由K8S调度和管理。

可视化

压测结果通过图表展现,常见的指标有:

  • 最大响应时间、平均响应时间
  • PV、QPS
  • TP50、TP90、TP99
  • 成功数、失败数、成功率

一般由时序数据库和图表展示工具实现,时序数据库可以选择使用Prometheus/indexdb等,图型展示使用grafana等。

也可以使用公司自研的数据采集和展示系统。

平台化

需要满足的需求多租户和组件化。

多租户是为了让压力测试平台供多人使用,也可以做到用户间测试资源进行隔离和共享。

组件化,是为了让通用的压力测试平台更简单地支持更多c++在线服务。具体的的实现方法如下:

  • 平台定义组件的统一接口,建立调用框架。
  • 不同组件依据平台的统一接口,定义自己的接口实现,并编译成为动态链接库。
  • 平台通过加载组件的动态链接库,实现面向不同服务的流量录制与回放。

当前问题总结

专用工具和通用压力测试工具的优劣对比

多个团队各有一套测试工具,统一起来有一定难度

技术随笔

此文内容为未经整理的技术工程碎片。

分布式技术已经非常普及,但是为了提高系统的qps和并发能力,我们为什么优先挖掘机器潜力(提高硬件利用率),而不是优先扩容集群。

原因:

  • 服务器运维费用比电费贵多了。提高硬件利用率,虽然不节省电费,但是省服务器。

架构思想

  • 分层 (垂直分离)
  • 分而治之 (水平分离)
  • 动静分离、冷热分离、读写分离
  • 缓冲区
  • 扩展和复用
  • 总线思想、归一
  • 保持简单

方法论

  • 代码和配置分离

HTTPS技术简介 – 团队分享

背景

苹果曾经发布新闻,到2017年1月1日为止,IOS上所有app只能支持https链接。因此几乎所有在IOS有app和业务的公司,都赶在截止时间升级自己的app和后端系统。

我们公司的广告系统也不例外,也需要升级。正巧2016年12月29号的团队每周技术分享,轮到了我,于是把HTTPS的相关知识简单整理了一下,分享了出来。

PPT 地址如下, 可直接进行下载,无需积分。仓促之作,粗陋难免,哪怕能帮助到1个人,作者心里也是高兴的。

http://www.docin.com/p-1827559135.html

分享思路

  • 团队中大多数人对HTTPS肯定都有所了解,只是可能对HTTPS的技术细节不是很清楚。
  • 分享最开始,先抛出几个问题,吊起大家的好奇心。
  • 其次分享HTTPS安全的原因是什么?如何使用?性能如何?
  • 最后再分享HTTPS的原理,把最难学习的东西放到最后面。
  • 增多听众感性的认识,比如实际抓包演示ssl链接的建立过程。
  • HTTPS 的加密涉及到密码学的内容,尤其是中间人攻击的部分,比较烧脑。又因为分享的时间有限,只能简单提及,不能详细讲解。

分享大纲

  • 抛出几个问题,比如为什么https安全?
  • HTTPS 简介
  • HTTPS 的优点和缺点
  • HTTPS 性能
  • HTTPS 小型网站部署实践
  • HTTPS 大型网站部署实践
  • HTTPS 协议和原理 — TLS 单向认证、双向认证 — TLS 链接建立、加解密过程
  • HTTPS 相关资源分享

分享的具体内容

具体内容在PPT中。

个人对HTTPS的几点认识

HTTPS会成为以后Web传输协议的主流吗?

个人认为会的,尤其是看到苹果对https热衷,https非常可能会成为web传输协议的主流。

我们自己为什么不颁布CA证书

  • 理论上可以,但是自己颁布的证书,被浏览器视为不信任的。而现有CA证书颁布机构都被现在主流浏览器视为信任。

HTTP 升级 HTTPS 会遇到哪些问题

  • 要支持HTTPS,就要全站部署,在HTTPS链接中,任何对http资源的引用都无效,比如图片、css、js等,所以要求引用的资源也要使用https链接。
  • 待补充

结合自己亲身项目,从HTTP升级到HTTPS的过程和方法?

自己负责的项目是广告投放系统,结合自己的经历,总结以下几点注意的地方。

注意时间点

苹果曾宣布2017年1月1号为截止时间。虽然之后宣布延期,但是很多app,已经发布只支持https的新版本。

对广告投放系统来说也要提前升级。

链接的替换

  • 只能在IOS上投放的广告资源中使用https,android不需要。因为运行在android比较旧版本sdk上的app,并不支持https。
  • 链接的替换有两种情况: 1, 直接将http:// 转换为https:// ;2,对于直接转换无效的url,则需要域名映射后进行再进行转换。

后端服务器对HTTPS的支持

  • 广告投放后的打点请求,或者落地页请求,需要回到后端Server,这些后端Server也要支持https。
  • 后端不同服务之间交互可以不使用https链接。

使用Mini PC搭建个人用的NAS/服务器/离线下载

软硬件准备

硬件

  • Mini-ITX机箱
  • Mini-ITX 主板
  • 笔记本内存条 4G
  • Msata 固态硬盘 60G
  • 机械硬盘 500G
  • 拥有公网独立IP的服务器

软件

  • Windows 7
  • Ubuntu Server
  • VirtualBox
  • open-sshd
  • autossh

系统搭建

组装硬件

安装系统

Windows 7

  • 安装windows7是,出现提示框windows安装程序无法将windows配置为在此计算机的硬件上运行

不要关闭对话框,按下shift和f10键。弹出一个cmd,输入cd oobe 回车,再输入msoobe.exe回车,会弹出另一个界面,按照提示进行即可,完成后回到错误弹窗界面单击确定,系统重启。

穿透内网

SSH 反向代理

  • 建立 MiniPC 机器到 Server 的反向代理【MiniPC 机器上操作】

ssh -fCNR 10022:localhost:22 work@server.zuocheng.net

10022 为 server.zuocheng.net 机器上端口,用来与 MiniPC 机器上的22端口绑定。

  • 建立 server.zuocheng.net 机器上的正向代理,用作本地转发。做这一步是因为绑定后的 端口只支持本地访问【server.zuocheng.net 机器上操作】

ssh -fCNL *:8022:localhost:10022' localhost

20022 为本地转发端口,用以和外网通信,并将数据转发到 10022,实现可以从其他机器访问。其中的*表示接受来自任意机器的访问。

  • 现在在 C 机器上可以通过 B 机器 ssh 到 A 机器

ssh -p 8022 work@server.zuocheng.net

SSH 反向代理经常掉线问题解决

  • Mini Server 上生成RSA公私密钥

ssh-keygen

  • 把公钥推送到 远程主机上

ssh-copy-id -i ~/.ssh/id_rsa.pub work@server.zuocheng.net

  • 创建代理通道,并且自动监控通道链接

autossh -M 20021 -NR 20022:localhost:22 work@server.zuocheng.net

  • 设置为开机启动

/bin/su -c '/usr/bin/autossh -M 20021 -NR 20022:localhost:22 work@server.zuocheng.net' - work 放入 /etc/inid.d/autossh

系统管理工具 cockpit

source /etc/os-release
sudo apt install -t ${VERSION_CODENAME}-backports cockpit -y

安装第三方组件,可以参考 https://www.bilibili.com/read/cv20917247

本博客搭建和定制方法

搭建环境

硬件

  • 阿里云服务器

软件

  • LNMP 环境(Linux + PHP + Nginx + Mysql)
  • WordPress

定制本博客的Wordpress 功能

博客主题

Twenty Eleven, 简约风格

博客文本编辑器

使用了WP-Markdown 插件,可惜不支持GitHub 扩展的特性

HTML h3 标题又小又不明显 怎么办?

在主题目录 wp-content/themes/twentyeleven/style.css 中,h3 元素样式添加 font-weight: bold;更改front-size为12px。

h3 {
    font-weight: bold;
    front-size: 12px;
}

添加缓存,提高博客响应速度

WP Super Cache 插件

让列表页只显示文章标题,而不把文章标题页显示出来

修改主题中文件,在 content.php 中,把调用the_content函数的语句注释掉

在文章末尾添加文章签名,如果文章被别的网站扒去,也可以把来源显示出来。

修改主题中文件,content-single.php,

在content-entry 里添加如下代码

转载请注明来源,原地址保持永久更新。
博客首页:作程的技术博客
文章标题:>《
本文链接:>

访问 http://it.zuocheng.net/sitemap.xml 提示错误

把xml 注释去掉,修改aioseop_sitemap.php

//$this->comment_string = __( Sitemap %s generated by All in One SEO Pack %s by Michael Torbert of Semper Fi Web Design on %s, 'all_in_one_seo_pack' );

添加链接 (书签、友情链接等)

在数据库中,把wp_options.link_manager_enabled项设置为1

支持HTTPS

使用了 let’s encrypt 的证书

所使用的插件列表

  • All In One SEO Pack //用于SEO
  • Disable Google Fonts //禁止调用google字体,国内请求慢,不然会降低网站响应速度
  • Google XML Sitemaps //生成xml,SEO
  • Query Monitor //监控,一般情况下禁用
  • Table of Contents Plus //显示文章结构
  • Wordfence Security
  • WP Clean Up
  • WP Super Cache
  • WP-Markdown
  • WP-PostViews
  • WPtouch Mobile Plugin //让博客对移动端友好
  • 多说 //社会化登陆
  • 百度sitemap //百度搜索SEO
  • WP-Statistics //统计,包括来访、IP、展示数等等

更新、安装 直接下载,不使用FTP

修改wp-config.php,添加命令:

define("FS_METHOD","direct"); 
define("FS_CHMOD_DIR", 0777); 
define("FS_CHMOD_FILE", 0777); 

系统优化

使用 Unix domain socket,减小 LAMP 通信代价

Nginx 和 PHP ,PHP 和 Mysql 通信都使用Unix domain socket,并且把套接字文件放到内存文件系统/dev/shm下面

mysqld 有大量sleep进程,占用过多内存。

添加mysqld配置

[mysqld] wait_timeout=120 interactive_timeout=120

统计过滤机器人列表

服务器迁移

数据迁移

把数据表导出
[admin@src]mysqldump -uroot -password BLOG > /tmp/DB.sql
scp 到目标机 scp /tmp/DB.sql target:/tmp
在目标机导入数据库
mysql>use DB; souce /tmp/DB.sql;
配置权限
grant all privileges on DB to user@'%' identified by 'password';
grant all privileges on DB.* to user@'%' identified by 'password';
flush privileges;

BAE Website 配置 app.conf 实现单入口

        Baidu Application Engin 中搭建网站时,如果要使用MVC框架,往往需要设置单入口。然而BAE的web服务程序(apache或者lighthttp)对用户是透明的。开发者不能通过修改配置文件,也不能通过修改.htaccess文件来实现单入口。但BAE在应用的根目录提供了app.conf这个配置文件,通过修改它可以实现重写、设置缓存时间的功能。 下面的这个app.conf,将所有,除文本文件和图片、视频文件等所有请求,都重定向到index.php。 欢迎大家补充~

handlers:
expire : .jpg modify 10 years
expire : .swf modify 10 years
expire : .png modify 10 years
expire : .gif modify 10 years
expire : .JPG modify 10 years
expire : .ico modify 10 years
 url : ^(.*\.js)$
script : /$1
 url : ^(.*\.css)$
script : /$1
 url : ^(.*\.jpg)$
script : /$1
 url : ^(.*\.gif)$
script : /$1
 url : ^(.*\.jpeg)$
script : /$1
 url : ^(.*\.png)$
script : /$1
 url : ^(.*\.bmp)$
script : /$1
 url : ^(.*\.swf)$
script : /$1
 url : ^(.*\.ico)$
script : /$1
 url : ^(.*\.JPG)$
script : /$1
 url : ^(.*\.txt)$
script : /$1
 url : ^(.*)$
script : /index.php