web开发架构设计
2015-07-31 13:10:38
一, web服务器
.负载均衡
.不做对URL的rewrite逻辑判断, 全部转发到代码服务器的单一入口文件, 由代码去全权处理
二, 代码服务器(常跟web服务器在一台机器上)
.单一入口, 在入口处准备好基本数据(userinfo, 数据库配置, 缓存配置, 云服务配置, 当前URL, 请求参数(模块名, controller, action, view...), 登录URL, 退出URL...全局变量 ), 不再后续重复去查询
.服务化/微服务, 用户/会员管理系统, 支付系统, 论坛系统, 全文搜索服务等等, 都可单独部署
.数据库表名, 缓存前缀名, 全局变量参数等等在统一的文件里管理, 方便协同开发
.每台机器启用多个实例(PHP用php-fpm去管理, 或者启用多个PHP-fpm, 通过监听不同的端口,或者, 使用不通的配置文件来启动多个实例)
三, 数据库服务器
.底层数据字段尽可能的分散, 因为整合容易, 拆分麻烦, 可以通过视图等方式合并显示给业务逻辑层
.门户型/垂直型的网站, 其各个子行业站如果不交叉关联就可以做成分散的
.例如, 医药和金融的数据会很不一样, 可以分开建库和表; 鞋子和衣服的数据(尺码, 适用季节等)有交叉, 但分类明确; 机械工具类垂直网站, 机床可以制造其他所有工具, 其他工具有可以组装成另外的工具, 其数据属性比较类似(尺寸, 口径, 功率.....), 分类比较模糊, 搜索时不宜通过关键词区分, 可以考虑整合到一个库中.... 具体的还得根据业务来
.主从到集群, 做成中间件, 对代码访问透明
.惰性事务, 代码层面处理, 失败了循环再尝试, 而不是回滚
.代码层面宁可select_in 多几次查询(每个结果集之间用某个id关联), 也不要去join查询, join语句肯定会根据业务场景的不通去if_else组装而成, 很难维护, 查询很慢
.不要用外键, 系统的运行100%的时间都是在不断维护升级, 添加外键是给自己找麻烦, 线下测试不方便, 后来的人不愿意去维护改善.....
.每个表有一个同一的自增的字段叫id, 设计数据库的时间久了就明白了
.SQL语句中不要使用MySQL函数, 主要是为了效率和可读, 这样可以将逻辑计算分摊给PHP甚至js, 给系统减压
.最重要的, 也最容易忘记的, 索引!!!
四, 缓存服务器
.redis(sentinel)/memcache 做成对代码透明的中间件, PHP只管read/write, 不用区分是master/slave
.按照业务逻辑划分, 按照哈希结果(直接用户名hash, 如果userid可传递, 直接按照userid去hash到不同的机器上分担压力也可以)....每个单独的业务都必须有主从
五, 全文检索服务器
.sphinx/coreseek
.xunsearch
六, 自动化部署
.docker
.后端前端公用开发用代码测试机, 数据库测试机, 定期同步线上数据
.预发布机, 除了不被负载均衡找到外, 跟线上代码服务器无区别, 可以被开发人员访问, 保存最近几次正确的代码版本, 用于发错回退(非SVN回退)
.服务化/微服务, 单元部署不依赖
七, 压力测试
.Locust
.查找代码层面的瓶颈, 为添加机器做参考
.话外, 一定工作年限的程序员, 代码效率都差不多, 主要跟业务有关系, 能加机器(花钱)去解决的问题,最好不要绞尽脑汁去优化程序浪费时间
八, 本地开发
.docker或虚拟机给开发人员创建模拟线上的开发环境, 本地通过ssh/samba去开发虚拟机上的代码: 避免过多线上线下差异, 开发者电脑很轻, 只用安装写代码的IDE
.配置文件里不要用IP指向数据库和缓存等服务器, 要用域名, 保证线上线下的配置文件不会差异太大, 方便代码部署, 由运维的同学在相应的服务器端做ip解析
.本地开发机的nginx根目录(单一入口)指向index_dev.php里边加载线下的配置文件, 线上的nginx/Apache指向index.php这个里边加载线上的配置
.框架支持前后端分离开发
.开发机也搭一个简单的test站点, 用来测试一些程序用, md5, urlencode, time(), date(), getUserInfo(); decodeToken(); json.....
九, SVN/GIT 版本控制服务器
.master版本库+slave版本库, 开发者提交合并到slave上, 由管理员再合并提交到master版本库中(大型开发)
十, VPN
.查资料, 在家办公
十一, 集群监控
.ganglia
十二, 人员配置
.不要跟下属争利
.不要耍权利制衡的小聪明
.不要过分拆分业务给不同的开发去做, 要每个人掌握一条业务的始终(前端数据提供, 数据逻辑处理, 后台管理), 有归属感, 有成就感, 各种更快更长久
.前后端开发分开, 在自己擅长的战场工作, 整体推进效率更高
. 运维人员, 开发人员, DBA, 测试, 架构......
十三, 业务
.引流业务: 资讯, 论坛, 活动...
.变现业务: 广告, 游戏, 彩票, 电子商务...
十四, 队列服务器
.异步记录日志
.统计
.缓解并发
十五, 及时通讯/聊天服务器
.推送系统
.客服系统
十六, 服务降级
十七, 静态文件服务器
.js/css/icon
web开发架构设计的更多相关文章
- 关于Django Web应用架构设计开发的几个问题
1.关于分层,做过传统JEE应用的同学肯定知道JEE应用会分很多个设计层.根据传统Web应用架构设计一般从上到下分这么几个层(太懒了,不画图了):Web前端层.Web后端交互层.业务层.基础数据设施层 ...
- Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)
Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔) Louis Rosenfeld(路易斯·罗森菲尔德) ...
- 基于asp.net的Web开发架构探索
问题由来 最近在研究适合团队开发的web架构解决方案,该架构即要适合分工协作又要有一定扩展性,适合不同的数据库需要,因此我查阅了一些资料,初步构想出了一套架构,请各位多多指教. 探索 web开发架构最 ...
- 全 Javascript 的 Web 开发架构:MEAN
http://developer.51cto.com/art/201404/434759.htm 全 Javascript 的 Web 开发架构:MEAN 引言 最近在Angular社区的原型开发者间 ...
- 前后端分离之Web前端架构设计
架构设计:前后端分离之Web前端架构设计 在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分 ...
- 大型 web 前端架构设计-面向抽象编程入门
https://mp.weixin.qq.com/s/GG6AtBz6KgNwplpaNXfggQ 大型 web 前端架构设计-面向抽象编程入门 曾探 腾讯技术工程 2021-01-04 依赖反转 ...
- Web信息架构:设计大型网站(第3版) [美]Peter Morville 中文PDF扫描版
新版Web信息架构设计大型网站针对新技术做了全面更新——搭配新颖范例.全新场景及最佳实践信息——但是,其焦点依然放在基础原理上.其结构严谨,图文并貌,内容涵盖了信息架构基本原理和实践应用的方方面面. ...
- Web开发与设计之Google兵器谱-Web开发与设计利器
Web开发与设计之Google兵器谱-Web开发与设计利器 博客分类: Java综合 WebGoogleAjaxChromeGWT 笔者是个Java爱好者也是用Java进行web开发的工作者.平时笔者 ...
- 架构设计:前后端分离之Web前端架构设计
在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分离的一种具体实现方案,该方案和我原来设想有 ...
随机推荐
- 通过CSS实现的html背景色渐变
实现代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- Oracle的DBMS_OUTPUT.PUT_LINE用法及脚本批处理方法
打印至控制台(无显示): BEGIN DBMS_OUTPUT.PUT_LINE('Hey look, ma!'); END; / 打印至控制台(有显示): SET SERVEROUTPUT ON BE ...
- c语言中time相关函数
工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...
- primefaces4.0基本教程以及增删改查
最近试着用了用primefaces4.0,准备写一个基本的增删改查以及分页程序,但在写的过程中发现了很多问题,本想通过百度.谷歌解决,但无奈中文资料非常少,笔者在坑中不停的打滚,终于完成了一个有着基本 ...
- jquery中的$("#id")与document.getElementById("id")的区别
以前一直认为jquery中的$("#id")和document.getElementByIdx_x("id")得到的效果是一样的,今天做特效的时候才发现并不是这 ...
- css1-css3的那些模糊点
css很重要, 但也不是万能的, 也不能抛弃dom 元素和 元素的属性!! 很多时候, dom "元素" 的 "属性" 也很重要 也很实用! 要结合属性来写 包 ...
- 如何让图片在垂直方向与 div的底部对齐 水平居中
需要图片的绝对定位postion: absolute. 一般定位时, 是用div去定位. 一般不直接用 非div去"绝对/相对"定位. 如不直接用 等去定位. 因为这些好像不好定位 ...
- Object&&String学习
Object类 列表项 String类 常用方法 构造方法 public String() public String(byte[] bytes) public String(byte[]bytes, ...
- thinkphp 行为扩展以及插件机制介绍
首先行为扩展这个概念是TP架构的核心组成之一,关于行为的解释我就粗略的概括一下吧:TP在从接受到HTTP请求到最终将视图输出,期间经历的很多步骤,这些步骤大家可以在http://document.th ...
- linq和lanmbda表达式比较解析