网站大量收购独家精品文档,联系QQ:2885784924

服务器端程序通用细节设计.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
服务器端程序通用细节设计.doc

服务器端程序通用设计 by冲出宇宙 2010-5-1 概要 服务器端程序的主要功能是提供对外服务。它可以是挂载多个后端的分发和合并程序,也可以是自身包含数据的数据提供程序。 服务器端程序一般包含3种功能:查询、写入、控制。 设计服务器端程序的关键点包括: 大并发,多线程; 过载保护; 负载均衡 及时返回; 读写分离; 错误恢复; 实时监控。 基本构架 网络层 支持大并发有很多种网络结构的选择,一般直接使用epoll技术。其基本结构为: epoll模型 在Epoll模型下,需要做如下的几点的负载保护: 接受的前端socket连接个数; 前端socket的短时超时。 第一个根据实际情况设置,第二个根据任务处理平均耗时决定(一般至少为平均耗时的4倍,或者1分钟)。第一个避免大量连接,第二个避免客户端长时间连接占资源。 异步发送线程 有的时候,网络或者客户端进程调度,会导致发送数据发不出去的情况。如果傻傻的等待数据发送完毕,会导致大量请求超时(因为一个socket可能一次发送了N个请求)。 异步发送线程会把数据存储起来,异步发送。当数据堆积严重的时候,需要断开连接,抛弃所有数据。 一般用一个线程处理异步发送即可。 后端socket自动重连 后端socket是指本程序需要调用的远程服务的连接。一般来说,这些连接是长连接,需要保持时刻通畅。 重连的时机包括:socket错误、socket长时间无数据通讯。第一种情况好理解,第二种情况的来源比较复杂。举例来说: 现在有3台后端服务器,其中2台是主服务器,1台是备服务器。备服务器一般不提供服务,它仅仅在主服务器超时(负载过高或者挂掉)时提供服务。为了保证和备服务器之间连接的通畅,需要隔一段时间重连一次(当然,不断发送某个通知包也可以,只是比较麻烦)。 另外一种情况是:某台服务器程序处理一个请求耗时特别严重(有可能是因为某个bug,或者被程序抛弃),从而等了很久都没有响应。某些负载均衡策略会根据这种情况尽量减少发送给它的请求量。但过了很久之后,如果这个服务器还没有数据返回,一个比较好的做法是断开重连。 协议头解码 解码协议头的好处在于:1)可以判断数据包是否正确;2)可以判断数据包的实际长度;3)可以判断数据包的类型(如查询、写入等)。 只需要解码协议头,协议体等待任务处理线程去解码。 过载保护 当数据队列里面未处理的数据过多时,应该抛弃新来的数据。可以直接返回一个错误值。 数据队列 数据队列可以是一个同步队列。 处理线程 处理线程包括查询处理、写入处理和控制处理3个。其中,查询处理可以一般为多线程,写入处理一般为单线程(数据库不同,它可以进行行锁定,故写也是多线程的),控制处理一般为单线程(多线程会比较麻烦,比如,2个人一个要求它停止,一个要求它继续)。 因为查询线程是并发的,所以必须对公共数据进行锁定。常见的包括:cache数据、全局数据等。 控制处理可能会修改全局数据或者进行统计计算,它也需要对公共数据进行锁定。控制处理主要包括如下几个功能: 状态控制,如:可写、可读; 监控数据,如:5分钟内请求耗时。 监控数据要尽量完整,方便分析程序状态。常见的监控数据包括: 磁盘文件大小; Cache内存占用、cache数据实际内存数、cache数据个数; 关键内部数据结构统计信息; 最近一段时间的请求数、平均耗时、超时数; 被抛弃的包个数、被超时的请求数等。 这里面的那些非实时的数据可以直接输出到日志。 负载均衡 负载均衡的目标有2个,一个是保证服务可用,另外一个是尽量降低处理时间。保证服务可用的策略一般在后端,如多台服务器、多机房部署、多idc部署、多国家部署等。负载均衡需要保证的是,当若干台机器不可用(或者速度很慢)时,可以把请求发到其他机器。 我们把所有的服务器都放到一个链表里面,当一个请求过来时,我们直接选择链表的第一个节点。那么,现在我们需要决定链表的次序。计算链表次序常见的做法有: 均匀 即每个节点的权重都是1,每当一个节点提供服务后,都被放到链表的最后。这样的结果是请求被均匀发往后端服务器。 最近耗时 可以计算最近1次的请求耗时,也可以计算最近多次或者一段时间内的请求平均耗时。耗时最小的排在链表的最前面,每当一个节点提供服务后,就把它放到链表中的某个位置(具体在哪里需要根据实际情况决定,比如,放到中间;不能放到最前面,否则会导致短期的大量请求都发给它)。 负载 计算当期服务器的负载(即正在处理的任务个数),把负载最小的放到链表的最前面。每当发送请求给它后,把它的负载加1。 注意:如果后端服务器对某些请求不返回任何结果(抛弃或者超时严重),计算服务器的负载是不准确的,这个时候,可以通过断开连接重连来重置负载。 最近慢请求数 计算最近一段时间每个服务器耗时严重的任务个数,把数字最小的服务器

文档评论(0)

000 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档