通用高性能服务框架解析

做了多年的后台服务,一直想将自己这么多年对高性能服务架构的一些粗浅认识写出来,一方面对自己这个阶段成长做个总结, 另一方面想通过这个与各位做一个交流,妄不吝赐教。

一、最初对服务架构的概念

最初接触服务端程序应该是2011年,当初基于服务架构的概念是基于这样一个模型



这是最简单的一种C/S模型结构,客户端直接连接服务端,只能适用于对效率、并发量、扩展性要求低的环境,所以当请求量逐渐上升,你会发现这种架构的系统,在处理上已经不满足业务的需求了,所以你衍生出下面一种架构。


二、多个App分流模式



这是一个两层框架,中控层是控制服务只做转发分流操作,分流的算法通常是轮询,具体可以根据实际的业务情况去制定。应用层是具体的应用服务,执行具体业务。这种架构的主要优势有一下几点:

1、中控层将流量有效分布到各个业务服务,而中控层的应用只做转发不做业务,在处理请求量上效率要远远高于直连业务服务,所以框架相对于上面一个在吞吐量上大幅增加

2、较易于扩展,如果发现应用服务不能支撑现有业务量时,可以通过增加应用服务来分流。

但是这个种架构随着业务量的增加也会渐渐不适用,有同学可能会说多搞几个业务服务分流不就得了,这里得考虑到资源成本,管理成本等等问题,所以这种方式在大请求量下是不适用的,问题就在如何提高应用服务的业务处理速度,我们可以引入缓存机制。

三、加缓存机制的框架


在普通业务处理上,查询请求量是最多的,如何提高查询效率,就成为关键,一般情况下数据库或者磁盘IO的读取都能成为瓶颈,所以往往我们会在业务应用与数据库或者磁盘之间添加缓存机制,业务应用先去查缓存,缓存没有再去查对应的数据库或者磁盘,90%的请求都能在缓存中解决,这样不仅减小了数据库的压力,同时也增加业务处理的速度。当然你可能会根据业务的需要多几个缓存,但是基本的思路不变,具体根据你的业务走,此种架构基本能解决80%的问题。


四、加入容灾机制的框架

上面所讲的框架只是一种基础框架,在实际应用中需要考虑的因素很多,比如服务器宕机了,怎么平滑过渡,不影响业务等等,这里就得加入容灾机制。



监控服务主要负责监控负载均衡服务是否有宕机情况,如果有,置为相应状态,客户端请求监控服务,获取有效的负载均衡服务的地址,进行连接,这样即使有一个服务宕机,其实并不影响整个系统的运行,当然还有数据库的容灾,这里就不多做讨论了!

五、总结

影响整个系统性能的因素有很多,这里仅就框架上做了一些粗浅的讨论,抛砖引玉,实际情况可能考虑的因素会更多,至于常见程序上的优化,有时间我也会写一篇文章总结一些。另外高性能WEB应用的框架搭建可以参考这篇文章:http://www.csdn.net/article/2014-11-06/2822529 。 总之增加系统性能的不变原则就是如何快速的处理业务数据。


最后,大家有什么问题或者好提议,可以加入群:291368579


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
核心特性 1.基于swoole提供分布式服务器通讯服务 2.基于thrift提供rpc远程调用服务 3.基于HTML5提供在线网络直播平台服务 4.基于swoole提供同步异步数据库连接池服务 5.基于swoole提供异步任务服务器 6.基于vmstat提供服务器硬件实时监控服务 7.基于yac、yaconf提供共享数据、配置服务 8.基于zqf提供高并发计数器、红包、二维码服务 9.很好的支持网页版console的shell服务 服务启动 需要php以cli模式运行/server/server.php php server.php start php server.php stop php server.php restart composer 安装 { "require": { "qieangel2013/zys": "0.1.4" } } 分布式服务器通讯服务 建立多个服务器之间进行数据通信服务服务自动连接在线服务器,支持热拔,启动服务后自动连接,无需人为干预 注意事项: 需要在conf/application.conf里配置端口和监听、日志等 需要有一个redis服务器,并且分布式服务器都能连接redis web端可以直接调用服务 使用如下 //注意:type为sql、file,要是需要别的功能,自己定义 if($_FILES){ //数据同步 $sql = array('type'=>'sql','data'=>'show tables'); var_dump(distributed::getInstance()->query($sql)); //文件同步(不用安装rsync notify就可以实现文件同步,并且是触发式的占用很小的资源,调用sendfile零复制) $dir_pre=MYPATH.'/public/uploads/'; if(!is_dir($dir_pre.date('Ymd'))){ mkdir($dir_pre.date('Ymd'),0777,true); } if(is_uploaded_file($_FILES['file']['tmp_name'])){ $upname=explode('.',$_FILES['file']['name']); $filename=uniqid().substr(time(),-4).'.'.$upname[1]; if(move_uploaded_file($_FILES['file']['tmp_name'],$dir_pre.date('Ymd').'/'.$filename)){ echo "Stored in: " . $dir_pre.date('Ymd').'/'.$filename; $fileinfo = array('type'=>'file','data'=>array('path' =>'/public/uploads/'.date('Ymd').'/'.$filename,'size'=>$_FILES['file']['size'],'ext'=>$upname[1])); var_dump(distributed::getInstance()->queryfile($fileinfo)); }else{ echo 'Stored failed:file save error'; } }else{ echo 'Stored failed:no post '; } } 本地访问:http:/localhost/index/distributed/ 架构图 执行结果如下  thrift的rpc远程调用 本地访问http://localhost/index/rpc (返回0表示成功) 数据库连接池使用方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值