??xml version="1.0" encoding="utf-8" standalone="yes"?>国产黄在线观看免费观看不卡,日韩成人精品,久久久久久久久久久久久夜http://www.aygfsteel.com/killme2008/category/45690.html生活、程序、未?/description>zh-cnTue, 17 Apr 2012 21:17:38 GMTTue, 17 Apr 2012 21:17:38 GMT60JavaE序员常用工具集http://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.htmldennisdennisTue, 17 Apr 2012 09:05:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.htmlhttp://www.aygfsteel.com/killme2008/comments/374936.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/374936.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/374936.html    我发现很多h没办法高效地解决问题的关键原因是不熟悉工P不熟悉工具也qŞ了,甚至q不知道怎么L工具Q这个问题就大条了。我惛_下我能想到的一个JavaE序员会用到的常用工兗?br />
一、编码工?br />
1.IDEQ?a >Eclipse或?a >IDEAQ熟悉尽可能多的快捷键,?a >Eclipse常见快捷键列?/a>?br /> 2.插gQ?nbsp;
(1) FindbugsQ在release之前q行一ơ静态代码检查是必须?br /> (2) CloverQ关心你的单元测试覆盖率
(3) Checkstyle 代码风格?br />
3.构徏和部|工?ant或?a >mavenQ现在主都是maven了吧Q?a >使用nexus搭徏mavenU服Q再加上持箋集成jenkins。代码质量不用愁?br />
4.版本理工具Q?svn或?a >git

5.diff和patch

6.讄你的eclipse或者IDEAQ如formatter,save actions以及code template{。代码风|直接用google的也可以啊。?a >Google style guide?br />
7.掌握一个文本编辑器QEmacs或者VIMQ熟悉常用快捷键。这在你需要在U编辑代码,或者编写其他语a代码时候特别有用。?a >器圣战?br />
二、JDK相关

1.jstat : 观察GC情况Q如Q?br />
jstat -gcutil pid 2000

2.jmapQ查看heap情况Q如查看存活对象列表Q?br />
jmap -histo:live pid |grep com.company |less 

或者dump内存用来分析Q?br />
jmap -dump:file=test.bin pid

3.分析dump的堆文gQ可以用jhat:

jhat test.bin

  分析完成后可以用览器查看堆的情c这个工L分析l果q比较原始,你还可以?a >Eclipse MAT插gq行囑Ş化分析,或者IBM?a >Heap Analyzer.

4.jvisualvm和jconsoleQ?JVM自带的性能分析和监控工P怎么用?误q文档?/a>

5.jstackQ分析线E堆栈,?br />
jstack pid > thread_dump

    查看CPU最高的U程在干什么的Ҏl合top和jstackQ?a >http://www.iteye.com/topic/1114219


6.更多JVM工具Q参见官Ҏ档:http://docs.oracle.com/javase/6/docs/technotes/tools/

7.学习使用btrace分析javaq行旉题。?a >Btrace使用?/a>?br />
8.GC日志分析工具Q?a >GC viewer?a >GC-console或?a >自己挑吧?/a>

9.性能分析工具Q除了自带的jvisualvm外,q可以用商业?a >jprofiler?br />
10.JVM参数大全

11.?a >JVM调优标准参数陷阱》,iteye脓?br />
三、Linux工具

1.熟悉常用的shell命oQ?/a>


3.使用htop替换top?br />
4.熟悉?a >strace,gdb甚至systemtap来分析问题?br />
5.熟悉vmstat,iostat,sar{性能l计工具?/a>

5.自动化部|脚本,
py-fabric或者自荐下我的clojure-control?br />
四、其?br />
1.掌握一门脚本语aQ?a >Python或?a >RubyQ高效解决一些需要quick and dirty的Q务:比如d文g、导入导出数据库、网늈虫等。注意不是python.comQ咔咔?br />
2.使用Linux或者Mac ospȝ作ؓ你的开发环境?br />
3.升你的“g工具”Q双屏大屏显C器、SSD?G内存甚至更多?br />
4.你懂的:https://code.google.com/p/goagent/

五、如何查扑ַP

1.搜烦引擎Qgoogle或者baiduQ?a >搜烦技?/a>?br />
2.万能的stack overflowQ?a >http://stackoverflow.com/

3.虚心问牛人?br />
六、最重要的是⋯⋯

一颗永不停止学习的心?img src ="http://www.aygfsteel.com/killme2008/aggbug/374936.html" width = "1" height = "1" />

dennis 2012-04-17 17:05 发表评论
]]>
最q做的一些事?/title><link>http://www.aygfsteel.com/killme2008/archive/2012/01/15/368548.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 15 Jan 2012 04:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2012/01/15/368548.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/368548.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2012/01/15/368548.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/368548.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/368548.html</trackback:ping><description><![CDATA[<br />    很久没写blog了,写写最q做的一些工作,l感兴趣的朋友做参考?br />    首先是我们的<a >kafka</a>?#8220;复制?#8221;metamorphosis做了1.4版本Q实C同步复制ҎQbroker本n也做了很多优化,M而言meta是一个非常成熟可用的产品了。甚臛_以说是我在淘宝做的最好的一个品。有些朋友L问我们ؓ什么不直接用kafkaQ而要另写一个?q里做个l一的解{?br />Q?Qkafka是scala写的Q我对scala不熟悉,也不待见Q考虑到维护和语言熟悉E度Q用java重写仍然是最好的选择?br />Q?Q其ơ,kafka的整个社区非怸z跃Q发展太慢,而我又不愿意d习scala来参与社区发展,那么唯一的出路就是自己写?br />Q?Qkafka的一些工作不能满x们的要求Q比如一开始它qproducer的负载均衡都没有Q它的消费者API设计q是比较蛋疼的。它也不支持事务Q没有考虑作ؓ一个通用的MQpȝ来用。ƈ且它也没有高可用和数据高可靠的方案?br />Q?Q我们做了什么呢Q?br />a.用javad重写整个pȝQ除了原理一_整个实现是彻底重新实现的?br />b.我们提供了生产者的负蝲均衡Q仍然是ZzkQ,重新设计了消费者APIQ更W合 JMS的用习惯?br />c.我们提供了事务实玎ͼ包括producer和consumer端的Q包括本C务和W合XA规范的分布式事务实现?br />d.我们提供了两U数据高可靠ҎQ类似mysql的异步复制和同步复制Ҏ。通过消息复制到多个节点上来保证数据的高可靠?br />e.我们提供了http协议的实玎ͼq且本n使用协议也是cMmemcached的文本协议,内部也增加了很多l计目Q可以以memcached的stats协议的方式来获取U文本的l计信息。整个系l运l很方便?br />f.提供了很多扩展应用:q播消费者的实现Q多Uoffset存储的实玎ͼ默认的zookeeperQ还有文件和mysql)Qtail4j用于作ؓagent发送日志,log4j appender扩展用于透明C用log4j发送消息,hdfs writer用于消息写入hdfsQstorm spout用于消息接入storm做实时分析,基本上Ş成一套完整的工具铑֒扩展?br />g.一些其他功能点Qgroup commit提升数据可靠性和吞吐量,q接复用Q集下的顺序消息发送,消息数据的无痛迁Ud水^扩展Qweb理q_{?br /><br />    meta未来会走开源的路子Q不q不会是我来推动的,估计是在今年会有q展?br /><br />    我最q还写了一些小目值得一提,首先?a >aviator</a>q个轻量U的表达式执行引擎发布了2.2.1版本Q主要是q么几个改进Q?br />Q?Q支持多l数l变量的讉KQ如a[0][0]<br />Q?Q添加Expression#getVariableNames()用于q回表达式的变量列表<br />Q?Q添加AviatorEvaluator#execҎ来简化调?br />Q?Qbug修正{?br />    maven直接升Q?br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "> </span><span style="color: #0000FF; "><</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">></span><span style="color: #000000; "><br />                        </span><span style="color: #0000FF; "><</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">></span><span style="color: #000000; ">com.googlecode.aviator</span><span style="color: #0000FF; "></</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">></span><span style="color: #000000; "><br />                        </span><span style="color: #0000FF; "><</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">></span><span style="color: #000000; ">aviator</span><span style="color: #0000FF; "></</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">></span><span style="color: #000000; "><br />                        </span><span style="color: #0000FF; "><</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">></span><span style="color: #000000; ">2.2.1</span><span style="color: #0000FF; "></</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">></span><span style="color: #000000; "><br />        </span><span style="color: #0000FF; "></</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">></span></div><br />    其次Q?a >hs4j</a>q个handler socket的客LQ由新浪微博的@赵鹏城实Cinc/dec协议Q添加了incr和decrҎ用于更新计数Q感谢他的A献,如果你需要这两个功能可以自己从github拉取源码q构建打包,暂时不准备发布到maven?br /><br />    W三Q关注高可用的Transaction Manager实现的可以关注下我的<a >ewok</a>目Q这是一个基?a >BTM</a>q个开源JTA实现Q提供基于bookkeeper的高可用的TM目。将事务日志写到高可用的bookkeeper上,q利用zookeeper来做到故障的透明q移Q某个TM挂了Q可以在其他机器上从bookkeeper拉取日志q恢复。代码已l稳定ƈ做了性能试Q没有做q一步的破坏性测试?a >BTM</a>是一个比JOTM和atomikos更靠q开源JTA实现Qƈ且性能也好上很多,代码质量更不用说Q徏议有兴趣的可以看一下。我也ؓ它A献了<a >一个事务日志写入优化的patch</a>Q日志写入性能提升了近一倍?br /><br />    最后,我在clojure上做了一些事情,首先是ؓ<a >storm</a>目贡献了两个patchQ利用curator做zookeeper交互和添加storm.ui.context.path选项Q前者被作者接受,后者暂时只Ҏ们有用。前者让storm跟zk的交互更可用Q后者是为storm uid了可选的相对路径。你都可以在<a >我fork的分支上</a>试Qcurator的patch在storm 0.6.2上发布,现在q是snapshot状态。昨天晚上牙痛睡不着Q半夜写了个<a >clojure STM profiler</a>Q用于统计分析clojure STMq行状况Q诸如事务运行次数和旉Q事务的重试原因和次数等Q可以针Ҏ个dosync的form做统计,有兴也可以看下。不q我其实更想这个功能加入到clojure核心Q会试提交下pull request?br /><br />   q有个工作上的变q,我将??h式从呆了q三q的淘宝职Q加入一支充满活力的创业团队。从E_的大公司出来Q去加入一家初创公司,不能说没有风险,但是我还是想L受新的挑战,愿意更新我的知识l构Q愿意向牛h们学习。我在某个blog上说我今q遇C人生中最大的挑战和{折,q不是说q个事情Q而是我的儿子今年患了一场重病,庆幸在很多h的帮助和兛_下,他勇敢地Zq来Q度q最困难的一养I现在q在l箋ȝ。我要感谢很多hQ感谢淘宝,感谢我的TL华黎和锋寒,感谢我的同事和朋友林轩,感谢我们的HRQ感谢三q后打交道的很多同事。没有他们,我今q真的过不了养I没有他们Q我也不能进入淘宝ƈ呆上快三q?br /><br />   最后的最后,我要特别感谢我的儿子Q谢谢你的降生,谢谢你今q的勇敢Q谢谢你l我们全家带来的快乐Q谢谢你l箋陪着我们 Q也希望你新ql勇敢地坚持下去Q我们必战胜一切?nbsp;     <br />   <img src ="http://www.aygfsteel.com/killme2008/aggbug/368548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2012-01-15 12:50 <a href="http://www.aygfsteel.com/killme2008/archive/2012/01/15/368548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>找bug?2)http://www.aygfsteel.com/killme2008/archive/2011/09/02/357774.htmldennisdennisThu, 01 Sep 2011 16:02:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/09/02/357774.htmlhttp://www.aygfsteel.com/killme2008/comments/357774.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/09/02/357774.html#Feedback5http://www.aygfsteel.com/killme2008/comments/commentRss/357774.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/357774.html    q篇blogq到了很久,本来是想写另一个跟|络相关bug的查找过E,偷偷懒,写下最q印象比较深ȝbug。这个bug是我的同事水寒最l定位到的?br />    前几个月同事报告U有一个线上MQ集群会同一旉抛出ArrayIndexOutOfBoundsExceptionq个异常Q也是数组界。查看源码,除去一些无关紧要的l节大概是这样子Q?br />
public class ConnectionSelector{
    
private AtomicInteger sets=new AtomicInteger(0);

   
public void selectConnection(List<Connection> connList){
          
if(connList==null)?br />                return null;
           ?br />          
final int size = connList.size();
            
if (size == 0) {
                
return null;
            }
           
return connList.get(sets.incrementAndGet() % size);
}

   }

    很显Ӟq里的本意是实现一个轮询的q接选择器,q回一个选中的连接。用AtomicInteger递增q对链表大小取模Q返回结果烦引位|的q接。异常抛出的位置是我代码中标红的位|?br />
    昄Q这里有两种可能Q一U情况下是说在执行那一行代码的时候,connList的大羃了Q也是说连接可能被其他U程UdQ,那么D取模的结果越界。另一U可能是取模的结果本w确实超q了列表范围?br />
    W一U情冉|完全可能的,因ؓ服务器的q接可能随时断开或者重q,但是q种情况相对非常见Q因此我们这里ƈ没有对这个选择q程做同步,主要是从性能的角度出发,偶尔的失败可以接受。很遗憾的是Q我被我的思维惯性误gQ从来没有怀疑过W二U情况,L认ؓ是不是真的连接恰巧断开Dq个异常Q但是却无法解释q个异常发生后就一直错误下去,无法自行恢复?br />    Z么说思维惯性误导呢Q这里的问题其实是负数取模的问题Q对一个负数进行取模,l果会是正数q是负数Q答案是l果因语a而异?br />    我很早以前在使用Ruby的时候做q测试,负数取模l果为正敎ͼ例如在irb里尝试下Q?br />
>> -1000%3
=> 2
>> -2001%4
=> 3

    q个印象持箋至今Q在clojure里结果也是这样子Q?br />
Clojure 1.2.1
user
=> (mod -1000 3)
2
user
=> (mod -2001 4)
3

    可以再试试python:
Python 2.7.1 (r271:86832, Jun 16 201116:59:05
[GCC 
4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type 
"help""copyright""credits" or "license" for more information.
>>> -10000%3
2
>>> -2001%4
3

    q三U语a的结果完全一_l果都ؓ正数。这个惯性思维延箋到java却不成立了,可惜我根本没做测试,让我们试下:
   public static void main(final String[] args) {
        System.out.println(
-1000 % 3);
        System.out.println(
-2001 % 4);
    }

打印l果为:
-1
-1

    果然Q在java里负数取模的l果敎ͼ而不是我习惯性地认ؓ是正数。因此最l的定位到的原因是setsq个变量递增过Integer.MAX_VALUE后越界变成负CQ取模的l果敎ͼD抛出数组界的异常,q也解释了ؓ什么同一个集都在同一旉出问题,因ؓq个集群内的机器启动旉盔Rq且调用q个Ҏơ数相对q_?strike>修正问题很简单,加个Math.abs好?/strike>

    Update:加个abs是不够的Q因为Math.abs的javadoc提醒了:
Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative representable int value, the result is that same value, which is negative.

    也就是说对Integer.MIN_VALUE做absl果仍然是负数。尽在q个场景中失败一ơ可以接受,但是最好的办法q是回复中steven提到的抵消符号位的做法:
(sets.incrementAndGet() & 0x7FFFFFFF% size
   
    q个问题更详l的讨论后来我找?a >q篇博客Q作者讨论几U语a和计器的这个问题的l果Q给Z一些结论。不q我觉的q个l论可能也不是那么可靠,特别是对c/c++来说Q很大程度上应该q是依赖于实玎ͼ最可靠的办法还是强制结果ؓ正?br />
    q个bug的几个教训:
1、首先是W一ơ出现的时候没有引赯够重视,重启解决问题后没有深I。有句玩W话Q?9Q的E序问题都可以通过重启解决。但是事实上问题仍然存在Q该发生的终I还会发生。不你信不信,它就是发生了Q这是一个奇qV?br />2、注意大脑的思维惯性,l验M和教条主义都不可取。最q在M本好书?a >暗时?/a>》,大脑误导我们的手D可是多U多栗?br />3、最后就是这个负数取模的l果因语a而异Q不要依赖于特定实现?br />   

dennis 2011-09-02 00:02 发表评论
]]>
写DSL的步?/title><link>http://www.aygfsteel.com/killme2008/archive/2011/07/25/355010.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 25 Jul 2011 11:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2011/07/25/355010.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/355010.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2011/07/25/355010.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/355010.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/355010.html</trackback:ping><description><![CDATA[<br />1.选定宿主语言Q最好选用元编E能力强悍的语言作ؓ宿主语言?br />2.定DSL的样子,<strong>让脑袋空白,不去考虑M实现问题</strong>Q纯_Ҏ考你惌实现的dsl是什么样?br />3.用你惌的DSL写一?strong>最基本的例子,只包括最基本的功?/strong>?br />4.开始实现DSLQ尽快让你的DSL例子?strong>dirty and quick</strong>的方式跑h?br />5.写更多DSL的例子,慢慢包括你想要的所有功能,q一一实现Q在q个q程中你可能改变DSL的样子,原来模糊的东西渐渐清楚?br />6.大功告成Qreview你的代码q添?strong>自动化测?/strong>Q将代码中dirty和bad smell的部分一一剔除?br />7.让你的DSL接受实际应用的考验吧?br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/355010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2011-07-25 19:30 <a href="http://www.aygfsteel.com/killme2008/archive/2011/07/25/355010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最q对kafka的移植工?/title><link>http://www.aygfsteel.com/killme2008/archive/2011/05/07/349731.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 07 May 2011 02:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2011/05/07/349731.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/349731.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2011/05/07/349731.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/349731.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/349731.html</trackback:ping><description><![CDATA[    <a >Kafka</a>q个linkedin开源的MQQ我在过ȝ<a href="http://www.aygfsteel.com/killme2008/archive/2011/01/20/343284.html">blog</a>单介l过。最q?周来Q我的工作就是做它的一个JavaUL版本Qkafka是用scala写的Q基于维护和定制的角度,q个拯的版本还是用Java。说拯Q也不尽Ӟ原理相同Q但实现完全换过Q从数据l构到通讯框架、通讯协议、程序组l,乃至一些重要功能点上都做了改进和更新。我这个Java版本取名为metamorphosis,也就是卡夫卡的代表作《变形记》的英文名?br /> <br />     在原版本上,目前做了如下改进Q?br /> 1、协议替换ؓ文本协议Q整个协议类似memcachedQ文本协议的优点自不必说。通讯框架也是采用内部使用的通讯框架Q减工作量?br /> <br /> 2、存储结构上也采用自定义l构Q更z紧凑?br /> <br /> 3、kafka原来只支持consumer和broker之间的服务查扑֒负蝲均衡Qmeta加入了producer和broker之间的服务查扑֒负蝲均衡?br /> <br /> 4、Consumer API没有采用kafka的stream方式Q而是同时实现同步获取和异步订阅两U方式,更接qJMS和Notify?br /> <br /> 5、改q了服务器端文grecover的性能Q采用ƈ发多U程recover的方式(可选)?br /> <br /> 6、添加了实时l计功能和协议,cMmemcached的stats协议,响应透明号召?br /> <br /> 7、客L的连接复用?br />     <br />     以后要做的事情,可能包括Q?br /> 1、实现类似Mysql的master/slaveҎQ可能还要分为同步和异步两种模式?br /> <br /> 2、分区扩展时候的数据自动q移功能Q做到无痛水qx展?br /> <br /> 3、高可用Ҏ的另一个实现?br /> <br /> 4、嵌入Http server做web理?br />    <br />     工作在本周初步告一D落Q接下来是要做集成测试和压测{,我在两台8?6G的机器上分别部v服务器和客户端(订阅者发布者同在一収ͼQ做的一个简单压数据如下:q发100个线E发?000万消息ƈ同时消费Q?K大小的消息TPS可以辑ֈ3.8万,4K大小的消息TPS可以辑ֈ1.8万,服务器load都维持在一个较低的水^。从q个数据来看Q超q我一开始的预期。后l可能做下kakfa的测试对比下?br /> <br /> <br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/349731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2011-05-07 10:46 <a href="http://www.aygfsteel.com/killme2008/archive/2011/05/07/349731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作随笔—?010-07-24http://www.aygfsteel.com/killme2008/archive/2010/07/24/327027.htmldennisdennisSat, 24 Jul 2010 12:51:00 GMThttp://www.aygfsteel.com/killme2008/archive/2010/07/24/327027.htmlhttp://www.aygfsteel.com/killme2008/comments/327027.htmlhttp://www.aygfsteel.com/killme2008/archive/2010/07/24/327027.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/327027.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/327027.html     转眼间快?月,已经q去了两个季度,是时候稍微ȝ下干了什么,以后惛_什么。从春节到现在,我仍然是做淘宝的消息中间件Notify的开发,中间额外d了一个多月的另一个项目的开发,重拾了web开发的一些东ѝ?br />    
    q半q来Notify的改q集中在通讯层的攚w,引入AMQP的订阅模型,以及重要消息从oracleq移到mysql做HAҎQ这一q程是一个慢慢稳定系l的q程。新版本刚出来的时候有不少BUGQ有些BUG很严重,q运的是没有造成严重的后果,再一ơ提醒我心Q小心,再小心;心是一斚wQ工作有没有做到位是另一个方面,暴露出来的问题还是单元测试不全面Q以及麻痹大意心态下的不警惕Q对关键代码认识不清Qcode review也没有做C{等?br />
    Notify做到现在Q剩下的问题是一些很难解冻I又非常关键性的问题Q如消息的去重,消息的顺序性,以及消息的可靠存储。我说的q些问题都是在分布式集群环境下需要解决的问题Q如果仅仅是单台服务器,q些问题的解册不上特别困难。消息的去重Q基本的思\是在客户端和服务器之间各自维持一个状态,用于保存当前消息的处理情况,依据q个情况来做消息的去重,但是状态的保存Ҏ务器和客L来说都是一个额外的负担Qƈ且很隑ց到可靠的存储Q如果状态丢了,去重的目的就没办法做到。ActiveMQ里是在服务器和客L都维持了一个bitmap做重复的,但是q个bitmap大小必然是受限的Qƈ且无法持久保存的。消息的在集环境下的顺序性,涉及到集环境下的事件的旉序问题Q除了用分布式锁来保证一致性之外,暂时也没有好的思\去解冟뀂消息的可靠存储Q今q我们的目标臛_是脱oracleQ目前实现的HA mysql双写的实现已l开始部|到交易q样的核心系l上Q第三个季度慢慢地全部切换q去。下一步的目标是将消息存储到key-valuepȝ上,但是需要解决的是烦引的问题Q因为消息的恢复涉及到查询,q且需要根据一些特D条件做查询以应付诸如尽快恢复重要消息这L功能Q因此目前的一些key-valuepȝ要么在烦引功能上太弱Q要么在集群功能上太弱,要么在大数据量存储上有局限,因此不是特别切合我们的场景,因此一个可行的Ҏ是将消息的headerl箋存储在关pL据库Q方便做查询Q而将数据较大的body存储在key-value上,减轻数据库的负担。今q_我们q是希望能在以上3个方向某个方向做出突破?br />
   q半q来技术上的收PW一个季度业余时间都L游戏了,没方什么心思在学习和工作上Q后来去学习了下ASMQȝ对java的byte codeQ以及jvm执行byte codeq程有了个理解,然后利用ASML了aviatorq个目。接下来开始做服务器的SEDA攚w,q个q程完成了部分,但是不满意,SEDA的模型过于理论化Q模型是好的Q但是在stage controller的实C目前没有可供参考的l验Q做到资源的自动控制更需要实际的试和实践,基本的指导原则只能作为参考。另外,最q下军_去重构整个项目,从一个一个类看vQ看C爽的地方马上d重构Q这个过E,我又去重看了下《重构》中的原则,在谈如分布式、v量数据存储、云计算q样的大词之前,我需要的做的仍然是将代码写好Q写的漂亮。也许是时?span style="color: red;">回到本源Q再去重M《设计模式》,重读下《重构》,既然我还在写java代码Q那q是希望写的更好炏V?br />    另外Q我现在喜欢上了clojure语言Qƈ且正儿八l地找了本书好好学习Q从源码和bytecode入手ȝ解它的实现。我Z么喜Ƣclojure?
   首先Q它是LISP的方a之一QLISP的优点它全有QLISP的缺点它能想办法避免。Clojure也有宏,也有quoteQ也有将procedure as data的能力,Clojure的数据结构都是immutableQ此外还是persistenceQ避免了immutable数据大量拯带来的开销。Clojure的数据结构还天生是lazy的,表达能力上一个台阶。Clojure在语法上更多变化Q某些程度上降低了括L使用频率Q这一Ҏ利有弊。Clojure的内在原则是一致的Q核心语法非常简单,它没有多U范式可供选择Q因此没有scala那样复杂的类型系l,没有Z包容javaE序员引入的OO模型Q有替代品)Q用clojure最好的方式是函数式圎ͼ但是它的扩展能力允许你去试各种范式?br />
   其次QClojure对ƈ发的支持更符合一般程序员的理解,它只是将锁替换成了事务,利用STMM存可变状态,但是却避免锁带来的缺点——死锁、活锁、竞争条件。它没有引入新的模型Q这对习惯于用锁~程的同学来_STM没有很大差异Q你可以它理解成内存型数据库?br />
   W三Q最重要的一点,Clojure是实CJVM之上的,Java上的M东西它都能直接利用,q且利用type hint之类的手D可以做到性能上没有损失。尽Java语言有千般不是,但是寄生于整个^C上的开源生态系l是M其他C֌都很难比拟的Q放弃Javaq_q个宝库Q暂时还做不到。过d习schemeQ学习common lispQ更多的目的是开阔眼界,现在能实际地使用Q还能有比这更幸的事情吗?

   下半q技术上惛_习什么呢Q除了clojure之外Q我惛_看下haskellQ了解下什么是mondQ除此之外,是收收心将《算法导论》读完吧。另外,收v对awk和shell~程的偏见,好好熟悉下这两个工具Qdirty and quickly的干zL时候还是很重要的?br />
    我还是个典型的码农,喜欢写代码,喜欢试C西,臛_热情和好奇心q残存一些,那么ql当好码农吧?br />  


dennis 2010-07-24 20:51 发表评论
]]>
写代码与情Ahttp://www.aygfsteel.com/killme2008/archive/2010/01/09/308808.htmldennisdennisSat, 09 Jan 2010 03:09:00 GMThttp://www.aygfsteel.com/killme2008/archive/2010/01/09/308808.htmlhttp://www.aygfsteel.com/killme2008/comments/308808.htmlhttp://www.aygfsteel.com/killme2008/archive/2010/01/09/308808.html#Feedback7http://www.aygfsteel.com/killme2008/comments/commentRss/308808.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/308808.html
   看过很多讨论E序员工作效率的文章Q据U研I表明要q入q种状态是臛_?5分钟的时_因此频繁地打断工作会ȝ你的工作效率Q毕竟酝酿情l也是需要时间的嘛。我有思考过怎么d量多C持这U状态,排除那种对工作厌烦的情AQ毕竟拿着工资不干zd里还是会不安Q况且看到周围那么多高效率的人,压力是难免的Q让人担心的不是每天只有两个时的高效工作,而是那段什么都不想q的旉。最后让我发C个方法,说v来很单,是在出现这U低效状态的时候,自己打开eclipseQ而不?firefoxQ强q自己去写几行代码,如果q段旉内没有被其他事情打断Q那么你q是Ҏq入一U不那么高效和愉悦的工作状态,臛_能做C心致志。当Ӟ跟自q情AҎ可能不是世界上最困难的事情,也是其中之一Q不q请你相信,只要你打开eclipse开始写代码q进入思考状态,那么你至是可以暂时遗忘那些负面情A的,甚至你的情A可能因ؓ解决了某个难题而高昂v来?br />    q个Ҏ肯定不是什么新发现Q我估计很多Z有同Ll验Q今早在看《joel说Y件》其中一文章《开火与q动》也谈到了同L问题Qjoel也提到相同的l验Q开了头好。你不知道要费多劲才能一辆带齿轮的山地Rq{hQ不q一旦它转v来之后,一切都跟骑一辆没有轮的自行车没什么两栗Joelqg怺更多Q开火的{略不仅仅是工作效率的问题,也是竞争{略Q当你向敌h开火的时候,同时向敌人靠q去Q活力会q敌h低下头而不能向你开火。竞争也是如此,压迫性的不断推出C西让你的竞争Ҏ疲于奔命Q反而遗忘品的Ҏ性的目的Q这些新东西可能只是Z替换q去不易用的东西Qؓ什么不易用的东西在q去也会被推出来Q那只是了ؓ每天q步不断开火,让敌人忘记开火?br />    



dennis 2010-01-09 11:09 发表评论
]]>
2009q小l?/title><link>http://www.aygfsteel.com/killme2008/archive/2009/12/24/307191.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 24 Dec 2009 09:29:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2009/12/24/307191.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/307191.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2009/12/24/307191.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/307191.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/307191.html</trackback:ping><description><![CDATA[    着下班前的半小Ӟ回顾?009q我都干了什么,有什么收P有什么不?br />     09q最重要的事情是我的儿子出生了,家伙的到来带给全家很多Ƣ乐Q烦g不少Q比如半夜总要被吵醒,晚上的读书也没办法那么专心读了。此外,我还在学习怎么当爸爸,写过q篇?a href="http://www.aygfsteel.com/killme2008/archive/2009/08/10/290592.html">新爸爸指?/a>》,记录下新生儿遇到的种U问题,逐渐l历自己生命的又一个阶D,q个历程很美好?br />     q初从广州公司辞职后Q到了厦门一家创业公司,q不是一ơ很愉快的经历,回想h我的问题不小。首先不该N然地惛_转换一个语aq_Q写C++实在不是很好的编E的体验Q乃至于我根本提不v工作热情Q其ơ,心态不成熟Q遇到问题和困扰的时候还是比较被动地解决Q事实上完全没必要搞成这Pd提出q且d公司q不是什么丢人的事情。这ơ经历告诉我做决定的时候最好再慎重一点,毕竟自己不是一个h了,dp口是实实在在的责Q?br />    在厦门的p|l历后,我投历到了淘宝,管对于待遇q不是很满意Q出于对淘宝的向往和有点理想主义的情怀q是来到了杭州。刚来的时候,工作很顺利,生活比较p糕Q老婆孩子接到杭州后才好了点,生活比较有规律了。在淘宝Q我所做的仍然是开发,写代码还是我的最爱,不过做的M务的比较q,q正W合我的期望。负责的是一个消息中间g的开发,q个产品本n已经成型Qƈ且应用在了淘宝的核心pȝ当中Q现在每天通过q个MQ发送的消息量已l接q两亿,整个pȝ拥有C集群Q近30台机器。工作不单纯是开发,包括一些方案的设计和日常的l护工作QM来讲q是很愉悦的体验。不的地方Q我仍然q是自pZ个纯_的技术h员,Ҏ宝本w的业务、对其他pȝ的架构设计的了解都比较少Q甚至于认识的hq是很局限,不过q个跟我的性格有关了?br />     技术上Q这一q自我感觉没多大q步Q除了将<a >sicp</a>d之外(我准备再度几?Q一些零零散散的技术书c也看了不少Q很留下深ȝ印象Q比较有价值的是?a >卓有成效的程序员</a>》和?a >C++|络~?/a>E》上下两南前者我开始有意识地将自己一些重复性的工作自动化,提高自己的工作效率,后者让我对|络框架的设计模式有了相对全面的认识Q也促进了我对Java|络~程的认识。今q也开发了个Java Memcached Client—?a >Xmemcached</a>,q在大家的鼓׃持箋地在改进Qȝ有不用户在用,没有枉费_֊和时_也算今年的一个小自得的地方。这里要特别感谢下曹晓刚Q没有他的鼓励和他们公司的用,<a >xmc</a>q只是个人玩兗?9q下半年又将不少_֊攑֜了ErlangQ过d习是跟风Q这ơȝ在项目中了有了个应用,q且《ErlangE序设计》和OTP设计原则来回M几遍Q对Erlang的兴越来越大,甚至于想是不是该L份专职做Erlang的工作。对技术的学习Q我q是没有一个明的规划QQ凭兴在几个领域里{来{去,q不是好现象Q明q希望能更有计划和针Ҏ地d习,能跟自己的工作契合得更紧密一些。明q也希望能将《算法导论》读完,今年M1/4Q发现我的数学都已经抛到了Java国了Q算法复杂度的推导L看不懂,因此又去搞了几本数学书,从头再看看?br /> <br />    回顾完了Q说说明q的愿望Q?br /> 技术上Q读完《算法导论》,l箋深入ErlangQ探索Erlang在工作中的实际应用,加强对其他系l的了解以及大型|站构徏斚w的学?br /> 生活上:希望能全家一起去旅游一ơ,希望能将老爸老妈接过来玩一D|间?br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/307191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2009-12-24 17:29 <a href="http://www.aygfsteel.com/killme2008/archive/2009/12/24/307191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个优U的MQ产品的特炏V?/title><link>http://www.aygfsteel.com/killme2008/archive/2009/09/18/295517.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 17 Sep 2009 16:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2009/09/18/295517.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/295517.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2009/09/18/295517.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/295517.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/295517.html</trackback:ping><description><![CDATA[    MQ在分布式pȝ中扮演着重要角色Q异步的消息通信全要靠它Q而异步通信正是提高pȝ伸羃性的不二良方。说说我认ؓ的一个优U的MQ产品需要具备的特征?br /> <br />     首先昄是高可用性,我们当然希望MQ能支?x24时应用Q而不是三天两头当机,我们要追求的?9.9%的可靠服务时间。要做到高可用性,昄我们需要做MQ的集,一台当了,不媄响整个集的服务能力Q这里涉及到告警、流控、消息的负蝲均衡、数据库的用、测试的完备E度{等?br /> <br />     其次是消息存储的高可靠性。我们要保证100%不丢消息。要做到消息存储的高可靠性,不仅仅是MQ的责任,更涉及到g、操作系l、语aq_和数据库的一整套Ҏ。许多号U可靠存储的MQ产品其实都不可靠Q要知道Q硬仉误是常态,如果在硬仉误的情况下还能保证消息的可靠存储q才是难题。这里可能需要用到特D的存储gQ特D的数据库,分布式的数据存储Q数据库的分库分表和同步{等。你要考虑消息存储在哪里,是文件系l,q是数据库,是本地文Ӟq是分布式文Ӟ是搞主辅备䆾呢还是多L写入{等?br />     <br />     W三是高可扩展性,MQ集群能很好地支持水^扩展Q这p求我们的节点之间最好不要有通信和数据同步?br /> <br />     W四是性能Q性能是实现高可用性的前提Q很难想象单机性能极差的MQl成的集能在高负蝲下幸免于难。性能因素跟采用的q_、语a、操作系l、代码质量、数据库、网l息息相兟뀂MQ产品的核心其实是消息的存储,在保证存储安全的前提下如何保证和提高消息入队的效率是性能的关键因素。这里需要开发h员徏立v性能观念Q不需要你对一行行代码斤斤计较Q但是你需要知道这样做会造成什么后果,有没有更好更快的方式Q你怎么证明它更好更快。Y件实现的性能是一斚wQ另一斚w是q_相关了,因ؓMQ本质上是IO密集型的pȝQ瓶颈在IOQ如何优化网lIO、文件IOq需要专门的知识。性能另一个相兛_素是消息的调度上Q引入消息顺序和消息优先U,允许消息的gq发送,都将增大消息发送调度的复杂性,如何保证高负载下的调度也是要特别注意的地斏V?br /> <br />    <br />    W五Q高可配|性和监控工具的完_q是一个MQ产品Ҏ忽略的地斏V异步通信造成了查N题的隑ֺQ不像同步调用那h相对明确的时序关pR因此查扑ּ步通信的异常是很困隄Q这需要MQ提供方便的DEBUG工具Q查扑ֈ析日志的工具Q查看消息生命周期的工具Q查看系l间依赖关系的工L{。可定制也是MQ产品非常重要的一斚wQ可方便地配|各cd数ƈ在集中同步Qƈ且可动态调整各cd敎ͼq将大大降低l护隑ֺ?br /> <br />    一些不成熟的想法,瞎侃?br /> <br /> <br />     <br /> <br /> <br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/295517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2009-09-18 00:09 <a href="http://www.aygfsteel.com/killme2008/archive/2009/09/18/295517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӣ</a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ï</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ǹ</a>| <a href="http://" target="_blank">Ҵ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ų</a>| <a href="http://" target="_blank">żҽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">绯</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">뵺</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ׯ</a>| <a href="http://" target="_blank">¸</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ܱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>