#
、性能要求:
Ø 支持同时在线用户量(访问网站页面):10000人以上;
Ø 支持并发量:5000;
Ø 高峰负载时的平均响应时间(指每秒并发访问在4000以上):
u 页面访问时间(用户实测):1-5秒;
u 运行操作类响应时间(用户实测,50000个用户量):1秒-10秒。
Ø 日常运行时的平均响应时间:
u 页面访问时间(用户实测):1-3秒;
u 运行操作类响应时间(用户实测,100000个用户量):1秒-6秒。
Ø 有效运行时间:
u 7x24小时:99%;
u 每年因系统本身问题导致的宕机次数:≤4;
u 因系统本身问题出现故障时的恢复时间:≤24小时。
这种要求有人能做得到吗?
和老外聊天,会发现How do u do的搭讪out了。分享我常听到的:
借助情境What do u think of that book?/Looks like a great drink.What is it?
赞美I like ur posture.It makes u stand out nicely./Nice dress.Where did u get it?
天气It's so cold today./It's freezing!Do u know the temperature? (Pic)
摘要: 在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。
阅读全文
1、Web层
主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为准则吧。
抽象出核心库封装 控制器和中间层的操作。
在大规模集群环境下,session复制会引起严重的性能问题。考虑用 集群缓存 + cookie验证 代替session实现权限控制吧。
2、Cache层
配置 Memcache 组成集群缓存
对 Memcache 客户端进行封装
Memcached 节点组成池,调用示意:opList (BizName, 策略 ...)
3、中间层
“中间层”可以理解为基于应用和数据之间的层次。它被设计用来为Web应用提供:数据缓存 和 对应用透明的数据访问——即应用不需要考虑数据表拆分的问题。以服务的方式提供对存储层的高性能调用以及分布式计算。可供选择的框架:ICE 、Hadoop 直接基于Memcache开发(减少复杂度,推荐)
4、存储
推荐MySQL,理由:免费,经过实践检验,有大量成熟的案例、解决方案、技术支持。
小规模:一个 data table 维护存储服务器阵列,内容 -> mount ……
大规模:Master-Slave模式+MySQL Proxy,实现数据库读写分离。在中间层的包装下,可做如下扩展,以支持更大规模的数据存取:
数据库/表水平拆分,例 User -> User33% + User33% + User34%
数据库/表垂直拆分,例 User -> UserBaseInfo + UserAddrInfo
也可考虑使用 LongStore (龙存) 解决方案,由龙存管理存储阵列……
5、部署
划分子域名,每个子域名一个Web应用包,互不干扰
静态资源(css, js, image ...)使用专门的静态服务器
6、负载均衡
小规模:DNS轮询。
大规模:F5, 2*X 台F5服务器,F5是L4/L7层交换机,每台至少可处理200万连接(与服务器内存有关)。
Ngnix是L7层交换,LVS负载均衡也是一种方案
7、Web中间件选择
Tomcat - 最高400并发
Apache - 最高2000并发
Ngnix - 优于Apache
采用方案:Ngnix + Resin ,理由:
Resin提供更为快速的servlet引擎 - 选择Resin。
gzip问题 - Resin在单独处理gzip时存在内存溢出的隐患,因此要加一层 Ngnix。
Ngnix 能减少单独使用Resin时的内存占用 - Resin建立1000个连接使用1000个线程;加Ngnix后,透过其“异步连接”、“建立长连接”机制使Resin内存压力大大减小。
Ngnix 针对Linux系统有性能优化措施 - 0 Copy, send file ...
因此采用:1 Ngnix + 1 Resin,一对一。
静态服务器采用:Squid + Apache, why? because Squid has cache ability ...
新变化 - Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持 404/301/302 这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。
Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。
最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。有的网站已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。
在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为"负载均衡服务器"与"Web缓存服务器"来使用。以下是配置片段供参考:
view plaincopy to clipboardprint?
http
{
...
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
...
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
}
server
{
...
location /
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1h;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
expires 1d;
}
#用于清除缓存,假设一个URL为http://192.168.1.44/test.txt,通过访问http://192.168.4.44/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}
}
同时,对于影响页面展现的静态资源,例如:css, js 等可以放在具有优质带宽的IDC(IDC=互联网数据中心,优质/高速的带宽也比较贵,正所谓一份价钱一分货);其他的静态资源,如图片等可以放在价格相对低廉的IDC中,以域名区分两种静态资源,节省每一分钱。
8、网络拓扑图
/ Ngnix - 1:1 - Resin
F5 --
\ Squid - 1:n - Apache
9、监控统计平台
业务统计 - 用户访问统计
软件性能 - 应用系统监控,例如:请求响应时间……
硬件/网络性能 - Ganglia监控
10、其它要点
IE浏览器对同一域名(包括子域名)只能建立2个连接,连接多了只能排队……
双F5架构,两台职能划分不同,镜像,心跳接管……
Raid存储阵列……
Linux操作系统及其优化……
案例
项目里有个LEADER, 我跟这个LEARDER 做了1年了,合作还算愉快。
----------------------------------
两边都不得罪,其实就是得罪两边。
--------------------------------
后来最近半年新来了个PM。这时有个新项目,LEADER建议在现有的项目上改,新PM打算重新设计。两人各执己见,一时无法决定。而我是这个新项目的重要CODER,自然我成了拉拢的对象。很难抉择该怎么站队。
LEADER算地头蛇,PM则是新官上任三把火。我是个新来的程序员,如何在这场权利的争夺中站对啊?怕误伤,误杀啊。
坚定的支持leader啊 搞走PM leader升PM
你升leader
慢慢来吧,小伙,与人斗其乐无穷
-------------------------------
这种方法一般程序员也干不了。
两不靠需要很好的掌握平衡,否则后患不少,不过反正你新来,可以走,也可以调。
选边的话,需要你花心思了,琢磨人的心思,还要设局。个人觉得对你难度太高。选边的另外一种办法是选定一个,无原则支持,但是你是新来的,有这么深厚的默契吗?
还有一个角度:你有没有能力去协调双方?
---------------------------------
改善非功能需求的最佳实践冗余负载均衡
方式有网络切换、集群管理、基于DNS配置的切换
算法有随机算法、选择响应时间最快的算法、选择负载最轻的算法、重型算法
失败转移
集群
将服务器组成一组,来统一进行管理,检测软、硬件的失败,处理系统的失败转移,自动因失败事件而重启
集群配置方式
两节点集群、集群对、Ring、N+1、N to N
改善性能性能有两个关键点:
处理时间,从计算、数据调度、缓存和网络传输
阻塞时间,来源于资源竞争和另一流程的依赖
处理措施使用好的算法或适用的技术
引入并行计算、限制并发请求以避免系统过度使用、TIME OUT措施
高可用可用是指随时才能访问,不能访问的原因是硬件、网络、服务器软件、和应用组件的失败;
如果一个应用组件不能提供足够快的响应时间也是指不可用了,这是指系统正常运行情况下,由于正在同时处理很多任务而导致的延时。
改善措施集群中的复制,有活跃式的复制:发给所有节点,节点都同时进行运算,但只采用其中一个作为响应;被动式的复制,只有主节点响应请求,其他节点与主节点同步。
扩展性改善扩展的原因通常是因为需求的变更。最重要的目标是改善系统开发以适应快速的变化。
可采取的方法有:定义清晰的范围、预知可能的变更(如果界面技术,隔离这一区域使其不能波及到其他地方)、使用高质量的对象模型(使用MVC模式来解耦界面组件和业务组件)
伸缩性的改善垂直伸缩:增加处理器或内存等,对系统是透明的;
水平伸缩:增加服务器,必须避免对服务器物理位置的依赖。
架构中的层
两层结构的系统指C/S架构的程序。通常指包含了展示和业务逻辑的客户端和服务器上的数据库。展示和业务逻辑紧密结合。
优点安全是一点,由于这些系统是位于防火墙后面,员工不能使用不安全的的PC。性能通常比较好,如果公司不使用比较老的很少内存的电脑的话。
缺点可用性是一个缺点,因为如果一个元件不能工作的时候,整个系统就变得不可用。
伸缩性是一个问题,由于维一能够增加的元件是数据库。
为了能增加新功能,你很明显会影响到其他元件,扩展性不行。
可管理性也是一个问题,监控所有正在运行客户端的PC是不可能的。
可维护性和可扩展性一样。
可靠性不是一个优点或缺点,由于请求增加时,所有的这些请求来到数据库,所有的数据库能处理增长的交易吞吐量。
三或多层架构的系统三层架构由WEB,业务逻辑和资源层组成。多层架构的系统有WEB,业务逻辑,整合和资源层。在非功能需求方面,三层和多层架构的系统拥有相同的优点和缺点。
优点当将展示层逻辑从PC客户端移到服务器端,而能被集群时,伸缩性被改善了。
由于集群层能够提供失败转移机制,可用性也有所改善。
由于功能被分解到不同的层中,扩展性也有所改善。你可以更改表现层又能使得对业务逻辑影响最小。
对于可维护性也是这样。
由于各层是部署在服务器上,使得监控各个元件变得更容易,这样可管理性也提高了。
分层对于安全性可以做得更多,但必须小心对性能造成影响。
性能可能是优点或缺点。主要还是优点,当分割线程到各服务器上时,如果你要在服务器间传送大数据时,这时可能会变成缺点了。
缺点多层系统原生是比较复杂,多层架构的系统其实是没有所谓的缺点。虽然这样说,并不会由于你有了多层设计,你就有了很好的架构。必须记得不要过度使用层数。
小结
架构是一系列的使得系统能够由一组具有自己的上下文的简单的子系统组成的结构规则。
性能是指系统的响应时间,如必须在3秒内响应。
伸缩性是指当访问量增加时可以增加冗余的组件,部署到增加的服务器上时,原系统无须作更改。C/S结构的系统,由于系统安装在客户端,就不能作这种伸缩。
扩展性,是指增加或修改功能时对现有的系统不会构成影响。如MODEL1的情形,系统没有分层,所有代码混在一起,更改时会互相影响。
可靠性,是指访问量增加的时候,事务有保证。通常数据库对增加的请求,事务的保证方面已经是有所处理了。
可用性,是指系统中的某个元件失败时,系统还能访问。如果是C/S架构的系统,无法分层,某个元件出现问题时,系统就不可用了。
可维护性,是指调整现有的系统流程,不会影响到其他元件。
可管理性,是指能监控系统伸缩能力,可靠性,可用性,性能和安全。
安全性,是指系统能够阻挡非法访问。
云计算技术简介 |
云计算技术概述,大数据时代来临,Google云计算技术,Amazon云计算技术,微软云计算技术等。 |
初始Hadoop |
Hadoop的起源、解决的问题、
以及它的特点、应用场景和发展趋势,企业应用情况,为什么使用,及其生态系统介绍。 |
Hadoop
单节点伪分布式安装 |
Hadoop
1.0 版本 安装环境搭建 |
Hadoop
架构 |
Hadoop
整体架构设计及重要的概念 |
Hadoop
HDFS 体系结构 |
1:HDFS
架构设计目标,设计思想,
2:特点,基本概念,容错性。
3:HDFS
界面介绍
4:HDFS
服务 |
Hadoop
HDFS 命令行 |
Hadoop
HDFS Shell 基本操作 |
HDFS
Java API 使用 |
1:基于Eclipse开发环境搭建
2:Java
API示范 :比如建立文件,删除,移动复制等 |
Hadoop
MapReduce 架构 原理 |
1:MapReduce 架构详解
2:MapReduce
流程
3:MapReduce
特点
4:MapReduce
容错性
5:MapReduce
服务 |
Hadoop
MapReduce api |
1:Mapper
2:Reducer
3:Driver |
Hadoop
MapReduce 编程实践 wordcount |
1:WordCount
程序编写,演示
2:运行MR
Job 示例 |
高级MR
编程 |
1:RecordReader
2:Partitioner
3:Combiner |
Hadoop
MapReduce IO |
1:数据完整性校验
2:压缩,包括:LZO、GZIP、Snappy
3:序列化
4:基于文件的数据结构,包括:SequenceFile、MapFile |
调优 |
调优经验分享 |
课程中的HBase部分:
掌握HBase基本原理,应用场景,掌握基本的编程技巧
章节课程 |
内容描述 |
初始HBase |
1:NoSql
数据库简介.
2:HBase
简介及与传统关系数据库的对比。
3:HBase
应用场景,企业应用情况,为什么使用。
4:HBase
特点 |
HBase
环境搭建 |
HBase
环境搭建 |
HBase
体系结构 |
1:HBase架构
2:HMaster、RegionServer、 Regoin 等概念 |
HBase
数据模型 |
1:表
2:Rowkey
3:Column
Families |
HBase
Shell 命令行 |
1:启动HBase
Shell
2:建立表
3:访问数据(添加,删除,查询)
4:练习 |
HBase
api 简单编程介绍 |
1:基于Eclipse开发环境搭建
2:基本操作(建表,查询数据,删除)
3:高级操作
(使用过滤器)
4:练习 |
HBase
row-key 设计及Scheme 设计 |
经验分享,设计原则 |
HBase
coprocessor等高级特性介绍 |
1:coprocessor特性分析,使用场景;
2:HBase
优化简单原则 |
课程中的Hive部分:
掌握Hive基本原理,应用场景,掌握基本的编程技巧
章节课程 |
内容描述 |
初始Hive |
1:Hive简介
2:为什么使用Hive
3:Hive
应用场景,企业应用情况 |
Hive
环境搭建 |
Hive
伪分布式环境搭建 |
Hive
体系结构 |
1:Hive主要的组件
2:用户接口
3:概念 |
Hive
QL |
1:Hive
类Sql
2:DDL
3:DML
4:Select
与连接查询 |
Hive
Java API |
1:搭建
Hive JDBC 开发环境
2:Hive
JDBC 开发流程 |
Hive
用户自定义函数简单介绍 |
UDF和UADF |
课程中的分布式协调系统Zookeeper部分:
掌握Zookeeper基本原理,应用场景,掌握基本的编程技巧
章节课程 |
内容描述 |
初始Zookeeper |
1:什么是ZooKeeper
2:ZooKeeper特性 |
Zookeeper
体系结构 |
1:ZooKeeper体系结构
2:ZooKeeper存储结构 |
Zookeeper
选举与锁机制 |
1:Zookeeper
选举机制
2:Zookeeper
选举算法
3:Zookeeper
锁机制 |
ZooKeeper
CRUD API |
1:Create
2:Read
3:Update
4:Delete |
Zookeeper
应用场景 |
Zookeeper
应用场景 |
最近公司要上一个新项目。可能要整合以前的一些系统。现在考虑是用esb企业总线进行管理。初步定的是wso2。基于apache synapse。
1.一般的esb流程是什么样子的?
是不是主系统发生soap请求。esb接收并且转换成jms然后子系统监听jms。最后得到数据。
还是。jms仅仅是内部转换。soap请求在esb转成jms后。加入队列。然后再转成soap调用子系统?
2.使用jms的考虑是jms对队列的信息进行持久化。防止比如子系统突然挂掉了。消息丢失。
但是有个问题。是esb自动监听jms的队列的话。会导致直接消费了。而数据没有存在队列中。还是会出现消息丢失的问题。
这个应该怎么解决。
3.esb进行协议之间的转换。每种方式都需要些一个转换方式么?有没有什么通用的。或者是自动转换的。比如soap和jms的互相转换。不是协议切换。是内容转换。
4.如果大家有讨论esb的群。或者有高手愿意指点一下。谢谢了。
------------------------------------------------------------------
1,一般ESB的流程,
先是整理需连接的系统,需要连接的系统功能(一般管它叫服务),确定服务的依赖关系,支持的协议(文件,WebService, RPC,...),调用的方式(同步/异步)
然后使用ESB提供的那些协议组件,一点点串起来就行。串的方式可以参考EIP (www.eaipatterns.com)
你说的两种异步方式的话都可以,
如果是同步的,也可以直接soap -> soap, 不用JMS。 一般用JMS是为了实现异步通讯
2,JMS,至少我接触的ActiveMQ, 是可以支持事务的,发生异常,可以不消费信息
3,协议转换是为了配合你那些需要整合的系统,如果都是SOAP,也就不需要转了。
消息内容转换(格式,内容),一般ESB都提供各种工具的。
------------------------------------------------------------------
1、如果你要做同步转异步,可以在esb上做成ws转jms,然后起到一个缓冲的作用。
最后可以再同步的返回给调用方。
你也可以修改调用方为jms方式,这样就是彻底的异步了,在esb端可以jms转ws,调用业务服务方的ws。
2、esb都支持事务的,jms中如果不确认消息的话,不会从持久存储去delete掉的。
一般的esb。也可以做成是esb消费掉消息,然后存入esb自己内置的jms provider中,这样你再消费的话,也是可靠的。还可以做成补偿机制的,即esb中如何消息处理失败,把消费放回去原来的queue或是一个中间的临时queue,稍后做recover。
3、从esb的不同transport进去的数据,在esb的中介层处理时,其实消息格式都是一致的、通用的。也就是说常见的ws或jms转换在一般的esb里处理都很简单。如果稍微复杂点,也很容易扩展transformer(比如通过xslt做xml格式转换)来实现数据内容和格式的转换。
在一个开发团队中,产品经理、设计、开发、市场以及运营通力合作才能让一个产品走向成功。
而在产品从稚嫩到成熟的这个过程中,产品经理至始至终都有着自己的职责。而通过对这部分的职责的认识就有助于在产品开发过程中更好的为自己定位,让工作更有效率的完成。
在不久前有这么一个段子:
产品经理有30%的时间到处溜达,打开所有网上正在内测、封测、公测、正式发布的SNS、微博、问答、客户端产品;20%的时间在QQ、MSN、微博上扯谈、求码;30%的时间永无休止的立项、用研、交互评审、UI评审、测试、发布、运营会议;20%的时间写BRD、PRD、MRD、DEMO、运营方案。
虽然在这个段子里我们看到的是一个轻松诙谐的产品经理介绍。不过在实际工作中,一个产品经理的在整个产品的生命周期中有着需要严谨履行的职责。
一:产品概念阶段
1:在公司内外寻找产品创意。组织进行论证和充实。
2:组织所辖产品线的市场细分选择,并制定产品线初始业务/路标计划(需求规格/RoadMap)。
3:根据市场变化进行定期和不定期的计划调整工作。
4:参与产品战略和产品平台规划工作。
二:产品需求阶段
1:组织所辖产品的需求采集。
2:组织收集/分析宏观环境,技术趋势,竞争对手,内外部客户的信息。
4:组织对于产品相关的各种战略,计划,策略的审计工作。
5:研究市场动态,提交市场研究报告,选择细分市场,确定产品定位。
6:收集各个部门第产品初始业务/路标的意见。
三:产品设计阶段
1:组织完成从产品创意到产品设计,形成完整的产品业务需求。
2:组织对产品设计的测试工作。
3:提交完成的产品业务需求,协调相关资源。
4:提交产品开发任务书,获得授权,督导产品开发工作。
四:产品开发阶段
1:监督产品开发计划,产品业务需求的完成情况。
2:组织产品的市场调研工作,收集产品信息,根据需要调整产品业务需求和产品开发计划。
3:组织或者参与研发开发阶段评审。
4:协调资源对产品开发过程中的中间交付件进行测试。
5:指导产品开发过程。
五:产品测试阶段
1:组织产品的测试工作。
2:制定产品的上市计划,为产品上市做培训,文档等前期准备工作。
六:产品发布阶段
1:负责产品的市场发布工作。
2:指导并监督产品的运营和销售工作。
3:协同财务/市场部门监控产品的盈利情况,提出新的营销策略。
4:根据市场反馈,提出产品的改进意见/监督执行。