<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.9.1" -->
<rss version="0.92">
<channel>
	<title>kafka0102的边城客栈</title>
	<link>http://www.kafka0102.com</link>
	<description>要有最朴素的生活与最遥远的梦想，即使明日天寒地冻、路远马亡。</description>
	<lastBuildDate>Sun, 05 Sep 2010 11:50:40 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>[Solr实践]自定义SolrEventListener实现searcher的autowarm策略</title>
		<description><![CDATA[	Solr的searcher autowarm（预热）有两个时机，一个是系统启动时（firstSearcher），一个是使用新的searcher替换旧的searcher时（newSearcher）。Solr支持在solrconfig.xml中对SolrCore配置SolrEventListener来实现自定义的autowarm。通常来说，Solr提供的默认实现QuerySenderListener就够用了。在我的需求中，希望solrconfig.xml中配置的SolrEventListener是针对多个SolrCore的，这要是因为我的多个SolrCore共用了一个solrconfig.xml配置。就配置autowarm的查询query来说，简单的就是配置一个常见的query，但如果系统有排序查询（sort），可以配置适宜的sort条件以预热lucene的fieldCache。下面是我自定义的SolrEventListener，效果是，如果SolrCore没有配置query，就使用default的，否则使用自己的。]]></description>
		<link>http://www.kafka0102.com/2010/09/326.html</link>
			</item>
	<item>
		<title>Solr之困</title>
		<description><![CDATA[重写公司的站内搜索。经过前期一段时间对lucene和solr的熟悉，最后决定使用Solr作为新系统的基础框架。现在已经是第一阶段开发的后期，核心代码行数有11000+（不包含admin及client等）。现已实现的功能要比已有系统要丰富些，但综合比较两个系统总的代码量，其实新系统并不多得太多。新系统使用Solr代替了已有系统实现的部分功能，这减少了新系统的代码量，同是新系统实现了已有系统不具有的功能，也增加了一些代码量。开发的这段时间，因为新系统中很多代码是独立于Solr的，所以和Solr的交互也是时断时续，以使得即便到了开发后期我还能发现Solr实现的一些细节带给我的困扰。]]></description>
		<link>http://www.kafka0102.com/2010/08/319.html</link>
			</item>
	<item>
		<title>HttpClient的“Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.”警告释疑</title>
		<description><![CDATA[使用HttpClient，总是报出“Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.”的WARN日志，定位到HttpClient的源码如下：

    public byte&#91;&#93; getResponseBody&#40;&#41; throws IOException &#123;
        if &#40;this.responseBody == null&#41; &#123;
            InputStream instream = getResponseBodyAsStream&#40;&#41;;
     [...]]]></description>
		<link>http://www.kafka0102.com/2010/08/316.html</link>
			</item>
	<item>
		<title>构建健壮的Java基准测试</title>
		<description><![CDATA[本周遇到几篇和基准测试相关的不错的文章，如果不是因为上周末鼓弄了一下各种锁的性能测试，我或许就会错过它们。两篇文章来自dw，分别是 Robust Java benchmarking, Part 1: Issues 和  Robust Java benchmarking, Part 2: Statistics and solutions，作者还有个专页 Java benchmarking article 提供一个Java基准测试的框架，感兴趣的可参考之。本文算是对Robust Java benchmarking, Part 1: Issues的一个简单的总结。在阅读Robust Java benchmarking两篇文章的过程中，我也看了些其中的参考文章，也有一些不错的可以拜读之。]]></description>
		<link>http://www.kafka0102.com/2010/08/312.html</link>
			</item>
	<item>
		<title>Java中各种锁类型的基准性能评测</title>
		<description><![CDATA[周末对Java中各种类型的锁做了基准评测。测试的条件有两个：1）是10、50、100个不同的并发线程，2）是读写比例近似1:1,10:1,100:1,1000:1。测试方法是，对各种加锁的Map方法做性能评测，它们都是实现了MapWrapper接口的封装，测试的就是Map的get和put方法。测试的锁类型有：1）hashtable：直接测试Hashtable，2）synclock：对HashMap的方法直接加synchronized（理论上性能应和Hashtable相当），3）mutexlock：对HashMap的方法显示加Lock锁，4）rwlock：对HashMap加读写锁，5）concrrent：直接使用ConcurrentHashMap的方法，6）对HashMap读操作不加锁，写操作加Lock。]]></description>
		<link>http://www.kafka0102.com/2010/08/298.html</link>
			</item>
	<item>
		<title>[Solr源码分析]LRUCache和FastLRUCache实现分析</title>
		<description><![CDATA[	在 [Solr 实践]Solr Cache使用介绍及分析 一文我有对Solr的LRUCache和FastLRUCache做了一些介绍，本文在此基础对其实现做些补充。
1、LRUCache的实现分析
	在分析LRUCache前先对LinkedHashMap做些介绍。LinkedHashMap继承于HashMap，它使用了一个双向链表来存储Map中的Entry顺序关系，这种顺序有两种，一种是LRU顺序，一种是插入顺序，这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor,                   boolean accessOrder)指定。所以，对于get、put、remove等操作，LinkedHashMap除了要做HashMap做的事情，还做些调整Entry顺序链表的工作。
	以get操作为例，如果是LRU顺序（accessOrder为true），Entry的recordAccess方法就调整get到的Entry到链表的头部去：

   public V get&#40;Object key&#41; &#123;
        Entry&#60;K,V&#62; e = &#40;Entry&#60;K,V&#62;&#41;getEntry&#40;key&#41;;
        if &#40;e [...]]]></description>
		<link>http://www.kafka0102.com/2010/08/293.html</link>
			</item>
	<item>
		<title>分析多线程并发写HashMap线程被hang住的原因</title>
		<description><![CDATA[在blogjava上看到一文  谁能帮忙解释一下为什么这个程序会死锁？，激发了我那能害死猫的好奇，所以很费劲的琢磨了这个问题。由于涉及的内容较多，就单独发文阐述一下。
文中提到的问题程序如下：

public class TestLock &#123;
  private final HashMap map = new HashMap&#40;&#41;;
  public TestLock&#40;&#41; &#123;
    final Thread t1 = new Thread&#40;&#41; &#123;
      @Override
      public void run&#40;&#41; &#123;
        for&#40;int i=0; i&#60;500000; i++&#41; &#123;
 [...]]]></description>
		<link>http://www.kafka0102.com/2010/08/286.html</link>
			</item>
	<item>
		<title>PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误</title>
		<description><![CDATA[因为需要，今天晚些在本机使用PHP做些测试，PHP脚本依赖了一堆我也不清楚做什么用的库。结果一跑起来，就报出类似下面的错误：“Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/kafka/test/test.php on line 8”。查找代码，发现报错的代码类似：“$class_name::func1();”，也就是使用一个表示类名的字符串变量来调用它的静态方法，并且是解析时的语法错误（我第一眼看到::时，脑子里浮现的是C++里的作用域符号，好长时间后才想起PHP里有::也有这种东西，我也是用过 self::doSomething()的）。]]></description>
		<link>http://www.kafka0102.com/2010/08/281.html</link>
			</item>
	<item>
		<title>[Solr实践]Solr Cache使用介绍及分析</title>
		<description><![CDATA[	本文将介绍Solr查询中涉及到的Cache使用及相关的实现。Solr查询的核心类就是SolrIndexSearcher，每个core通常在同一时刻只由当前的SolrIndexSearcher供上层的handler使用（当切换SolrIndexSearcher时可能会有两个同时提供服务），而Solr的各种Cache是依附于SolrIndexSearcher的，SolrIndexSearcher在则Cache生，SolrIndexSearcher亡则Cache被清空close掉。Solr中的应用Cache有filterCache、queryResultCache、documentCache等，这些Cache都是SolrCache的实现类，并且是SolrIndexSearcher的成员变量，各自有着不同的逻辑和使命，下面分别予以介绍和分析。]]></description>
		<link>http://www.kafka0102.com/2010/08/267.html</link>
			</item>
	<item>
		<title>使用JRebel提供对Java web开发的热部署</title>
		<description><![CDATA[	这几天在写Java Web页面，开发环境是linux+eclipse+maven+jetty。开发java web最烦的就是改个文件需要重启web server，尽管现在的web server（比如小野猫）支持了热部署，不过其实现相当于重启了web server，如果文件多些初始化复杂些，重启的时间也够受的。对于开发的IDE来说，myeclipse是个不错的选择，它能对修改的文件自动部署到web server（eclipse wtp就没做这个支持，但我们也可以投机的对部署目录和开发目录做个软链），不多我试用了其最新的8.5版本，在本本上响应速度有些迟缓，影响编码情绪。而且，因为环境需要，最后开发环境定位eclipse+maven+jetty（maven提供了jetty的plugin用于开发测试），并且找到了JRebel这个强悍的能提供对Web server的热部署到工具，它不像web server那样需要重启服务，而是动态的加载修改的文件，所以反应速度上要好很多，它除了可以热加载class、jsp文件，也可以是spring、hibernate等配置文件。]]></description>
		<link>http://www.kafka0102.com/2010/07/258.html</link>
			</item>
	<item>
		<title>[Solr源码分析]Solr复制类ReplicationHandler实现简要分析</title>
		<description><![CDATA[在上一文《solr ReplicationHandler使用介绍》的基础上，本文接着对solr的ReplicationHandler实现细节做些分析，这个分析原则上没有摘取大段代码，窃以为摘了代码后未见得有很好的阐述效果，但不摘取后窃又发现，阐述的效果依旧不好。归结起来，还是窃的表达不够深入浅出所致。闲言少叙，直接上内容。]]></description>
		<link>http://www.kafka0102.com/2010/07/249.html</link>
			</item>
	<item>
		<title>[Solr实践]Solr复制类ReplicationHandler使用介绍</title>
		<description><![CDATA[solr1.4中引入ReplicationHandler代替外部脚本来复制索引数据，ReplicationHandler使得复制索引数据更自动化。对于使用者来说，只要简单的配置好，就可以一劳永逸的享受solr的复制功能了。下面介绍其使用相关内容。]]></description>
		<link>http://www.kafka0102.com/2010/07/244.html</link>
			</item>
	<item>
		<title>zoie DocIDMapperImpl类实现分析</title>
		<description><![CDATA[有网友留言询问我对zoie的DocIDMapperImpl实现是否有了解。说实话，之前看zoie也只是大面上的，知道DocIDMapperImpl的用处，但没有仔细分析它的算法。就趁着夜深人静，把这个类好好琢磨了下。但我得承认，看这种伤脑筋的算法让我有些吃不消，下面就列出我对它的大致分析，如果有不恰当的地方，也望指正。

还是说下DocIDMapperImpl的作用吧。在zoie中，uid和lucene的docid有一一对应关系。从docid到uid的映射很简单，就是分配个maxdoc大小的数组，索引位置是docid，值是uid。这样做也是因为docid是从小到大自增的，大小总有限。但uid是long型的，使用数组反映射是不行了，一个直接的选择是使用hashmap。不过zoie为了节约空间，使用了更有效的算法，也就是下面的类。]]></description>
		<link>http://www.kafka0102.com/2010/07/238.html</link>
			</item>
	<item>
		<title>分享“Top 10 Performance Problems taken from Zappos, Monster, Thomson and Co”</title>
		<description><![CDATA[Top 10 Performance Problems taken from Zappos, Monster, Thomson and Co 一文总结了一些关于性能问题方面的经验，虽然不是很“新奇”，但也算是中规中矩的有借鉴意义，这里分享之。没有对原文做完全的翻译，也欢迎大家直接看看原文，本文转过来还夹杂了一些个人理解，有理解不当的地方也望指正。]]></description>
		<link>http://www.kafka0102.com/2010/07/234.html</link>
			</item>
	<item>
		<title>避免lucene queryparser中文分词的缺陷</title>
		<description><![CDATA[很多人在使用lucene时会使用其提供的queryparser分析query。不过，lucene的queryparser从一开始到现在都没有充分考虑中文等语言的特点，使得查询中文会出现让人不可理解的查不到结果的情况。这个bug就是LUCENE-2458 。]]></description>
		<link>http://www.kafka0102.com/2010/07/226.html</link>
			</item>
	<item>
		<title>对mongodb进行java编程</title>
		<description><![CDATA[	本周实验性地使用上mongodb，应用场景很简单，所以现在对mongodb了解也不是很深入。本文主要介绍mongodb的java客户端编程，这方面的内容也很简单，这里只是做个总结。不得不说，像mongodb这种介于kv和sql之间的存储，对很多的互联网应用很合适。mongodb现在的应用案例已经很多，并且社区的活跃度很高（国内也有不少人对其有很深的研究，如果有时间和精力，或许我也会投入一些对mongodb的研究），很值得期待。]]></description>
		<link>http://www.kafka0102.com/2010/07/209.html</link>
			</item>
	<item>
		<title>使用依赖注入框架Google Guice替代new和工厂类</title>
		<description><![CDATA[	在新系统中使用了Guice来统一了对象注入和创建方式，也不是刻意为之，而是由两个经典问题引起的：
	1）对于对象的创建，可以使用new、静态工厂、抽象工厂等方式，使得对象创建方式不统一，而使用哪种方式最好也很难有定论，并且随着代码的变化，创建方式也可能会需要有更好的变化。
	2）对于类成员的设置，最直接的是在类内部直接创建，但这样硬编码会影响灵活的测试性，解决的方法是通过外部注入成员，好处自不必说，但在一个复杂的系统中，类之间的关联及层次关系，使得一个上层对象的创建往往需要依赖多个下层的类，使得对象创建代码变的冗余而复杂。
	解决上面两个问题，我就想到了依赖注入（DI）框架（也被成为IOC容器，取控制反转之意），我需要选择一个得手的依赖注入框架来满足需求。]]></description>
		<link>http://www.kafka0102.com/2010/06/193.html</link>
			</item>
	<item>
		<title>分享“The Four Meta Secrets of Scaling at Facebook”</title>
		<description><![CDATA[在highscalability.com上翻看最新的文章，一文 The Four Meta Secrets of Scaling at Facebook 很不错。下面做些简要的中文介绍并续上自己的解读。 Facebook的规模及技术水平不消我多说，其对开源社区的贡献更是有目共睹。“The Four Meta Secrets of Scaling at Facebook”不是关于Facebook的技术架构方面的细节，而是在扩展并发展Facebook这样的大规模高复杂增长速度快的网站过程中，积累的 4点有借鉴意义的观点。]]></description>
		<link>http://www.kafka0102.com/2010/06/187.html</link>
			</item>
	<item>
		<title>Netty实现原理浅析</title>
		<description><![CDATA[Netty是JBoss出品的高效的Java NIO开发框架，关于其使用，可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西，由于精力有限，本人并没有对其源码做了极细致的研 究。如果下面的内容有错误或不严谨的地方，也请指正和谅解。对于Netty使用者来说，Netty提供了几个典型的example，并有详尽的API doc和guide doc，本文的一些内容及图示也来自于Netty的文档，特此致谢。]]></description>
		<link>http://www.kafka0102.com/2010/06/167.html</link>
			</item>
	<item>
		<title>Netty使用初步</title>
		<description><![CDATA[    Java1.4提供了NIO使开发者可以使用Java编写高性能的服务端程序，但使用原生的NIO API就像Linux C中网络编程一样，还是需要做IO处理、协议处理等低层次工作。所以，就像C服务端程序大量使用libevent作为网络应用框架一样，Java社区也不断涌现出基于NIO的网络应用框架。在这其中，Jboss出品的Netty就是个中翘楚。Netty是个异步的事件驱动网络应用框架，具有高性能、高扩展性等特性。Netty提供了统一的底层协议接口，使得开发者从底层的网络协议（比如TCP/IP、UDP）中解脱出来。就使用来说，开发者只要参考 Netty提供的若干例子和它的指南文档，就可以放手开发基于Netty的服务端程序了。
    在Java社区，最知名的开源Java NIO框架要属Mina和Netty，而且两者渊源颇多，对两者的比较自然不少。实际上，Netty的作者原来就是Mina作者之一，所以可以想到，Netty和Mina在设计理念上会有很多共同点。我对Mina没什么研究，但其作者介绍，Netty的设计对开发者有更友好的扩展性，并且性能方面要优于Mina，而Netty完善的文档也很吸引人。所以，如果你在寻找Java NIO框架，Netty是个很不错的选择。本文的内容就是围绕一个demo介绍使用Netty的点点滴滴。]]></description>
		<link>http://www.kafka0102.com/2010/06/161.html</link>
			</item>
	<item>
		<title>在Java中使用脚本语言</title>
		<description><![CDATA[    有一段时间没有搞Java，对于Java5以来一些新特性了解也不多，这几天看Solr的DIH，发现个很不错的配置支持--脚本引擎。以前提Java，是一处编译到处运行，现在可以说是一个平台多种语言。借此机会，整理了下Java6中引入的脚本引擎的相关特点和功能]]></description>
		<link>http://www.kafka0102.com/2010/06/155.html</link>
			</item>
	<item>
		<title>log4j使用指南</title>
		<description><![CDATA[log4j是Java中老牌的日志工具了，其强大的功能、简便的使用，使得开源项目中随处可见它的身影。即便jdk1.4中引入了logging功  能，log4j还是最受欢迎的日志工具。对log4j的使用者来说，使用log4j的API就那个几个打印日志函数，最需要关注的就是它的配置文件。不 过，很多人只是从网上找个配置样例把它跑起来，而没有更有效的使用log4j处理日志。这其实也不仅仅关乎log4j的使用，而是实际的如何有效的利用工 具来记录日志、分析日志和监控日志。]]></description>
		<link>http://www.kafka0102.com/2010/05/147.html</link>
			</item>
	<item>
		<title>分享Sify.com的架构经验</title>
		<description><![CDATA[今天分享的网站架构来自于Sify.com Architecture - A Portal at 3900 Requests Per Second（该标题有标题党嫌疑），对英文熟稔并不屑于我的中文简述的可以跳过该文。Sify.com是印度的一家portal网站，应该是信息集成类网站。它给出的月 pv是1.5亿次，每秒请求数是3900次（应该是针对所有服务的页面请求，包括异步的，并且是高峰的，否则就和pv对不上了）。按规模来说，算是个中等规模的网站，不过它的架构却是很值得说道的。]]></description>
		<link>http://www.kafka0102.com/2010/05/144.html</link>
			</item>
	<item>
		<title>google collections介绍</title>
		<description><![CDATA[google collections是google的工程师利用传说中的“20%时间”开发的集合库，它是对java.util的扩展，提供了很多实用的类来简化代码。google collections使用了范型，所以要求jdk1.5以上。它的作者没有像apache commons collections一样照顾老的jdk版本，一个原因是google的jdk基本都是1.5以上，另一个原因是类型转换实在是太难看了。现在的集合库版本是1.0,已经很稳定了，在功能和实现方面也是广泛参考意见（比如java.util之父Josh Bloch），所以该库的质量可想而知，将来也有可能集成到jdk中。项目地址是http://code.google.com/p/google-collections/，该文对其提供的核心类做简要的介绍。]]></description>
		<link>http://www.kafka0102.com/2010/05/139.html</link>
			</item>
	<item>
		<title>实时检索系统Zoie实现分析</title>
		<description><![CDATA[Zoie是LinkedIn开源的基于lucene的实时检索系统，对于它的介绍及初步使用可参考我的上一篇文章“使用Zoie构建实时检索系统”。在初步研究并理解了Zoie的源码实现后，本文分析一下Zoie的实现。]]></description>
		<link>http://www.kafka0102.com/2010/05/133.html</link>
			</item>
	<item>
		<title>使用Zoie构建实时检索系统</title>
		<description><![CDATA[ Zoie是LinkedIn开源的实时检索系统，它本身用于LinkedIn的用户profile检索。且不说专业的搜索引擎，大多数的站内检索基本都不是实时的，一般都会有几分钟的延迟。但LinkedIn认为，用户profile信息的检索需要实时的效果，因为如果搜索结果不正确或不理想会很影响用户体验。所以，LinkedIn的Zoie实现了秒级别的实时检索效果。Zoie在LinkedIn跑了有两年多时间，所以这个开源项目可以说比较成熟的，这个项目提供了较为丰富的功能和工具，除了核心的API外，它还提供了管理和监控工具、嵌入jetty的Web server demo、一些实用的DataProvider等。对于社区类需要提供用户信息检索的系统来说，使用Zoie或许是个很不错的选择。]]></description>
		<link>http://www.kafka0102.com/2010/05/119.html</link>
			</item>
	<item>
		<title>jvm关闭钩子与信号处理</title>
		<description><![CDATA[对于使用Java做server端程序来说，通常会希望在JVM关闭时做些扫尾工作，比如写内存数据到磁盘、关闭句柄等。JVM提供了关闭钩子（shutdown hooks）来做这件事情。关闭钩子使用起来很简单，调用Runtime实例的public void addShutdownHook(Thread hook)即可，其中参数hook就是要做扫尾工作的钩子线程。这就是说，调用这个方法，JVM便会在初始化时注册这个钩子，待时机到了触发钩子。而触发的时机有：1）程序正常推出或者调用System.exit方法，如果是多线程环境，要求是最后一个非守护线程触发，2）JVM收到需要关闭自己的信号（比如SIGINT、SIGTERM等，但像SIGKILL，JVM就没有机会去处理了），也或者发生如系统关闭这种不可阻挡的事件。]]></description>
		<link>http://www.kafka0102.com/2010/04/107.html</link>
			</item>
	<item>
		<title>分享Poppen.de架构经验</title>
		<description><![CDATA[Poppen.de是德国的一家婚姻中介网站，对于该网站的统计数字有：1）2.000.000的用户数，2）20.000的并发用户数，3）每天产生300.000的私信，4）250.000的日登录用户数。这样的网站也就是个中型规模的网站，下面看看这个网站在技术应用及经验方面带来的东西。]]></description>
		<link>http://www.kafka0102.com/2010/04/96.html</link>
			</item>
	<item>
		<title>闲话编程语言的那点破事儿</title>
		<description><![CDATA[编程语言对一个程序员有多重要？看看那些招聘广告吧，有那么多赤裸裸的招聘会某种语言的程序员的广告，这无异是将程序员的价值与编程语言挂钩了，这也使得不少人在选择编程语言时会关注什么语言最火或者什么语言最赚钱，而忽视了工作内容所体现的价值。就web开发来说，为求开发迅速，像PHP这样的脚本语言是多数网站的选择，所以PHP程序员遍地都是。但是，招聘web开发人员显然不仅仅要求会个PHP语言就行的，而是要求能解决web开发中的各种问题，而这些问题和语言的关系是不大的。有能力的程序员不会过多的纠结于编程语言、使用的框架等这样低层次的问题。]]></description>
		<link>http://www.kafka0102.com/2010/04/91.html</link>
			</item>
	<item>
		<title>CAP理论及BASE思想等</title>
		<description><![CDATA[CAP理论是由 Brewer远在2000年的PODC会议上提出来的。CAP指的是：Consistency、Availability和 Partition Tolerance，下面简述此三者：

1、Consistency（一致性）：一致性是说数据的原子性，这种原子性在经典的数据库中是通过事务来保证的，当事务完成时，无论其是成功还是回滚，数据都会处于一致的状态。在分布式环境中，一致性是说多点的数据是否一致。

2、 Availability（可用性）：可用性是说服务能一直保证是可用的状态，当用户发出一个请求，服务能在有限时间内返回结果。而这种可用性是不关乎结果的正确与否，所以，如果服务一致返回错误的结果，其实也可以称为其是可用的。

3、Partition Tolerance（分区容忍性）：Partition这个词不是常说的操作系统或数据库中的用语，而是指网络的分区。网络中的两个服务结点出现分区的原因很多，比如网络断了、对方结点因为程序bug或死机等原因不能访问。]]></description>
		<link>http://www.kafka0102.com/2010/04/86.html</link>
			</item>
</channel>
</rss>
