这一系列的最后一篇写给普通编程人员,如果不感兴趣可直接看本文最后几段。
开始设计代码结构之前,先回顾一下之前准备过的事情:我们有负载均衡的WEB服务器,有主从DB服务器并可能分片,有缓存,有可扩展的存储。在组织代码的各个方面,跟这些准备息息相关,我一二三的列出来分别说,并且每一条都以“前面讲到”这个经典句式开头,为了方便对照。
别着急看经典句式,我思维跳跃了,插一段。实际开发中,我们总会在性能和代码优雅性上作折中。对于当今的计算机和语言解释器,多几层少几层对象调用、声明变量为Map还是HashMap这种问题是最后才需要考虑的问题,永远要考虑系统最慢的部分,从最慢的部分解决。例如看看你用的ORM是不是做了很多你用不到的事情,是不是有重复的数据调用。我们做的是web应用开发,不是底层框架API,代码易读易懂是保证质量很重要的一方面,你的程序是为了什么而设计,有不同的方法……算了,这个话题另起一篇文章来说,扯远了,想交流可关注我的微博 http://t.sina.com.cn/liuzhiyi,咱继续……
前面讲到,WEB服务器是要做负载均衡的,图片服务器是要分开的。对于这点,代码在处理客户端状态时,不要把状态放到单机上,举例,不要用文件session,嗯,常识。如果有可能,最好在一开始就做好用户单点认证的统一接口,包括跨域如何判断状态、静态页面如何判断状态,需要登录时的跳转和返回参数定义,底层给好接口,应用层直接就用(可参考GAE的user服务)。登录方面的设计要考虑移动设备的特性,比如电脑可以用浮动层窗口,但NOKIA自带的浏览器或UCWEB就无法处理这种表现形式,程序一定既能处理AJAX请求又能直接通过URL来处理请求。图片服务器分开,资源文件最好也布局到图片服务器,也就是WEB服务器只服务动态程序。虽然开发测试时稍微复杂(因为需要绝对URI才能访问),但将来页面前端优化上会轻松许多,并且你的WEB服务器IO优化也轻松许多。程序引用资源文件时,要有一个统一的处理方法,在方法内部可以自动完成很多事情,例如将css/js根据组合,拼成一个文件,或者自动在生成的URI后面加上QUERYSTRING,如果将来前端用了缓存服务,那生成QUERYSTRING是最简单的刷新服务端缓存和客户端缓存的办法。
前面讲到,数据库会有复制,可能会多主多从,可能会分片。我们程序在处理数据的过程中,最好能抽象出来单独放做一层。拿现在流行的MVC模式来说,就是在M层下方再放一个数据层,这个数据层不是通常所说的JDBC/PDO/ActiveRecord等,而是你自己的存取数据层,仅对外暴露方法,隐藏数据存取细节。这个数据层内部不要怕写的难看,但一定要提供所有的数据存储功能,其他任何层次不要看到跟数据库打交道的字眼。之所以这样做,是因为在单关系数据库的情况下,可能会SELECT…JOIN…或直接INSERT…INTO…,可你可能会将一些表放到key-value数据库里存储,或者分片,这么做之后原来的语句和方式要全部改变,如果过于分散,则移植时会耗费很大精力,或得到一个很大的Model。在数据层面的设计上,尽量避免JOIN查询,我们可以多做冗余,多做缓存,每种数据尽量只需要一次查询,然后在你的程序里面进行组合。对于比较复杂的数据组合,在实时性要求不高的情况下,可采用异步处理,用户访问时只取处理后的结果。在对于主键的处理上,避免使用自增ID,可以用一定规则生成的唯一值当做主键,这种主键是最简单的分片分布策略。即使用自增ID,也最好用一个自增ID发生器,否则从数据库不小心被写了一下,那主键很容易冲突。
前面讲到,咱数据库前面还有某些缓存挡着。别把mysql的query cache当缓存,应用稍复杂的时候QUERY CACHE反而会成为累赘。缓存跟数据库和业务结合的很紧密,正因为跟业务关系紧密,所以这点没有放之四海而皆准的方法。但我们还是有一些规则可参照。规则一:越接近前端,缓存的颗粒度越大。例如在WEB最前端缓存整个页面,再往后一层缓存部分页面区域,再往后缓存区域内的单条记录。因为越靠近后端,我们的可操作性越灵活,并且变化最多的前端代码也比较方便编写。在实践中,因为产品需求变化速度非常快,迭代周期越来越短,有时很难将Controller和Model分的那么清楚,Controller层面处理部分缓存必不可免,但要保证如果出现这种情况,Controller所操作的缓存一定不要影响其他数据需求方,也就是要保证这个缓存数据只有这一个Controller在用。规则二:没有缓存时程序不能出错。在不考虑缓存失效引发的雪崩效应时,你的程序要有缓存跟没缓存一个样,不能像新浪微博一样,缓存一失效,粉丝微博全空,整个应用都乱套了。在缓存必不可少的情况下,给用户出错信息都比给一个让人误解的信息强。规则三,缓存更新要保证原子性或称作线程安全,特别是采用被动缓存的方式时,很可能两个用户访问时导致同一个缓存被更新,通常情况这不是大问题,可缓存失效后重建时很可能是引发连锁反应的原因之一。规则四:缓存也是有成本的。不只是技术成本,还有人工时间成本。如果一个功能使用缓存和不使用,在可预见的访问量情况下区别微小,但使用缓存会使复杂度增加,那就不用,我们可以加个TODO标注,在下次迭代的时候加上缓存处理。
前面讲到,文件存储是独立的,那么所有的文件操作就都是远程调用。可以在文件服务器上提供一个很简单的RESTful接口,也可以提供xmlrpc或json serveice,WEB服务器端所生成和处理的文件,全部通过接口通知文件服务器去处理,WEB服务器本身不要提供任何文件存储。你会发现很多大网站的上传图片跟保存文章是分两步完成的,就是基于这个原因。
以上几条“前面讲到”,其实无数人都讲过,我也只是结合前几篇文章用自己的话重复了一遍,真正分析起来精髓很简单——除了良好的功能逻辑分层,我们还要为数据库存储、缓存、队列、文件服务等程序外层资源调用单独设计接口,你可以把你的程序想象成是运行在 Amazon EC2 上并用他的所有web service服务,你的数据库就是它的SimpleDB,你的队列就是他的SQS,你的存储就是他的S3,唯一不同是amazon的接口是远程调用,你的是内部调用。
将支撑服务接口化,意味着将MySQL更换到PostgreSQL不需要更改业务处理程序,移植团队甚至不需要跟业务开发团队过多沟通;意味着业务开发团队是对接口编程而不是对数据库编程;意味着不会因为某个业务开发人员的失误而拖垮性能。
对程序扫盲不感兴趣的直接看这里——
产品设计完了,程序框架搭完了,可能有矛盾在这个节骨眼儿产生了。不断有产品设计抱怨说他的创意没实现到预期效果,有程序员抱怨说产品设计不切实际。这种抱怨多缘于产品人员不懂技术,技术人员不理解产品。从广义上来讲,产品包含市场策略、营销手段、功能设计,产品和技术在争论时往往把焦点放在功能上,而实际重点是,实现这个功能所消耗的成本跟能这个功能带来的利益能否换算,能否取其轻重。若可以,争议解决。若不能,则抛硬币看运气。因为一个功能的加强而引发指标井喷,或因项目拖延而导致贻误战机的例子比比皆是。激进的决策者注重利益,保守的决策者注重损失,聪明的决策者会考虑这个问题是否真的那么严重。
关系到未来的事情谁都说不准,要不怎么说创业一半靠运气呢。不过总有能说的准的事情,那就得靠数据说话。
没有100%也有99.9%的网站安装了访问统计代码,连我的 http://zhiyi.us 也不例外,新闻联播也总说科学决策科学发展的。有了统计,能确定的事情就很多了。例如,可以根据来源-目标转化率来分析哪类渠道的人均获取成本低,根据来源-内容访问猜测用户跳出率原因,根据用户点击行为判断链接位置是否合理等。将数据以不同方式组合起来,找到内在联系,分析内因外因,制定对应策略,减少拍脑门决策。靠数据支撑运营是个非常专业的事情,虽然不懂深奥的数学模型不会复杂的公式计算,渐渐学会因为A所以B,因为A和B所以C还是相对简单的。
全系列完毕。老话,大半夜连抽烟带码字的挺伤身,转载请注明出处 http://zhiyi.us/internet/thinking-twice-before-building-your-site-final.html
分享到:
相关推荐
百万级访问网站前期的技术准备,管理与技术
【标题】:试谈百万级访问网站前期的技术准备 【描述】:在互联网时代,创建一个网站变得越来越容易,但随着访问量的增加,技术挑战也随之而来。本文将探讨在构建一个可应对百万级访问的网站时需要考虑的关键技术...
统一通信技术是指将不同的通信方式(如语音、视频、即时消息、电子邮件等)集成到一个单一的、便捷的...通过充分的前期准备、技术支持和用户培训,可以最大限度地发挥统一通信技术的优势,同时减少其带来的潜在风险。
- **前期准备**:确认网站的所有权归属,明确转让的具体内容。 - **签订协议**:双方达成一致意见后签订正式的网站转让协议。 - **资料移交**:甲方需向乙方提供与网站相关的所有证明材料和注册证书等。 - **款项...
评估流程还包括前期准备、现场调研、数据分析与报告撰写、反馈与改进等多个环节,确保评估结果的客观性和准确性。 #### 三、信息化管理平台建设与优化 为了更好地推进数字化转型,制造企业需要建立和完善信息化...
网站前期的准备是指在网站设计和开发之前的准备工作,包括后台环境的搭配、网站设计主题与思路的准备、网站图片、视频和文字素材的准备等。后台环境的搭配是指选择适合的服务器环境和数据库管理系统,例如XAMPP是一...
4. 技术测评的步骤:技术测评一般包括前期准备、现场测评、结果分析、测评报告撰写等步骤。 5. 技术测评的目的:通过技术测评,可以发现信息系统中存在的安全漏洞和弱点,帮助信息系统的运营者和管理者改进和提升...
【计算机考试三级网络技术知识点详解】 1. 计算机历史:1959年10月,我国成功研制出的首台通用大型电子管计算机是104计算机。 2. 计算机应用:模拟操作是研究方法之一,大气预报使用巨型计算机处理数据,经济运行...
这个数据集的规模达到了百万级,覆盖了日常生活的各种话题,具有广泛的适用性和实用性。 【描述】中提到的"https://gitee.com/chenyang918/chinese_chatbot_corpus"是一个公开的代码仓库,用户可以通过这个链接获取...
根据《信息安全技术 网络安全等级保护基本要求》,等级保护分为五级:第一级为用户自主保护,第二级为系统审计保护,第三级为安全标记保护,第四级为结构化保护,第五级为访问验证保护。其中,第二级和第三级是多数...
### 信息化教学大赛前期准备关键知识点 #### 一、有特色选题 1. **选题的重要性**:选题作为比赛的起点,直接关系到作品的整体吸引力与竞争力。 - **核心课程选题的局限性**:尽管某些课程在专业人才培养体系中...
【访问控制与管理】在IT项目管理中...总的来说,这个培训课程全面涵盖了街头访问的各个环节,从前期准备、人员培训、现场控制到后期总结,为IT行业中的市场研究提供了详实的操作指南,以提升数据采集的科学性和可靠性。
这样教师能将更多的时间和精力投入到课堂教学设计和学生指导中,而不是前期的视频准备工作中。 2. MOOC的课程往往是由知名院校的教授团队设计和讲授,质量相对较高。学生通过观看这些课程视频,能够接触到更权威、...
二、前期准备阶段 1. 组织抽样员进行抽样:这一阶段包括对抽样员的培训、考核、签订协议、实地抽样、复核和整理抽样结果,最后填写入户访问情况登记表。 2. 预约访问员及其他项目参与人员:根据项目难度和时间安排...
边界扫描技术是一种专门用于解决ASIC引脚数量限制问题的技术,它允许通过有限的引脚访问整个电路。 ##### 6.1 边界扫描简介 边界扫描技术通过在电路的输入和输出端口之间插入边界扫描单元(BSC,Boundary Scan ...
在进入Uibot(RPA设计软件)的培训之前,了解一些基础知识和前期准备是至关重要的。本指南将为你提供一个全面的视角,帮助你更好地理解RPA(Robotic Process Automation)及其在UiBot中的应用。 RPA是一种技术,它...
根据本学期所学知识,使用Vue.js前端技术框架,结合动态Web开发技术,设计一个前后端分离的单页应用(SPA)项目: 共享音乐网站,项目包含注册和登录页面,以及音乐分类展示页面、音乐选择列表和播放页面(可选做功能:...