莊周夢(mèng)蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

              最近有朋友給我郵件問一些storm的問題,集中解答在這里。
          一、我有一個(gè)數(shù)據(jù)文件,或者我有一個(gè)系統(tǒng)里面有數(shù)據(jù),怎么導(dǎo)入storm做計(jì)算?

          你需要實(shí)現(xiàn)一個(gè)Spout,Spout負(fù)責(zé)將數(shù)據(jù)emit到storm系統(tǒng)里,交給bolts計(jì)算。怎么實(shí)現(xiàn)spout可以參考官方的kestrel spout實(shí)現(xiàn):
          https://github.com/nathanmarz/storm-kestrel

          如果你的數(shù)據(jù)源不支持事務(wù)性消費(fèi),那么就無法得到storm提供的可靠處理的保證,也沒必要實(shí)現(xiàn)ISpout接口中的ack和fail方法。

          二、Storm為了保證tuple的可靠處理,需要保存tuple信息,這會(huì)不會(huì)導(dǎo)致內(nèi)存OOM?

          Storm為了保證tuple的可靠處理,acker會(huì)保存該節(jié)點(diǎn)創(chuàng)建的tuple id的xor值,這稱為ack value,那么每ack一次,就將tuple id和ack value做異或(xor)。當(dāng)所有產(chǎn)生的tuple都被ack的時(shí)候, ack value一定為0。這是個(gè)很簡單的策略,對(duì)于每一個(gè)tuple也只要占用約20個(gè)字節(jié)的內(nèi)存。對(duì)于100萬tuple,也才20M左右。關(guān)于可靠處理看這個(gè):
          https://github.com/nathanmarz/storm/wiki/Guaranteeing-message-processing

          三、Storm計(jì)算后的結(jié)果保存在哪里?可以保存在外部存儲(chǔ)嗎?

          Storm不處理計(jì)算結(jié)果的保存,這是應(yīng)用代碼需要負(fù)責(zé)的事情,如果數(shù)據(jù)不大,你可以簡單地保存在內(nèi)存里,也可以每次都更新數(shù)據(jù)庫,也可以采用NoSQL存儲(chǔ)。storm并沒有像s4那樣提供一個(gè)Persist API,根據(jù)時(shí)間或者容量來做存儲(chǔ)輸出。這部分事情完全交給用戶。

          數(shù)據(jù)存儲(chǔ)之后的展現(xiàn),也是你需要自己處理的,storm UI只提供對(duì)topology的監(jiān)控和統(tǒng)計(jì)。

          四、Storm怎么處理重復(fù)的tuple?

          因?yàn)镾torm要保證tuple的可靠處理,當(dāng)tuple處理失敗或者超時(shí)的時(shí)候,spout會(huì)fail并重新發(fā)送該tuple,那么就會(huì)有tuple重復(fù)計(jì)算的問題。這個(gè)問題是很難解決的,storm也沒有提供機(jī)制幫助你解決。一些可行的策略:
          (1)不處理,這也算是種策略。因?yàn)閷?shí)時(shí)計(jì)算通常并不要求很高的精確度,后續(xù)的批處理計(jì)算會(huì)更正實(shí)時(shí)計(jì)算的誤差。
          (2)使用第三方集中存儲(chǔ)來過濾,比如利用mysql,memcached或者redis根據(jù)邏輯主鍵來去重。
          (3)使用bloom filter做過濾,簡單高效。

          五、Storm的動(dòng)態(tài)增刪節(jié)點(diǎn)

          我在storm和s4里比較里談到的動(dòng)態(tài)增刪節(jié)點(diǎn),是指storm可以動(dòng)態(tài)地添加和減少supervisor節(jié)點(diǎn)。對(duì)于減少節(jié)點(diǎn)來說,被移除的supervisor上的worker會(huì)被nimbus重新負(fù)載均衡到其他supervisor節(jié)點(diǎn)上。在storm 0.6.1以前的版本,增加supervisor節(jié)點(diǎn)不會(huì)影響現(xiàn)有的topology,也就是現(xiàn)有的topology不會(huì)重新負(fù)載均衡到新的節(jié)點(diǎn)上,在擴(kuò)展集群的時(shí)候很不方便,需要重新提交topology。因此我在storm的郵件列表里提了這個(gè)問題,storm的開發(fā)者nathanmarz創(chuàng)建了一個(gè)issue 54并在0.6.1提供了rebalance命令來讓正在運(yùn)行的topology重新負(fù)載均衡,具體見:
          https://github.com/nathanmarz/storm/issues/54
          和0.6.1的變更:
          http://groups.google.com/group/storm-user/browse_thread/thread/24a8fce0b2e53246

          storm并不提供機(jī)制來動(dòng)態(tài)調(diào)整worker和task數(shù)目。

          六、Storm UI里spout統(tǒng)計(jì)的complete latency的具體含義是什么?為什么emit的數(shù)目會(huì)是acked的兩倍?
          這個(gè)事實(shí)上是storm郵件列表里的一個(gè)問題。Storm作者marz的解答:
          The complete latency is the time from the spout emitting a tuple to that
          tuple being acked on the spout
          . So it tracks the time 
          for the whole tuple
          tree to be processed.

          If you dive into the spout component in the UI, you
          'll see that a lot of
          the emitted/transferred is on the __ack* stream. This is the spout
          communicating with the ackers which take care of tracking the tuple trees.


          簡單地說,complete latency表示了tuple從emit到被acked經(jīng)過的時(shí)間,可以認(rèn)為是tuple以及該tuple的后續(xù)子孫(形成一棵樹)整個(gè)處理時(shí)間。其次spout的emit和transfered還統(tǒng)計(jì)了spout和acker之間內(nèi)部的通信信息,比如對(duì)于可靠處理的spout來說,會(huì)在emit的時(shí)候同時(shí)發(fā)送一個(gè)_ack_init給acker,記錄tuple id到task id的映射,以便ack的時(shí)候能找到正確的acker task。

          posted @ 2011-12-19 15:25 dennis 閱讀(14990) | 評(píng)論 (9)編輯 收藏

              原文:http://www.aygfsteel.com/killme2008/archive/2011/11/17/364112.html
              作者:dennis (killme2008@gmail.com)
              轉(zhuǎn)載請(qǐng)注明出處。

              最近一直在讀twitter開源的這個(gè)分布式流計(jì)算框架——storm的源碼,還是有必要記錄下一些比較有意思的地方。我按照storm的主要概念進(jìn)行組織,并且只分析我關(guān)注的東西,因此稱之為淺析。       

          一、介紹
              Storm的開發(fā)語言主要是Java和Clojure,其中Java定義骨架,而Clojure編寫核心邏輯。源碼統(tǒng)計(jì)結(jié)果:
               180 text files.
               
          177 unique files.                                          
                 
          7 files ignored.

          http:
          //cloc.sourceforge.net v 1.55  T=1.0 s (171.0 files/s, 46869.0 lines/s)
          -------------------------------------------------------------------------------
          Language                     files          blank        comment           code
          -------------------------------------------------------------------------------
          Java                           
          125           5010           2414          25661
          Lisp                            
          33            732            283           4871
          Python                           
          7            742            433           4675
          CSS                              
          1             12             45           1837
          ruby                             
          2             22              0            104
          Bourne Shell                     
          1              0              0              6
          Javascript                       
          2              1             15              6
          -------------------------------------------------------------------------------
          SUM:                           
          171           6519           3190          37160
          -------------------------------------------------------------------------------

              Java代碼25000多行,而Clojure(Lisp)只有4871行,說語言不重要再次證明是扯淡。
                  
          二、Topology和Nimbus       
              Topology是storm的核心理念,將spout和bolt組織成一個(gè)topology,運(yùn)行在storm集群里,完成實(shí)時(shí)分析和計(jì)算的任務(wù)。這里我主要想介紹下topology部署到storm集群的大概過程。提交一個(gè)topology任務(wù)到Storm集群是通過StormSubmitter.submitTopology方法提交:
          StormSubmitter.submitTopology(name, conf, builder.createTopology());
              我們將topology打成jar包后,利用bin/storm這個(gè)python腳本,執(zhí)行如下命令:
          bin/storm jar xxxx.jar com.taobao.MyTopology args
              將jar包提交給storm集群。storm腳本會(huì)啟動(dòng)JVM執(zhí)行Topology的main方法,執(zhí)行submitTopology的過程。而submitTopology會(huì)將jar文件上傳到nimbus,上傳是通過socket傳輸。在storm這個(gè)python腳本的jar方法里可以看到:
          def jar(jarfile, klass, *args):                                                                                                                               
             exec_storm_class(                                                                                                                                          
                  klass,                                                                                                                                                
                  jvmtype
          ="-client",                                                                                                                                    
                  extrajars
          =[jarfile, CONF_DIR, STORM_DIR + "/bin"],                                                                                                    
                  args
          =args,                                                                                                                                            
                  prefix
          ="export STORM_JAR=" + jarfile + ";")
               將jar文件的地址設(shè)置為環(huán)境變量STORM_JAR,這個(gè)環(huán)境變量在執(zhí)行submitTopology的時(shí)候用到:
          //StormSubmitter.java 
          private static void submitJar(Map conf) {
                  
          if(submittedJar==null) {
                      LOG.info(
          "Jar not uploaded to master yet. Submitting jar");
                      String localJar 
          = System.getenv("STORM_JAR");
                      submittedJar 
          = submitJar(conf, localJar);
                  } 
          else {
                      LOG.info(
          "Jar already uploaded to master. Not submitting jar.");
                  }
              }
              通過環(huán)境變量找到j(luò)ar包的地址,然后上傳。利用環(huán)境變量傳參是個(gè)小技巧。

              其次,nimbus在接收到j(luò)ar文件后,存放到數(shù)據(jù)目錄的inbox目錄,nimbus數(shù)據(jù)目錄的結(jié)構(gòu)
          -nimbus
               
          -inbox
                   
          -stormjar-57f1d694-2865-4b3b-8a7c-99104fc0aea3.jar
                   
          -stormjar-76b4e316-b430-4215-9e26-4f33ba4ee520.jar

               
          -stormdist
                  
          -storm-id
                     
          -stormjar.jar
                     
          -stormconf.ser
                     
          -stormcode.ser
               其中inbox用于存放提交的jar文件,每個(gè)jar文件都重命名為stormjar加上一個(gè)32位的UUID。而stormdist存放的是啟動(dòng)topology后生成的文件,每個(gè)topology都分配一個(gè)唯一的id,ID的規(guī)則是“name-計(jì)數(shù)-時(shí)間戳”。啟動(dòng)后的topology的jar文件名命名為storm.jar ,而它的配置經(jīng)過java序列化后存放在stormconf.ser文件,而stormcode.ser是將topology本身序列化后存放的文件。這些文件在部署的時(shí)候,supervisor會(huì)從這個(gè)目錄下載這些文件,然后在supervisor本地執(zhí)行這些代碼。
              進(jìn)入重點(diǎn),topology任務(wù)的分配過程(zookeeper路徑說明忽略root):
          1.在zookeeper上創(chuàng)建/taskheartbeats/{storm id} 路徑,用于任務(wù)的心跳檢測(cè)。storm對(duì)zookeeper的一個(gè)重要應(yīng)用就是利用zk的臨時(shí)節(jié)點(diǎn)做存活檢測(cè)。task將定時(shí)刷新節(jié)點(diǎn)的時(shí)間戳,然后nimbus會(huì)檢測(cè)這個(gè)時(shí)間戳是否超過timeout設(shè)置。
          2.從topology中獲取bolts,spouts設(shè)置的并行數(shù)目以及全局配置的最大并行數(shù),然后產(chǎn)生task id列表,如[1 2 3 4]
          3.在zookeeper上創(chuàng)建/tasks/{strom id}/{task id}路徑,并存儲(chǔ)task信息
          4.開始分配任務(wù)(內(nèi)部稱為assignment), 具體步驟:
           (1)從zk上獲得已有的assignment(新的toplogy當(dāng)然沒有了)
           (2)查找所有可用的slot,所謂slot就是可用的worker,在所有supervisor上配置的多個(gè)worker的端口。
           (3)將任務(wù)均勻地分配給可用的worker,這里有兩種情況:
           (a)task數(shù)目比worker多,例如task是[1 2 3 4],可用的slot只有[host1:port1 host2:port1],那么最終是這樣分配
          {1: [host1:port1] 2 : [host2:port1]
                   
          3 : [host1:port1] 4 : [host2:port1]}
          ,可以看到任務(wù)平均地分配在兩個(gè)worker上。
          (b)如果task數(shù)目比worker少,例如task是[1 2],而worker有[host1:port1 host1:port2 host2:port1 host2:port2],那么首先會(huì)將woker排序,將不同host間隔排列,保證task不會(huì)全部分配到同一個(gè)worker上,也就是將worker排列成
          [host1:port1 host2:port1 host1:port2 host2:port2]
          ,然后分配任務(wù)為
          {1: host1:port1 , 2 : host2:port2}

          (4)記錄啟動(dòng)時(shí)間
          (5)判斷現(xiàn)有的assignment是否跟重新分配的assignment相同,如果相同,不需要變更,否則更新assignment到zookeeper的/assignments/{storm id}上。
          5.啟動(dòng)topology,所謂啟動(dòng),只是將zookeeper上/storms/{storm id}對(duì)應(yīng)的數(shù)據(jù)里的active設(shè)置為true。
          6.nimbus會(huì)檢查task的心跳,如果發(fā)現(xiàn)task心跳超過超時(shí)時(shí)間,那么會(huì)重新跳到第4步做re-assignment。

          posted @ 2011-12-01 21:48 dennis 閱讀(15227) | 評(píng)論 (10)編輯 收藏


              所謂兵馬未動(dòng),糧草先行,準(zhǔn)備將storm用在某個(gè)項(xiàng)目中做實(shí)時(shí)數(shù)據(jù)分析。無論任何系統(tǒng),一定要有監(jiān)控系統(tǒng)并存,當(dāng)故障發(fā)生的時(shí)候你能第一個(gè)知道,而不是讓別人告訴你,那處理故障就很被動(dòng)了。

              因此我寫了這么個(gè)項(xiàng)目,取名叫storm-monitor,放在了github上

               https://github.com/killme2008/storm-monitor

              主要功能如下:
          1.監(jiān)控supervisor數(shù)目是否正確,當(dāng)supervisor掛掉的時(shí)候會(huì)發(fā)送警告。
          2.監(jiān)控nimbus是否正常運(yùn)行,monitor會(huì)嘗試連接nimbus,如果連接失敗就認(rèn)為nimbus掛掉。
          3.監(jiān)控topology是否正常運(yùn)行,包括它是否正常部署,是否有運(yùn)行中的任務(wù)。

              當(dāng)故障發(fā)生的時(shí)候通過alarm方法警告用戶,開放出去的只是簡單地打日志。因?yàn)槊總€(gè)公司的告警接口不一樣,所以你需要自己擴(kuò)展,修改alarm.clj即可。我們這兒就支持旺旺告警和手機(jī)短信告警。

              基本的原理很簡單,對(duì)supervisor和topology的監(jiān)控是通過zookeeper來間接地監(jiān)控,通過定期查看path是否存在。對(duì)nimbus的監(jiān)控是每次起一個(gè)短連接連上去,連不上去即認(rèn)為掛掉。

              整個(gè)項(xiàng)目也是用clojure寫。你的機(jī)器需要安裝leinexec插件,然后將你的storm.yaml拷貝到conf目錄下,編輯monitor.yaml設(shè)定監(jiān)控參數(shù)如檢查間隔等,最后啟動(dòng)start.sh腳本即可。默認(rèn)日志輸出在logs/monitor.log。

          posted @ 2011-12-01 21:02 dennis 閱讀(10542) | 評(píng)論 (0)編輯 收藏


              在豆瓣發(fā)了一些牢騷,索性多說一些我個(gè)人對(duì)人對(duì)事的偏見,既然是偏見,就不會(huì)讓人舒服,事先聲明是扯淡,不想浪費(fèi)時(shí)間的人略過。

          1.我們要遠(yuǎn)離新浪微博,新浪微博跟twitter不一樣,twitter是為了讓每個(gè)人的信息的更好更快地傳播而設(shè)計(jì)的,而新浪微博是為了讓權(quán)威的聲音更好更快地傳播而設(shè)計(jì)的。迷戀上新浪微博,你要么是權(quán)威,要么是跟隨權(quán)威。成為權(quán)威的,免不了沾沾自喜,真以為自己成了“權(quán)威”。更可怕的是你不可避免地要生活在相互吹捧和喧囂中。

          2.在編寫代碼之外,我們可能需要更多的手藝傍身,例如木匠或者廚師,以免在亂世的時(shí)候因?yàn)椴恍枰绦騿T而餓死。ps.計(jì)算彈道軌跡的程序員除外。

          3.據(jù)說真正的牛人從不跳槽,作為大多數(shù)不是牛人,以及已經(jīng)遠(yuǎn)離牛人行列的我們(跳槽超過3次以上),跳槽仍然是你提升自己的有效途徑,無論是薪水還是技術(shù)。

          4.寫簡歷的技巧,我慢慢領(lǐng)悟到了,少點(diǎn)技術(shù)術(shù)語,多點(diǎn)成效和應(yīng)用,打動(dòng)了HR過了第一關(guān)之后,再去跟技術(shù)人員扯淡。

          5.簡歷要定時(shí)更新,你可以理解成定時(shí)提醒下獵頭和HR,關(guān)注我啊,關(guān)注我啊。

          6.強(qiáng)烈地?fù)肀谋净渲梦谋净]人會(huì)腦殘地用二進(jìn)制當(dāng)配置文件吧?),協(xié)議文本化,婚姻文本化。

          7.一切不以加薪為目的的挽留,都是耍流氓,這不是我的原創(chuàng)。

          8.有趣比實(shí)用重要,沒趣味的東西,給錢也不去做(好吧,我說假話)。

          9.對(duì)新潮的東西保持一點(diǎn)警惕,如果這個(gè)東西三個(gè)月后還有人在談?wù)摚强梢躁P(guān)注下

          10.代碼永遠(yuǎn)比文檔、博客真實(shí)和靠譜,閱讀代碼習(xí)慣了,跟閱讀文檔沒啥區(qū)別。

          11.少關(guān)注博客和新聞,戒掉看google reader的習(xí)慣。現(xiàn)在更多地看maillist上的討論和問題,真正重要的東西你永遠(yuǎn)不會(huì)錯(cuò)過。

          12.不追求完美,等你完美的時(shí)候別人已經(jīng)是事實(shí)標(biāo)準(zhǔn)。

          13.大型的技術(shù)聚會(huì)不是為技術(shù)人員準(zhǔn)備的,這是大公司給員工的度假福利和領(lǐng)導(dǎo)們的吹水時(shí)間。只有在小型的技術(shù)聚會(huì)上才能看到一些有價(jià)值的東西,任何稍微跟商業(yè)沾一點(diǎn)邊的幾乎都沒有太大價(jià)值,我說的是國內(nèi)。

          14.80%的分享都只對(duì)演講者有益,該sb的還是sb,該牛b的還是牛b。最有效的分享是結(jié)對(duì)編程和結(jié)對(duì)review。分享和培訓(xùn)最大的意義是讓行政們覺的自己的存在價(jià)值很大。

          15.國內(nèi)翻譯國外經(jīng)典>國內(nèi)原創(chuàng)精品>國外原版,這個(gè)原則對(duì)英語好的人除外。

          16.極其討厭要求強(qiáng)制縮進(jìn)的語言,比如python。

          17.標(biāo)榜是一種人生態(tài)度,裝B裝久了你就真牛B了。

          18.憑啥不造輪子,你們?cè)燧喿邮嫣沽耍炝耍筒蛔寗e人造了。我造輪子我快樂。

          19.偏見不全是壞事,壞的是不愿意改變偏見。


              扯淡時(shí)間結(jié)束。

          posted @ 2011-11-30 22:50 dennis 閱讀(4471) | 評(píng)論 (14)編輯 收藏

          今天看到的一個(gè)演示TCP慢啟動(dòng)和滑動(dòng)窗口機(jī)制的動(dòng)畫,很形象
          osischool.com

          posted @ 2011-11-16 07:34 dennis 閱讀(6569) | 評(píng)論 (3)編輯 收藏

          Items\Projects
          Yahoo! s4
          Twitter Storm
          協(xié)議
          Apache license 2.0
          Eclipse Public License 1.0
          開發(fā)語言
          Java
          Clojure,Java,Clojure編寫了核心代碼
          結(jié)構(gòu)
          去中心化的對(duì)等結(jié)構(gòu)
          有中心節(jié)點(diǎn)nimbus,但非關(guān)鍵
          通信
          可插拔的通訊層,目前是基于UDP的實(shí)現(xiàn) 基于facebook開源的thrift框架
          事件/Stream
          <K,A>序列,用戶可自定義事件類 提供Tuple類,用戶不可自定義事件類,
          但是可以命名field和注冊(cè)序列化器
          處理單元 Processing Elements,內(nèi)置PE處理
          count,join和aggregate等常見任務(wù)
          Bolt,沒有內(nèi)置任務(wù),提供IBasicBolt處理
          自動(dòng)ack
          第三方交互
          提供API,Client Adapter/Driver,第三方客戶端輸入或者輸出事件 定義Spout用于產(chǎn)生Stream,沒有標(biāo)準(zhǔn)輸出API
          持久化 提供Persist API規(guī)范,可根據(jù)頻率或者次數(shù)做
          持久化
          無特定API,用戶可自行選擇處理
          可靠處理 無,可能會(huì)丟失事件 提供對(duì)事件處理的可靠保證(可選)
          路由EventType + Keyed attribute + value匹配
          內(nèi)置count,join和aggregate標(biāo)準(zhǔn)任務(wù)
          Stream Groupings:
          Shuffle,Fields,All,Global,None,Direct
          非常靈活的路由方式
          多語言支持 暫時(shí)只支持Java多語言支持良好,本身支持Java,Clojure,
          其他非JVM語言通過thrift和進(jìn)程間通訊
          Failover
           部分支持,數(shù)據(jù)無法failover 部分支持,數(shù)據(jù)同樣無法failover
          Load Balance
          不支持 不支持
           并行處理 取決于節(jié)點(diǎn)數(shù)目,不可調(diào)節(jié) 可配置worker和task數(shù)目,storm會(huì)盡量將worker和task均勻分布
          動(dòng)態(tài)增刪節(jié)點(diǎn)不支持
           支持
          動(dòng)態(tài)部署
           不支持 支持
          web管理 不支持 支持
          代碼成熟度 半成品 成熟
          活躍度 低 活躍
          編程 編程 + XML配置
            純編程
          參考文檔 http://docs.s4.io/https://github.com/nathanmarz/storm/wiki/
          http://xumingming.sinaapp.com/category/storm/ (非常好的中文翻譯)

          posted @ 2011-11-08 22:25 dennis 閱讀(13178) | 評(píng)論 (14)編輯 收藏

          clj-xmemcached

              Clj-xmemcached is an opensource memcached client for clojure wrapping xmemcached. Xmemcached is an opensource high performance memcached client for java.

          Leiningen Usage

          To include clj-xmemcached,add:

               [clj-xmemcached "0.1.1"]
          

          to your project.clj.

          Usage

          Create a client

          (use [clj-xmemcached.core])
          (def client (xmemcached 
          "host:port"))
          (def client (xmemcached 
          "host1:port1 host2:port2" :protocol "binary"))

          Then we create a memcached client using binary protocol to talk with memcached servers host1:port1 and host2:port2. Valid options including:

            :name       Client's name
            :protocol  Protocol to talk with memcached,a string value in text,binary or kestrel,default is text protocol.
            :hash          Hash algorithm,a string value in consistent or standard,default is standard hash.
            :timeout    Operation timeout in milliseconds,default is five seconds.
            :pool          Connection pool size,default is one.
          

          Store items


          (xset client "key" "dennis")
          (xset client 
          "key" "dennis" 100)
          (xappend client 
          "key" " zhuang")
          (xprepend client 
          "key" "hello,")

          The value 100 is the expire time for the item in seconds.Store functions include xset,xadd,xreplace,xappend and xprepend.Please use doc to print documentation for these functions.

          Get items

          (xget client "key")
          (xget client 
          "key1" "key2" "key3")
          (xgets client 
          "key")

          xgets returns a value including a cas value,for example:

            {:value "hello,dennis zhuang", :class net.rubyeye.xmemcached.GetsResponse, :cas 396}

          And bulk get returns a HashMap contains existent items.

          Increase/Decrease numbers


          (xincr client "num" 1)
          (xdecr client 
          "num" 1)
          (xincr client 
          "num" 1 0)

          Above codes try to increase/decrease a number in memcached with key "num",and if the item is not exists,then set it to zero.

          Delete items

          (xdelete client "num")

          Compare and set

          (xcas client "key" inc)

          We use inc function to increase the current value in memcached and try to compare and set it at most Integer.MAX_VALUE times. xcas can be called as:

           (xcas client key cas-fn max-times)

          The cas-fn is a function to return a new value,set the new value to

          (cas-fn current-value)

          Shutdown

          (xshutdown client)

          Flush

          (xflush client)
          (xflush client (InetSocketAddress. host port))

          Statistics

          (xstats client)

          Example

          Please see the example code in example/demo.clj

          License

          Copyright (C) 2011-2014 dennis zhuang[killme2008@gmail.com]

          Distributed under the Eclipse Public License, the same as Clojure.

          posted @ 2011-10-30 13:03 dennis 閱讀(3177) | 評(píng)論 (0)編輯 收藏


              將自己在googlecode和github上的所有項(xiàng)目過了一遍,整理一張列表,列下一些還有點(diǎn)價(jià)值和用處的項(xiàng)目,都不是什么great job,純粹是為了工作需要或者樂趣寫的東西,看官要是有興趣也可以瞧瞧。

           一 Java相關(guān)

          1.Xmemcached,還算是比較多人使用的一個(gè)java memcached client,優(yōu)點(diǎn)是效率和易用性,缺點(diǎn)是代碼寫的不怎么樣,兩年前發(fā)展到現(xiàn)在的東西,以后還會(huì)繼續(xù)維護(hù)。

          2.HS4J,看handlersocket的時(shí)候順手寫的客戶端,我們公司內(nèi)部某些項(xiàng)目在用,可能還有其他公司外的朋友在用,后來同事聚石貢獻(xiàn)了一個(gè)擴(kuò)展項(xiàng)目hs4j-kit,更易于使用,他寫的代碼很優(yōu)雅漂亮,推薦一看。暫時(shí)沒有精力維護(hù)。

          3.Aviator,一個(gè)很初級(jí)的表達(dá)式執(zhí)行引擎,行家看到肯定要笑話我。不過語法上很符合我自己的口味,我們自己的項(xiàng)目在用,也有幾個(gè)朋友在用,會(huì)繼續(xù)維護(hù)。

          4.Jevent,一個(gè)玩具,其實(shí)是模仿libevent的一個(gè)java實(shí)現(xiàn),對(duì)nio或者libevent的實(shí)現(xiàn)機(jī)制感興趣的還可以看看。

          5. Kilim,我fork的kilim實(shí)現(xiàn),修改了nio調(diào)度器,使用多個(gè)reactor做調(diào)度效率更高,并添加了一個(gè)HttpClient的實(shí)現(xiàn)。

          二 Android項(xiàng)目

          學(xué)習(xí)android完全是玩票性質(zhì),有3個(gè)項(xiàng)目,對(duì)初學(xué)android開發(fā)的可能有點(diǎn)參考價(jià)值。

          1.WhetherWeather,一個(gè)天氣預(yù)報(bào)和告警的widget插件,UI太丑了。
          2.UniqRecorder,寫來記錄兒子體重變化的小工具,可以自定義項(xiàng)目和生成曲線圖,我自己還在用。
          3.UniqTask,最近寫的殺進(jìn)程工具,絕對(duì)輕量級(jí),沒廣告,也是我自己在用。

          三 Clojure項(xiàng)目

          1.cscheme,一個(gè)用clojure實(shí)現(xiàn)的scheme解釋器,基于sicp這本書的解釋器實(shí)現(xiàn)。
          2.clojure-control,類似node-control的分布式部署和管理的DSL實(shí)現(xiàn),挺好玩的,也有朋友在用,我自己還用不上,sunny有寫了個(gè)很方便的lein插件node-control

          clojure還寫了一堆爛尾項(xiàng)目,就不拿出來惡心人了。

          四 其他

          1.node-zk-browser,一個(gè)展現(xiàn)和管理zookeeper的web應(yīng)用,我們自己在用,基于node.js實(shí)現(xiàn)。
          2.erlwsh,一個(gè)erlang的web shell實(shí)現(xiàn),可以在瀏覽器里做erlang編程,被一些開源項(xiàng)目比如membase用到了。

              寫這些東西對(duì)我自己最有好處,如果能順便給他人帶來好處,那是額外的好處。最近正處于我自己一生中也許是最大的轉(zhuǎn)折關(guān)頭,不能更新blog了,最后,祈求諸天神佛能帶來奇跡。

          posted @ 2011-10-09 20:23 dennis 閱讀(6580) | 評(píng)論 (15)編輯 收藏


              xmemcached緊急發(fā)布1.3.5版本,主要是修復(fù)兩個(gè)相對(duì)嚴(yán)重的bug:

          Issue 154: 在重連本地memcached的時(shí)候,有可能出現(xiàn)重連無法成功的情況,導(dǎo)致連接丟失,詳情見這里
          Issue 155: 重連導(dǎo)致文件句柄數(shù)超過限制的bug,這是由于重連失敗情況下沒有合理關(guān)閉socket引起的,詳情見這里

              如果你使用maven,簡單升級(jí)版本即可:
           <dependency>
                
          <groupId>com.googlecode.xmemcached</groupId>
                
          <artifactId>xmemcached</artifactId>
                
          <version>1.3.5</version>
           
          </dependency>


              下載地址:http://code.google.com/p/xmemcached/downloads/list

              此版本推薦升級(jí),最后感謝兩位老外開發(fā)者的幫助: ilkinulasMrRubato

          posted @ 2011-10-01 15:11 dennis 閱讀(4203) | 評(píng)論 (6)編輯 收藏

              好吧,我知道現(xiàn)在是凌晨4點(diǎn)了,寫完這個(gè)就睡覺。

              我一直很不爽android的ES任務(wù)管理器,它的廣告設(shè)置的地方非常惡心,就放在kill鍵的下面,而且每次都突然跳出來,讓你很容易錯(cuò)誤點(diǎn)擊。我很佩服他們能想出這種提高點(diǎn)擊率的辦法,但是又無比鄙視這種做法。今天(哦,不是昨天)晚上在twitter上說了,我想自己寫個(gè)任務(wù)管理器,類似ES任務(wù)管理器,并且沒有廣告。那好吧,說干就干,奮斗了一個(gè)晚上,終于搞出了成果,這就是隆重登場(chǎng)的UniqTask,先看看運(yùn)行時(shí)截圖:



              這是運(yùn)行在我的GS2上的截圖。

              UniqTask的功能跟ES任務(wù)管理器的功能完全一致,可以記錄kill的歷史,每次啟動(dòng)UniqTask的時(shí)候自動(dòng)標(biāo)記過去kill過的進(jìn)程。但是UniqTask完全綠色無毒,絕對(duì)沒有廣告,咔咔。

              許久沒寫android程序,拿起手來不是很順利,折騰到現(xiàn)在才搞定,我將代碼放到了github上,也提供了APK下載,非常歡迎試用啊。

              源碼地址:
              https://github.com/killme2008/UniqTask
              APK下載:
              https://github.com/killme2008/UniqTask/blob/master/UniqTask.apk

              白天還有重要的事情要處理,睡覺去了。

          posted @ 2011-09-20 04:10 dennis 閱讀(3112) | 評(píng)論 (5)編輯 收藏

          僅列出標(biāo)題
          共56頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 苏尼特右旗| 湘乡市| 儋州市| 监利县| 东平县| 达孜县| 碌曲县| 德州市| 鹤庆县| 甘肃省| 明星| 凤翔县| 缙云县| 桐乡市| 静安区| 交口县| 吐鲁番市| 五大连池市| 兰溪市| 应用必备| 宁晋县| 八宿县| 祁阳县| 灯塔市| 桂东县| 海晏县| 信阳市| 称多县| 淅川县| 永吉县| 益阳市| 手游| 东丰县| 仙居县| 全椒县| 石首市| 新乡市| 黎平县| 岗巴县| 皮山县| 巧家县|