2019独角兽企业重金招聘Python工程师标准>>>

这可能是个庞大的话题,没有亲自作过相关系统。
可能有几层分布:
1、WEB分布,这个只需LVS支持即可,状态保持不保持无所谓,可以通过PHPSESSID来保持这个会话。因而接入服务器仅作为接入之用,存储转到后端,这里要保持接入机无用户文件还是比较难的,有时候保存一些可能会使系统更简单一些。
2、CACHE分布,接入机统一处理会话,根据规则命中某台特定CACHE机,当然,这里的CACHE机器不仅限于如MEMCACHED、XCACHE等,简单的方法可以直接使用DB代替,如MEMORY表,这样后端数据和CACHE的同步规则就需要自己定制,效率也可能没有自动完成CACHE<->DB双向更新的效率高。
3、DB分布,这里认为CACHE和DB也可用应用程序来控制访问,而不一定需要CACHE本身来完成,至于效率降低多少不清楚,个人觉得可以在后台设置一些定时调度脚本来更新CACHE,和将CACHE中的数据转存到后端DB。当然DB和CACHE的数量不一定是一一对应,如果CACHE多,那么DB存储可能会相应减少,这里需要测试一个平衡。
我在DB里设计了一个简单的路由器,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static function &init(& $dsn , $dbKey , $fetchMode = self::DB_FETCH_ASSOC) {
     if (isset(self:: $db [ $dbKey ])) {
         return self:: $db ;
     }
     $route = Route::init();
     $dbInfo = $route ->getDbRoute( $dsn , $dbKey );
     //这里要检测DB相同DBINFO的实例是否存在,如果存在则直接返回引用
     if ( is_array (self:: $db )) {
         foreach (self:: $db as $key => $value ) {
             if (self:: $db [ $key ]->dsn == $dbInfo ) {
                 self:: $db [ $dbKey ] = self:: $db [ $key ];
                 return self:: $db ;
             }
         }
     }
     $className = 'DB_' . self:: $dbType [ strtolower ( $dbInfo [ 'dbType' ])];
     self:: $db [ $dbKey ] = new $className ( $dbInfo , $dbKey , $fetchMode );
     return self:: $db ;
}

根据规则获取需要的DSN,然后返回一个DB,貌似这个路由很简单,很雷人:

1
2
3
4
5
6
7
8
9
10
public function getDbRoute(& $dsn , $dbKey ) {
     global $_configs ;
     if ( $_configs [ 'route' ][ 'db' ][ $dbKey ]) {
         if ( $_configs [ 'route' ][ 'db' ][ $dbKey ][ 'routeRule' ] == 'rand' ) {
             return $dsn [ $dbKey ][ array_rand ( $dsn [ $dbKey ])];
         }
     } else {
         return $dsn [ $dbKey ];
     }
}

当然路由规则是可以写进配置文件的,这里我默认写了个随机进行测试,发现可行,HOHO。一个规则可行,那么取模等规则当然也可行。
改进后的DB类会更为简练,当然最大的特性是支持分布- -!!

转载于:https://my.oschina.net/tenking/blog/28575

分布式系统设计之DB类(来自深空老大)相关推荐

  1. 浅谈权限设计(来自深空老大)

    2019独角兽企业重金招聘Python工程师标准>>> By 深空, 2009-09-13 21:45:07 PHPChina的专家版在谈权限设计,苦于没有权限回帖,特发此博文谈谈简 ...

  2. 多数据库支持的应用程序设计(来自深空老大)

    2019独角兽企业重金招聘Python工程师标准>>> 以前做PHP应用,多数是单数据库数据查询和更新,顶多也是主从数据库的支持,实现起来相对简单.主从数据库的问题在于,当会话存储在 ...

  3. 分布式系统设计理论之一致性哈希

    分布式系统设计理论之一致性哈希 主要参考和围绕这篇论文讲解:Consistent Hashing 1 问题引入 什么是一致性哈希?为什么要用一致性哈希? 2 一致性哈希算法出现之前的分布式系统设计 例 ...

  4. 从火星传图有多难-业余眼光看深空通信

    最近天问顺利登陆火星的消息非常热门,有同学问我,火星车.轨道器通信速率都很慢,尤其是火星车,1秒只能发2字节.想看一张图片,要等三四天,真的急死人.作为非通信专业的老师,讲给非通信专业的本科生,我想还 ...

  5. 云原生时代|分布式系统设计知识图谱(内含 22 个知识点)

    我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝.微信这样顶级流量产品.还是区块链.IOT等热门概念.抑或如火如荼的容器生态技术如Kubernetes,其背后的技术架构核心都离不开分布 ...

  6. 云原生时代|分布式系统设计知识图谱(内含22个知识点)

    我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝.微信这样顶级流量产品.还是区块链.IOT等热门概念.抑或如火如荼的容器生态技术如Kubernetes,其背后的技术架构核心都离不开分布 ...

  7. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

    1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...

  8. 一文带你重新审视CAP理论与分布式系统设计

    这是一篇来自微信公众号的文章,如果图片看不到,可直接跳转到文章出处查看:https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=265076 ...

  9. 从金拱门餐厅联想到的分布式系统设计思维

    作者|周明耀 编辑|小智 其实在生活中,大到组织架构,小到琐碎日常,都能学到一些经验.总结出一些知识.共性往往隐藏在特性之中.你需要做的,可能仅仅只是细心观察而已? 前几天中午开会开到 12 点半,错 ...

  10. 《自然》评价“天问一号”成功发射—— 全球深空探索走进新时代

    来源:科技日报 北京时间7月23日,重达5000公斤的"天问一号"探测器从海南文昌航天发射中心升空,大约36分钟后进入地火转移轨道,器箭分离正常,探测器太阳翼展开正常,发射任务取得 ...

最新文章

  1. linux usb驱动
  2. 五周第一次课(4月18日)
  3. Performance of Every Day Things by Jeffrey Richter PPT and Code
  4. hdu1865 1sting
  5. Atitit import sql fun 重要的sql功能扩展 ext 目录 1.1. Insert merge 1 1.2. Insert set 1 1.2.1. 13.2.5. LOAD
  6. 微型计算机原理偏移地址,微机原理及应用复习
  7. java你如何调字体大小_eclipse怎样调整代码字体大小 值得一看
  8. 工业以太网交换机特点分析及使用注意事项
  9. 通过路由远程计算机重启,如何通过三种方式重启路由器
  10. js 删除obj对象的属性
  11. 贪吃蛇python游戏
  12. PS制作华丽的紫色立体字
  13. php yar 安装失败_全面解析php7安装yar扩展的方法
  14. 自动控制系统实验总结
  15. 用html写一个道歉的代码
  16. 解决gitlab-runner一直处于等待中
  17. Visual Studio 2017 智能提示英文怎么切换成中文?
  18. 正电荷/内质网靶向性/蓝色/mCy-ER/绿色/开关型/CySeN花菁染料近红外荧光探针的制备
  19. 爬虫用fiddler抓取网易新闻客户端手机app内容
  20. USB与串口的区别简要总结

热门文章

  1. ibatis的ibatorForEclipse的安装与配置和ibator的错误日志查看
  2. [导入]如何调试你的C#程序
  3. 利用grep-console插件使Intellij idea显示多颜色调试日志
  4. 出现”/var/lib/mysql/mysql.sock“不存在的解决方法
  5. python pip安装
  6. Financial Management
  7. 在外围类作用域之外引用外围类的静态成员,类型名和枚举名都要求有解析操作符...
  8. js select 联动
  9. 2018软工实践K班总结
  10. 网络编程 基础 基于socket的tcp和udp连接