第二天的演讲一样精彩,相对于第一天的大概念和开发模式而言,第二天的演讲更贴近开发者和架构师,Erich Gamma被冰岛火山灰困住了,没能成行是这一届qcon最大的遗憾。 Facebook的扩展Memcached实战Marc Kwiatkowski讲的十分实在,facebook在memcache上的确是花了很多心思,讲了很多在使用memcache过程中,在高请求数据量的情况下所做的演进和优化工作,相对于国内大并发请求网站处理有较高的参考价值。相较而言Nick Kallen在Twitter的可伸缩性数据架构中的演讲虽然也很精彩不过适用范围就比较狭窄一些了。P.S:Marc Kwiatkowski乍一看很像PB里的Alex Mahone,哈哈。 下午阿里巴巴国际站架构分析和镜像解决方案中我们听到了阿里巴巴在跨IDC的解决方案方面做出的努力,也不错,不过相较而言和第一梯队的技术解决方案而言还有很多需要catch up的地方。 监控和虚拟化技术在“去哪儿”中的应用,作为运维出生的大佬吴永强,监控的演讲十分精彩,很多时候我们防患于未然依赖的就是监控团队在问题浮出表面之前解决问题,网站要做到4个9的可用性也是个很有挑战性的话题。 人人网技术架构的演进演讲中黄晶也大致介绍了人人网的技术架构演讲过程,同时宣布了要开源两个项目Nuclear和Rose,前者是一个分布式存储后者是java的web开发框架,基本上都是服务于业务应用逻辑的东东。Nuclear如果真如介绍所言,那可能是国内最好的Dynamo实践了,当然偶更欣赏豆瓣的BeansDB的简约风格,够用就好。Rose对于我等不用java做前端的人而言意义不是很大,只有让做java前端的朋友评判去了。 构建可扩展的微博系统的杨卫华也就是我们熟知的Tim Yang或者@xmpp的演讲也很精彩,一是大致解释了twitter/微博类应用中常见的技术难题,二是讲解了针对国内情况所需要注意的地方,不过貌似国内的互联网应用界对事务性要求都不是非常关心,我所关心的并发写入队列的时序问题依然没有人回答。 第三天的演讲偏重的主题是SOA,REST部分的演讲个人而言觉得PPT做的不是很好,Jim Webber把一个架构的改造和REST服务的引进绞合在一起来说明REST的优点,感觉比较的牵强附会,在FAQ环节也不容回避的坦白了REST只适用于那些秒级亦或是百毫秒级的应用场景。 个人感觉REST是个好东西但并不是middleware的替代品和解决方案,而只是企业对外接口的一个策略性option和非常聪明的option。一个企业既有内部的ESB服务总线在和其他下游/上游企业/个人交互的时候提供两套接口,一套使用传统的middleware比如DCOM/CORBA/ICE/Thrift/AMQP,另一套采用REST/XML-RPC/SOAP类似的http协议级别的通讯接口,这样一来交互的开发者在初期可以使用REST这类开发接口上手,快速解决问题(比如flickr众多的插件功能),在后期如果上升到企业应用高性能要求的层面再去使用ICE/Thrift这类的高通讯性能接口会是比较稳妥平滑的解决方案。 性能和可扩展性再度归来:内存数据网格 - 萧百龄 好吧我承认oracle的确牛x,做事很多时候都能想前一步,p2p网络的思想与我想的未来的互联网的服务发展方向不谋而合,很多时候感觉oracle/mac就像海洛因,你用多了会high,但也要付出高昂的代价,阿熊还是偏向于自由、免费、分享的理念。 下午 深入浅出复合事件处理(CEP)蔡学镛的演讲中午回酒店一趟拿东西没听到开头,不过感觉支付宝这些年已经折腾了不少好东东,CEP不太了解,唯一担心的是那么大数据量长期放在内存中可靠性如何保证这一定是个难题,支付宝是如何解决的呢,并发写入的时序性是如何保证的呢? 最后两场的演讲都很精彩 淘宝网前端应用与发展 小马哥把淘宝这四年来的演进史讲解了一遍,我想他们遇到的问题大多数团队都会遇到,而各个演讲路程的阶段性解决方案也适合各个成长中的团队借鉴学习。 最后一场是Douglas Crockford的JavaScript的现状和未来,大师的看法和角度已经不是我们普通开发者所站的角度在思考问题了,在web的各个标准层面去思考问题,对安全性的思考尤为重视。他是一位让人尊敬的勇士和斗士。大多数人都在热衷于增加功能(html5)和出于商业考虑兼容过去(IE6)而他却是忧心重重的在思考xss以及相关的安全问题。FAQ环节的第一位仁兄非常无脑的纠缠着namespace/model的问题不放,我真有心冲上去对他说:you havn't think in javascript way.后一位同学诉说了作为BCD(Boss Center Design)方式开发者的无奈,老板逼着你兼容IE6怎么办,老道的回答是尽量去做正确的事,如果我们继续兼容ie6,那它就会一直存在,只有我们联手去抵制它,web才能前进。 总的来说这届qcon还是受益良多的,国际上的领跑者已经在各个应用领域作出了很多研究,这里也分享了一些开发中遇到的问题,国内的领跑者也在前行中分享了不少开发中的经验和教训,也已经通过开发中的这些经验教训抽象总结出了不少好的作品做开源来推动国内的开源事业。只不过个人感觉互联网大公司之间的沟通交流还十分有限,都在着眼于各自的开发问题而造新的适合自己的轮子,如果将来能多做沟通形成标准,提出一套通用的类似Dynamo一样量级的解决方案或理论实践就更美好了。 BTW: 会展有很多细节做得还不太到位: 同声传译是个老问题,就第一天试了一下,后面还是干脆听原声来的清楚,明了不漏词。 座位没有学习电影院的排法,交错排放,前面人腰板一挺直,我就看不全ppt的幻灯。 主持人有些时候给人的感觉不太专业或者说不会把握FAQ环节的节奏,有些时候甚至该进入FAQ环节了人还没出现。
四
阿熊QCon笔记1
四
阿熊QCon笔记0
Michael Nygard 失败来临的征兆 基本上从经验上总结了系统的各个开发阶段可能出现的问题,qa并不能完全保证系统的可靠性,线上的情况很多时候无法预测, 所有着一些的Fault/Failture的预防方式给出了很多有益的建议,关键点是 尽可能完善的测试, 控制错误传播的范围, 降低服务间的耦合性以及服务间的依赖关系, 在SOA的体系中要有所谓的严重错误Breaker机制来预防蝴蝶效应带来的一系列严重后果。 另外举的一个服务压力由于突发性事件而导致的整个系统后端处理能力不足的问题,我想这也和bluedavy之前twitter里提到的的QOS不谋而合。 Paul King 动态语言的敏捷开发实践 总结了比较好的语言开发中的包括设计模式、语言特性等等开发方面的问题,但提出的解决方案groovy个人而言觉得思想上在现阶段的企业开发中还有所欠缺。 groovy也许可以提供更高速、敏捷的开发方式(或许在将来会是一个所有语言发展的趋势),但他依然存在动态语言的一个不容回避的问题-性能,尤其在企业SOA服务化的进程中,性能往往比较重要。paul在Q&A环节也遭遇到了这一问题,他也非常委婉的表达了动态语言的强项主要在敏捷开发上,同时底层依赖于java的服务,如果有必要则可以改写成java。 其实现有的企业解决方案中已经有了比较适合的方案,比如Cython之于python在豆瓣上的应用,又比如hiphop-php之于php在facebook的应用,虽然目前的应用面不广,语言跨度也仅局限于php和c++,但理念比较实用:动态语言编写,编译成静态语言和对应的字节码运行。这种理念即有了动态语言的灵活快速迭代开发的特性,又有了编译语言的高速高效,同时在系统逐渐稳定需求沉淀后,进一步对生成的静态语言代码做进一步优化和编译即可。 系统架构与最佳实践及创新的关系,李伟 关键词: 架构师:强制技术约束 Operational Concept 设计最佳实践: 并发能力,队列和调度 容错能力,识别,检测,评估,恢复,掩盖
四
关于转载
阿熊这里的技术文章大部分是属于总结归纳的文章,大部分是在参考别人的文章后结合实际的遇到的情况而整理修缮成文的。 其实在互联网尤其在中国互联网,基本上没什么版权可言,但现实并不代表不需要原则。 转载技术文章阿熊的原则是:你可以全文一致性copy但希望能注明来源出处,你没有做过对应的思考和实践,对你的流量和读者是不负责的。 当然如果你还非要帮阿熊的文章改头换面查找替换关键字归纳成自己的原创,其实大部分时候阿熊也拿你没辙,只是感觉这样的人性觉悟已经沦落如斯,真是对其自己智慧和人格的侮辱。 关于文章本身,保留版权,但可非商业性使用,署名,禁止演绎的方式转载,具体见Creative Commons协议。 还是那句话,自己去思考去实践,去帮助你的读者,不要把人生浪费在为人不齿的事情上。 阿熊这里的电影文章都是自己的观影感受,不欢迎转载,但如果您喜欢欢迎交流。
公司的小童鞋们还是用win的多,没法子,装虚拟机,vmware太大,virtualbox也差不离,这些虚拟机都不爽,于是还是装个colinux比较方便一些,速度快,资源占用小,如果没有什么定制性的需求也可以安装andlinux,基本上属于傻瓜式安装搞定,如果和我一样喜爱ubuntu 的话也可以安装TaijiUbuntu 。 1. 基本安装配置 1.1 基本下载安装 ok,开始: 先去http://www.colinux.org/下载最新的windwos发行版binary包 coLinux-0.7.6.exe 以及在http://sourceforge.net/projects/colinux/files/中AllFiles里找到 Images 2.6.x Ubuntu》 Ubuntu 9.04》Ubuntu-9.04-1gb.7z 下载之, colinux的guest机的磁盘rootfs系统就是这个文件,不过显然9.04以及1GB的磁盘空间是无法满足我的需求的,我们先把这个系统挂载上,后面再做磁盘扩展的工作。 安装coLinux-0.7.6.exe前需要先装wincap,去下个WinPcap_4_1_1.exe安装之。 安装的时候记得勾掉Root Filesystem image Download,安装包指定的发行版我们用不着下载,所以这里去掉勾选。 我现在假设coLinux安装在d:\opt\coLinux下。 顺便去下载个Xming(windows下免费的XServer)网址: http://sourceforge.net/projects/xming/files/ 下载安装: Xming》 6.9.0.31》Xming-6-9-0-31-setup.exe 假设安装在d:\opt\Xming 如果像阿熊一样懒的话直接下载Xming-fonts》7.5.0.11》Xming-fonts-7-5-0-11-setup.exe 这样在win下理论上就不用自己去做fonts-cache了。 最后还有个Xming-mesa,是基于OpenGL编译的Xming感觉没什么必要。 1.2 基本配置 安装完上面的基本环境后colinux默认会添加一个tap设备, 我们先把自己的主网络连接(通常名为“本地连接”)改名为local 然后把这个colinux新添加的tap设备改名为tap-colinux 上面事情都做好了我们来建一个colinux的配置文件,以下为我的配置清单,大家也可以根据自己本地colinux默认自带的example.conf配置对照修改。 # # This is an example for a configuration file that can # be passed to [...]
非常惭愧的还没有抽出时间去学一学git,权且先在这里记录一下当下的比较主流的subversion(svn)的架设记录,网上已经有很多了,在这里只是整理记录一下而已。 svn目前作为服务总体上有两种常见形式svn自身协议的方式或者走http协议,svn自身协议自不待言搭建简单方便一条命令搞定: sudo svnserve -d --listen-port 1234 --listen-host scm.myhost.com --pid-file /var/run/svnserved.pid -r /scm/svn/repos/myproject 各参数大致意义: -d 指定后台daemon服务方式运行 listen-port 监听端口 1234 listen-host 监听域名 scm.myhost.com pid-file 指定运行时进程PID号记录文件路径 /var/run/svnserved.pid -r 指定项目svn库所在路径。/scm/svn/repos/myproject 一旦架设完成后面就可以用svn checkout检出源码了: svn co svn://scm.myhost.com:1234/myproject svn库创建命令 svnadmin create /scm/svn/repos/myproject 建立好基本库后一般都需要构建一下基本的源码管理layout布局: mkdir -p /tmp/layout/{trunk,branches,tags} cd /tmp/layout svn import . file:////scm/svn/repos/myproject -m 'init project layout' 然后我们以后checkout主线代码就可以: svn co svn://scm.myhost.com:1234/myproject/trunk svn的http协议方式目前还依赖于apache容器,不过你愿意的话也可以前端用varnish/nginx把请求转发到apache容器上也可以达到对外统一服务的目的。 [...]
关于thrift,可能一般情况下用到的人不多,不过在类似于facebook这样的大型系统中,需要一个统一的数据接口去连接内部的各个子系统,这个时候中间件就必不可少了,thrift主要用于rpc类的中间件,当然自己定义理论上也可以用来做异步消息处理的底层,异步消息这方面成熟的开源产品还是很多的,比如rabbitmq之类的,大公司也大多数有参考或在使用自己开发的对应产品。
网上文章很多wordpress配合nginx的文章,阿熊收集整理了一下,做了一个我的本地配置版本,支持WP Super Cache插件,修正pathinfo在nginx下的问题,当然不用说,也支持nginx下的url做rewrite功能。
关于安全其实能讲的有很多,这里只是简单的记录一下我的iptables设定, 我开有22(ssh)服务,1194(openvpn,tcp)服务,80(http)web服务,443(https)web服务, 我在实体机器上的设定: #!/bin/sh iptables -P FORWARD ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i tap+ -j ACCEPT iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tap+ -j [...]
以下内容为个人配置笔记,仅供参考,请勿用于生产环境 其实本人对vpn服务的搭建比较陌生,主要参考的还是这篇文章http://freshventure.wordpress.com/2009/12/22/在ubuntu上搭建openvpn服务器,并配合mac和windows的客户端/(需要翻墙) 在这里重新撰写一篇算是备份外加自己的整理,在最后还有一篇关于搭建ssh反向代理服务的简单说明。 首先安装openvpn: sudo apt-get install openvpn 然后拷贝ca证书,server证书和client证书的生成脚本到我们自己的配置路径下,还有样例的服务器配置文件也解压一份,捣鼓一番: cd /etc/openvpn/ sudo cp -af /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn gzip -d server.conf.gz 进入/etc/openvpn/easy-rsa开始生成根证书、服务器证书、和客户端证书,注意这一步最好以root身份执行,证书生成完了后把ca证书也就是根证书和你个人的客户端证书和私钥拿出来即可: 切换到root身份: cd /etc/openvpn/easy-rsa/ sudo -sH 清理环境构建配置目录: source ./vars ./clean-all 构建CA根证书,回答该回答的问题,国家代号和省一级的代号都是两个字符,中国是CN,当然你设个不存在的地方也没人来找你,不建议设置密码: ./build-ca 构建服务器证书,回答该回答的问题,不建议设置密码: ./build-key-server server 构建个人证书也就是客户端证书,建议设置密码: ./build-key client1 命令中的client1为你个人证书的名字可以随便,比如nick,axiong,chunge,lurenjia等等。 然后构建Diffie Hellman参数,这部可能要花几分钟时间生成随机数,你如果对安全比较在意可以在vars里设置为2048位的,这些主要是非对称加密算法里用来保证安全用的。 ./build-dh 在这些证书都生成完成后建议退出root身份。 在证书啥的都搞定了后可以开始搞服务器配置了: sudo vi /etc/openvpn/server.conf 服务器的配置没啥好多说的,偶这里就灰常没牙齿的拷贝一下freshventure的注释版,改改并加上收集来的资讯,适应我的配置了: # 写入你vps的公网ip地址 local 64.233.189.104 [...]
以下内容为个人配置笔记,仅供参考,请勿用于生产环境 varnish基本上是一个不错的squid替代品,个人研究和使用不多,在小型应用中出场的机率不大,不过在这里还是简单介绍一下在ubuntu下的安装配置。 sudo apt-get install varnish 软件就安装完了,配置的话需要配合你的应用服务,比如我的设置方式:让nginx监听在8081端口,而ip默认的80端口让给varnish来做第一道处理。 修改/etc/default/varnish配置文件: sudo vi /etc/default/varnish 将DAEMON_OPTS里的-a :6081改为-a :80 最后内容例如: DAEMON_OPTS="-a :80 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G" 然后编辑你的varnish配置文件:/etc/varnish/default.vcl, sudo vi /etc/varnish/default.vcl 在我的应用中后端是本机的nginx监听8081端口则修改/添加: backend default { .host = "127.0.0.1"; .port = "8081"; } 我的这段backend名称为default,在后面的请求处理环节需要把指定域名的请求转发给我的backend: sub vcl_recv { if (req.request != "GET" && req.request != "HEAD" && req.request [...]
