Posted on 2010-07-24 20:51
dennis 阅读(2000)
评论(1) 编辑 收藏 所属分类:
涂鸦 、
工作随笔
转眼间快到8月,已经过去了两个季度,是时候稍微总结下干了什么,以后想干什么。从春节到现在,我仍然是做淘宝的消息中间件Notify的开发,中间额外去做了一个多月的另一个项目的开发,重拾了web开发的一些东西。
这半年来Notify的改进集中在通讯层的改造,引入AMQP的订阅模型,以及将重要消息从oracle迁移到mysql做HA方案,这一过程是一个慢慢稳定系统的过程。新版本刚出来的时候有不少BUG,有些BUG很严重,幸运的是没有造成严重的后果,再一次提醒我小心,小心,再小心;小心是一方面,工作有没有做到位是另一个方面,暴露出来的问题还是单元测试不全面,以及麻痹大意心态下的不警惕,对关键代码认识不清,code review也没有做到位等等。
Notify做到现在,剩下的问题是一些很难解决,又非常关键性的问题,如消息的去重,消息的顺序性,以及消息的可靠存储。我说的这些问题都是在分布式集群环境下需要解决的问题,如果仅仅是单台服务器,这些问题的解决还算不上特别困难。消息的去重,基本的思路是在客户端和服务器之间各自维持一个状态,用于保存当前消息的处理情况,依据这个情况来做消息的去重,但是状态的保存对服务器和客户端来说都是一个额外的负担,并且很难做到可靠的存储,如果状态丢了,去重的目的就没办法做到。ActiveMQ里是在服务器和客户端都维持了一个bitmap做重复的检测,但是这个bitmap大小必然是受限的,并且无法持久保存的。消息的在集群环境下的顺序性,涉及到集群环境下的事件的时间顺序问题,除了使用分布式锁来保证一致性之外,暂时也没有好的思路去解决。消息的可靠存储,今年我们的目标至少是脱离oracle,目前实现的HA mysql双写的实现已经开始部署到交易这样的核心系统上,第三个季度将慢慢地全部切换过去。下一步的目标是将消息存储到key-value系统上,但是需要解决的是索引的问题,因为消息的恢复涉及到查询,并且需要根据一些特殊条件做查询以应付诸如尽快恢复重要消息这样的功能,因此目前的一些key-value系统要么在索引功能上太弱,要么在集群功能上太弱,要么在大数据量存储上有局限,因此不是特别切合我们的场景,因此一个可行的方案是将消息的header继续存储在关系数据库,方便做查询,而将数据较大的body存储在key-value上,减轻数据库的负担。今年,我们还是希望能在以上3个方向某个方向做出突破。
这半年来技术上的收获,第一个季度业余时间都去打游戏了,没方什么心思在学习和工作上,后来去学习了下ASM,总算对java的byte code,以及jvm执行byte code过程有了个理解,然后利用ASM去搞了aviator这个项目。接下来开始做服务器的SEDA改造,这个过程完成了部分,但是不满意,SEDA的模型过于理论化,模型是好的,但是在stage controller的实现上目前没有可供参考的经验,做到资源的自动控制更需要实际的测试和实践,基本的指导原则只能作为参考。另外,最近下决心去重构整个项目,从一个一个类看起,看到不爽的地方马上去做重构,这个过程,我又去重看了下《重构》中的原则,在谈论诸如分布式、海量数据存储、云计算这样的大词之前,我需要的做的仍然是将代码写好,写的漂亮。也许是时候回到本源,再去重读下《设计模式》,重读下《重构》,既然我还在写java代码,那还是希望写的更好点。
另外,我现在喜欢上了clojure语言,并且正儿八经地找了本书好好学习,从源码和bytecode入手去理解它的实现。我为什么喜欢clojure?
首先,它是LISP的方言之一,LISP的优点它全有,LISP的缺点它能想办法避免。Clojure也有宏,也有quote,也有将procedure as data的能力,Clojure的数据结构都是immutable,此外还是persistence,避免了immutable数据大量拷贝带来的开销。Clojure的数据结构还天生是lazy的,表达能力上一个台阶。Clojure在语法上更多变化,某些程度上降低了括号的使用频率,这一点有利有弊。Clojure的内在原则是一致的,核心语法非常简单,它没有多种范式可供选择,因此没有scala那样复杂的类型系统,没有为了包容java程序员引入的OO模型(有替代品),使用clojure最好的方式是函数式地,但是它的扩展能力允许你去尝试各种范式。
其次,Clojure对并发的支持更符合一般程序员的理解,它只是将锁替换成了事务,利用STM去保存可变状态,但是却避免锁带来的缺点——死锁、活锁、竞争条件。它没有引入新的模型,这对习惯于用锁编程的同学来说,STM没有很大差异,你可以将它理解成内存型数据库。
第三,最重要的一点,Clojure是实现于JVM之上的,Java上的任何东西它都能直接利用,并且利用type hint之类的手段可以做到性能上没有损失。尽管Java语言有千般不是,但是寄生于整个平台之上的开源生态系统是任何其他社区都很难比拟的,放弃Java平台这个宝库,暂时还做不到。过去学习scheme,学习common lisp,更多的目的是开阔眼界,现在能实际地使用,还能有比这更幸福的事情吗?
下半年技术上想学习什么呢?除了clojure之外,我想去看下haskell,了解下什么是mond,除此之外,就是收收心将《算法导论》读完吧。另外,收起对awk和shell编程的偏见,好好熟悉下这两个工具,dirty and quickly的干活有时候还是很重要的。
我还是个典型的码农,喜欢写代码,喜欢尝试新东西,至少热情和好奇心还残存一些,那么就继续当好码农吧。