架构类
微服务架构
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于 HTTP 的 Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构造
微服务之前采用 RestFul-Api 进行交互。
微服务的特征与界定
单体应用 vs 微服务架构
- 优点
- 提升开发交流,每个服务足够内聚,足够小,代码容易理解;
- 服务独立测试、部署、升级、发布;
- 按需定制的 DFX,资源利用率,每个服务可以各自进行 x 扩展和 z 扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上;每个服务按
- 需要选择 HA 的模式,选择接受服务的实例个数;
- 容易扩大开发团队,可以针对每个服务(service)组件开发团队;
- 提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪;
- 新技术的应用,系统不会被长期限制在某个技术栈上;
- 缺点
- 没有银弹,微服务提高了系统的复杂度;
- 开发人员要处理分布式系统的复杂性;
- 服务之间的分布式通信问题;
- 服务的注册与发现问题;
- 服务之间的分布式事务问题;
- 数据隔离再来的报表处理问题;
- 服务之间的分布式一致性问题;
- 服务管理的复杂性,服务的编排;
- 不同服务实例的管理。
总的来说,微服务是服务化普及以后带来的高开发成本、协作成本,不断在降低成本、轻量级做改进。
常用技术
Redis
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
- Redis 支持数据的备份,即 master-slave 模式的数据备份。
Redis 优势
- 性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
- 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
- 丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
相关链接
HBase
HBase是一个分布式的、面向列的开源数据库。
HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Nginx
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务.
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Oracle
Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。
它是在数据库领域一直处于领先地位的产品。
可以说 Oracle 数据库系统是目前世界上流行的关系数据库管理系统,
系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。
它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。
mysql
MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL 是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库
WSGI
Web 服务器网关接口(WSGI)已被用作 Python Web 应用程序开发的标准。WSGI 是 Web 服务器和 Web 应用程序之间通用接口的规范。
Werkzeug
它是一个 WSGI 工具包,它实现了请求,响应对象和其他实用函数。这使得能够在其上构建 Web 框架。Flask 框架使用 Werkzeug 作为其基础之一。
Jinga2
Jinja2 是 Python 的一个流行的模板引擎。Web 模板系统将模板与特定数据源组合以呈现动态网页。
Flask 通常被称为微框架。它旨在保持应用程序的核心简单而可扩展。Flask 没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask 支持扩展以向应用程序添加此类功能。一些流行的 Flask 扩展将在本教程后面讨论。
Web 框架
Web 应用程序框架或简单的 Web 框架表示一组库和模块,使 Web 应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。
项目
Python
Python 基本类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
正则表达式: 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配快速检索文本、实现替换文本的操作
**json:**(xml) 轻量级 web 数据交换格式
匿名函数: python 使用 lambda 来创建匿名函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
**映射类 map()**:会根据提供的函数对指定序列做映射,映射的结果可以进行相应的类型转换。
**累积运算函数 reduce()**:会根据提供的运算函数对迭代类型参数中的元素进行累积运算
**过滤类 filter()**:根据提供的判断函数,对迭代类型参数进行过滤,保留使运算函数返回 true 的元素
高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
Flask
Flask 是一个用 Python 编写的 Web 应用程序框架。它由 Armin Ronacher 开发,他领导一个名为 Pocco 的国际 Python 爱好者团体。Flask 基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎。两者都是 Pocco 项目。
基本原理:
- flask 的唯一 URL 原则
- 使用装饰器 route 路由注册 url
- Blueprint 指定 url 前缀
核心知识:
- 支持多种扩展
- Flask-SQLAlchemy 管理数据库
- Flask-Web
- Flask-Email 等等
- 支持全局变量 g.user=user_data
- 支持请求上下文
- 支持全局处理-发送前处理,返回后处理
- 支持自定义错误页面
- 支持网址重定向等
from flask import Blueprint, request, json, abort, current_app, jsonify, session as web_session, g
数据库
sql 型
数据库基本知识 DDL、DQL、DML、DCL,数据库优化经验
- DML(data manipulation language): 它们是 SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这 4 条命令是用来对数据库里的数据进行操作的语言
- DDL(data definition language): DDL 比 DML 要多,主要的命令有 CREATE、ALTER、DROP 等,DDL 主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
- DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke 等)语句。在默认状态下,只有 sysadmin,dbcreator,db_owner 或 db_securityadmin 等人员才有权力执行 DCL
- TCL - Transaction Control Language:事务控制语言,COMMIT - 保存已完成的工作,SAVEPOINT - 在事务中设置保存点,可以回滚到此处,ROLLBACK - 回滚,SET TRANSACTION - 改变事务选项
nosql 型
nosql 和 sql 型区别就是
- sql 型支持事务操作,nosql 不支持事务操作。
- sql 以表结构关联方式存储,nosql 独立存储
- sql 不支持大数据量存储,nosql 支持大数据量存储。
- 等等
数据库优化
优化方法:
- 明确优化目标,了解被优化内容
- 换磁盘阵列升级硬件
- 改写 SQL 脚本添加索引
- 索引优化
- 查询进行优化
- 大表分区
- exists 代替 in
- 中文字段可以考虑建一张字段转换表
- 数据库参数调整优化性能
- 调整数据库架构。
- 行业数据库对比,根据需求甚至可以替换数据库(由于 SqlAlchemy 框架,替换数据库成本低)
参考链接:
软件系统压力测试
基本思路是在有限的资源(包括内存、CPU、磁盘和网络带宽)情况下对软件系统执行负载测试,了解其承载性能,性能指标包括:响应时间、并发用户数、吞吐量、资源利用率。
- 分析应用系统
根据系统个资源的分布与使用情况,明确可能存在的性能瓶颈,例如:数据库操作、网络访问、文件上传下载、数据加工等等
2, 编写测试案例
包括:测试目的、测试环境、测试数据、测试脚本、预期结果。 - 并发测试
使用 ab、siege、locust、jmeter 等压力测试工具对系统执行任务请求等操作。 - 检测系统资源
使用 nmon 等工具,统计测试中各资源使用情况、响应情况。例如:网络阻塞情况、CPU、内存、缓存、磁盘使用情况、数据库数据锁、日志缓冲区等。 - 优化调整
根据测试结果,定位性能瓶颈,优化代码。 - 编写测试报告
- 测试概要、测试环境、测试结果
- 测试结论:给出系统能够支持的上限,如用户并行数、操作数据量等
- 技术总结:记录系统优化方案、方法,以及暂时无法改善或改善无效的场景说明,为后续系统框架改造或技术选型的提供建议。
数据结构
参考链接: 数据结构与算法(一):数据结构
- 线性表:零个或者多个数据元素的有限序列。
- 顺序线性表:使用一段连续的地址存储单元放置线性表的数据元素。
- 链式线性表:线性表的数据元素可以存储在随意的存储单元,每一个节点不仅仅包括数据元素还有一个指向下一个节点的指针(基本的单链表)
- 栈与队列
- 栈:限定在表尾进行插入和删除的线性表。
- 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
- 串:是由零个或多个字符组成的有限序列,又叫字符串。
- 树
- 树:n(n>=0)个结点的有限集。
计算机相关概念
没有银弹
银弹,无论是在技术上或管理上,都不会有任何单一的重大突破,能够保证在生产力、可靠度或简洁性上获得改善,甚至,连一个数量级的改善都不会有.