Submitted by gouki on 2010, April 25, 9:55 PM
标题这种话已经在被很多人所理解,现在大多数开发人员已经不再把语言当成障碍,而是把思想当成障碍,语言的跨度其实真的很容易解决,但思想不进步,你有着再好的语言又怎么样?即使你用的是所谓的自然语言(即平时生活中的语句),但只要你没有思想,没有逻辑,你又能写出什么样的程序?
以下内容来自老王参加的某大会的记录、摘要。我是看中其中的一小部分,觉得有感触。。原文在这里,点击进入:
部分我认为不错的精华,或者说是我关注的。。。
1、课程:失败来临的征兆(讲师:Michael Nvgard)这一切正是Michael Nvgard先生演讲的主旨:意外的问题总是在不经意间发生,要注意把它们的影响限制在局部,避免拖累整个应用。比如说在SOA中集成若干个服务时,应该 设置好各个服务的Timeout,避免其中一个服务崩溃连带整个系统等待。
2、课程:Twitter的可伸缩性数据架构(讲师:Nick Kallen)
Nick Kallen介绍了Twitter在处理海量数据时的经验,其实总结出来就三条:分区,索引,复制。
着重介绍了Tweets,Timelines,Social Graphs,Search Indices四个基本功能的实现:
Tweets比较简单,就是分区,虽然可以使用id或者user_id来分区,不过目前Twitter使用的是按time分区。
Timelines相对复杂了一些,最开始采用的方法是纯SQL的,大致如下:
SQL代码
- SELECT * FROM tweets
- WHERE user_id IN (SELECT source_id FROM followers WHERE destination_id = ?)
- ORDER BY created_at DESC
- LIMIT 20
这当然不是一个高效的解决方案,后来采用了被称作离线计算(Offline Computation)的解决方案,其思路大致就是每当发送一条推的时候,采用队列存储避免峰值瓶颈,同时向所有Followers分发此消息,然后每 个分发 终端在缓存中完成合并计算。乍一听起来这似乎也不是什么好的解决方案,一旦某人有非常多的Followers,即便分区,这个分发操作也会非常耗时,但按 Nick Kallen的介绍,Twitter确实是这么做的,细节操作有待研究。
剩下的问题不多说了,Nick Kallen给了PPT地址:
http://www.slideshare.net/nkallen/q-con-3770885
3、课程:构建可扩展的微波系统(讲师:杨卫华)
杨卫华作为新浪微博的架构师,这次的PPT做得很酷,虽然在内容上和Twitter有些重复,但还是很不错。
提到了Memcached的evictions问题,给出了三个守则:
1:规划好cache的容量
2:将永久数据和临时性数据分开
3:不使用随机字符串做Key
至于原因,可以参考
杨卫华的博客上的介绍:
Memcached数据被踢(evictions>0)现象分析
4、课程:敏捷在中国(讲师:Tom Mellor) 编程工期的催促往往让程序员只考虑眼前的既得利益,却忽视了后期的风险。
5、课程:如何在团队中有效实施TDD(讲师:麦天志)在阐述为什么即便工期紧张也应该使用TDD的时候,他给了一个比喻:医生做手术的时间很紧张,但即便 这样,手术前清洗双手的工作程序也是必不可少的。在讲解重构时,他强调了TDD是重构的基础,只有这样才能保证重构没有改变现有的行为,否则就不是重构,而是重写。
Tags: 语言, 思想, 参考
PHP | 评论:0
| 阅读:17332
Submitted by gouki on 2010, April 25, 8:30 PM
最近javaeye发生一起小故障,是robbin自己说的:
XML/HTML代码
- @robbinfan: 昨晚JE所在机房切换电源关机导致网站无法访问。早上恢复后因为数据库和缓存服务器都被清空,巨大流量(QPS将近400,并发连接到1000)直接冲击导致web服务被阻塞,现在正在逐步恢复中。
在mikespook.com看到对待这个问题的分析时,突然想起桔子也遇到过类似的问题,所以把他们两个人的事情贴出来。
先上mikespook的:
XML/HTML代码
- 显然,这是一次运维事故。事故的原因是分流作用的数据库和缓存出现“故障”,导致数据层响应延迟,web 服务器阻塞。这里我没有用“清空”而是用了“故障”来描述分流数据库和缓存,是因为实质上 javaeye 的这次事故虽然是正常维护(电源切换)后发生的,但是其表象跟分流数据库和缓存宕机是一样的。
-
- 这个故事给我的两个启示:
-
- 在架构设计上,对于分流数据库或者缓存或许应有一定的持久化能力。比如,在维护时,按照从“外”到“内”的顺序逐步关闭服务。在这个例子里,“外” 就是 web服务,“内”就是数据层。在关闭了“外”服务后,手工或自动将缓存持久化。维护完成,开启顺序从“内”到“外”,并在回复完底层存储后,将持久化数据恢复到缓存。
-
- 在运维规范上,在维护后应让系统进入一个的磨合期,在合理的时间内通过分流(比如跳转到一个“系统忙”的页面)或者防火墙封锁的方式。让系统保持在比正常负载低一些的水平。持续一段时间(或者维护后累计访问量达到某个值)后再让系统开足马力去运行。
-
- 这样,应该可以避免空缓存大并发导致的宕机事故。
-
- 再次感谢 robbin 和 javaeye 为我们带来的启示。
再上桔子的,汗,突然发现桔子的博客上居然没有写,看来是上次在群里看到了,大意如下:
XML/HTML代码
- 某次更新系统,然后需要重启,结果重启后CPU长时间处于100%(?还是死机了?),后来检查发现,原来故障是出在缓存上。
- 因为是采用文件缓存,而又设定了过期时间,重启后,所有的缓存都过期了。然后网站访问量又大,突然而来的访问导致缓存重新生成,差点让机器出故障。
- 所以现在开始要调整缓存架构。
其实上面两个问题都差不多。都是在访问大的时候,缓存频繁生成造成的故障,这确实不容忽略,但如何解决真的是一个问题。很多时候在访问量不大时,我们都考虑使用文件来作为缓存存储。但真正访问量高了后,文件缓存不可避免的就带来IO的消耗,如何批量生成缓存?还是按次生成缓存?还是定有一定的策略?难道还要采用队列?那就夸张了。
所以,一个好的系统架构也是很需要的,不能因为一次宕机就永远起不来。我个人是偏向于队列生成缓存,这样就不用担心一次写入过多文件引起IO的崩溃。但队列是因为有延迟的,如果控制同样的内容不重复生成文件缓存,则需要另外考虑
Tags: 故障, 缓存, 重启, 维护
PHP | 评论:1
| 阅读:18208
Submitted by gouki on 2010, April 23, 10:56 PM
rtf是一种富文本格式,根据RFC的规范,可以将其转为各种文件,如doc,wps等,但如果真的要根据RFC规范一点点的写程序,那就真的太累了。所以。。。我用wps转换了。
以前写过wps生成文档的程序,就是这篇闲着无聊,用WPS生成文档,现在,这个RTF转换到HTML也可以用PHP来完成
PHP代码
- <?php
- $wps = new COM('WPS.Application');
- $wps->Visible = false; //不显示wps界面
- $filename = realpath('./RTF_to_HTML_Converter.rtf');
- $stime = microtime(1);
- for ( $ii = 0; $ii < 1000; $ii++ ){
- $savedfile = "c:\\convert\\{$ii}_test.html";
- $doc = $wps->Documents->Open($filename);
- $doc->SaveAs($savedfile, 8);
- $doc->Close();
- }
- $wps->Quit();
- echo( sprintf( "%0.6f" , (microtime(1)-$stime) ) );
- unset( $doc , $wps );
测试了一下,生成1000个文件,花了257秒,4分多种,可以接受这个时间,只是在转换的时候,CPU超过50%,而且是在命令行下的。如果是在网页界面肯定是没有这么快的了。
PS:转换后,中文编码实体化了,看看中文怎么转,变成这样的格式,它是什么内容呢?它们就是:【看看中文怎么转】<-- 可以看一下源码,就知道这7个字是什么样的了
Tags: rtf, html, wps
PHP | 评论:1
| 阅读:25688
Submitted by gouki on 2010, April 21, 9:56 AM
目前的国内的微博客很多,不少微博客都提供Open API,然而,很多 微博提供的API和Twitter的API有一些或多或少的差别,调用格式上并不完全相同。
我建议所有提供API的微博客系统,都将各 自的API统一为Twitter的API调用格式,例如目前较有影响的开源微博系统StatusNet(Laconica)的API格式就完全兼容 Twitter,这种统一API对于开发者和用户都有很大的好处。对于开发者,针对某一个微博的应用可以快速移植到另一个微博,节省开发时间。对于用户, 用户可以自定义客户端应用程序,只要换一下API地址,就能使用同一个应用程序,来访问各个不同的微博。例如目前很多人通过StatusNet的客户端来 访问Twitter一样,使用起来很方便。
Twitter的API具体是什么格式的呢?根据Twitter API文档和新浪微博开放平台的文档,这里提供了一个Twitter API的中文翻译文档,供开发者们参考。
» 阅读全文
Tags: twitter, api
PHP | 评论:0
| 阅读:26864
Submitted by gouki on 2010, April 19, 2:03 PM
hooks这玩意,一向是被认为是可扩展的代名词,当一个系统启动了hooks后,他就变得可扩展了,同样,他的性能也就需要被众人拿出来做比较了。
目前被很多人拿来做比较的是两款程序:drupal和wordpress,是使用量最大的博客程序之一,在很多人眼里,这两个程序已经脱离了博客,而是CMS了。drupal前后台不分是我最不舒服的地方,所以wordpress才是我的首选。或许大家看到我的TAG里面还有ThinkPHP和QeePHP,那是因为这两个框架都在考虑有行为加入,行为嘛,相对于框架,就当于一个hooks,所以我也加上了这两个框架
thinkphp的Add_filter,add_action和wordpress有点相像 ,而qee因为没有仔细看过,所以不太清楚(flea的时候好象没这个功能)
跑题半天了。上文了
Drupal怎么就知道什么时候调用一个模块来处理特定的请求?
这个是通过Drupal的hook机制完成的,下面解释一下hook的工作机制。
当Drupal处理来自用户的一个请求,它通过一系列步骤进行。比如:Drupal核心首先引导这个应用,确定关键变量和经常使用的功能。接下来,它加载 关键库、主题和模块。接下来,它继续处理请求,将请求的URI映射到正确的处理代码,等等。然后它为数据应用一个主题,为输出来格式化信息。最后它返回输 出结果到用户的浏览器。
在循序渐进的预定义时刻,Drupal进行勾取。这意味着什么呢?简短的说,它意味着Drupal测试部分或全部当前启用的模块,寻找遵循特定的预定义模 块的函数。一些已经连接这个进程到“回调”的模式经常被用在事件处理模块中。Drupal和这个是类似的,但是更加充满活力。
比如说,当它正在创建一个页面浏览内容时,Drupal可能再模块中寻找叫做<modulename>_block() 和<modulename>_view()的函数(在这里<modulename>被每个Drupal检测的模块的名称代替)。 寻找模块包含的这些函数被叫做实施hook_block()和hook_view()勾取。
当Drupal找到这些函数,它执行它们,并且利用这些函数返回的数据创建一个响应来发送给用户。然后Drupal继续循序渐进的处理请求,或许在它进行 过程中执行许多其它的钩子。
当所有的步骤完成并且一个响应发送给用户,Drupal自动清除并且推出。
模块可以定义自己的钩子,这些钩子又可以被其他模块使用。这样一来,hook机制可以扩展到提供复杂的定制行为。
当一个模块提供匹配一个钩子的签名的功能,我们就说那个模块执行那个钩子。比如,假设Drupal有一个叫做hook_example()的钩子。如果我 们定义一个叫做 mymodule 并且包含一个叫做 mymodule_example() 函数的模块,我们就会用到 hook_example().
Hook对于面向对象程序员的启示:
那些对面向对象编程熟悉的程序员可能发现在面向对象语言中考虑将钩子作为一个类似于接口方法或者抽象方法的机制是很有用的。钩子是Drupal将寻找的函 数并在某些情况下需要出现在你的模块中。就像接口方式,一个钩子的函数签名必须匹配Drupal的预期签名。而和接口不同的是,模块开发者可以选择(在一 定程度上)哪个钩子去实现、哪个钩子去忽视。Drupal不要求每个定义的钩子都实现。
参考:《Learning Drupal 6 Module Development》
原文来自:http://www.cnblogs.com/stylesheet/archive/2010/04/16/1713512.html,上次我也写过wordpress的hooks,其实原理都差不多。
Tags: drupal, hooks, wordpress, thinkphp, qeephp
PHP | 评论:1
| 阅读:29228