锘??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区在线视频播放,久久精品国产77777蜜臀,亚洲欧洲午夜http://m.shnenglu.com/kevinlynx/category/20475.html浣庤皟鍋氭妧鏈痏_嬈㈣繋縐繪鎴戠殑鐙珛鍗氬 <a >codemaro.com</a>zh-cnThu, 08 Aug 2013 15:21:54 GMTThu, 08 Aug 2013 15:21:54 GMT60Dhtcrawler2鎹㈢敤sphinx鎼滅儲http://m.shnenglu.com/kevinlynx/archive/2013/08/08/202417.htmlKevin LynxKevin LynxThu, 08 Aug 2013 15:04:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/08/08/202417.htmlhttp://m.shnenglu.com/kevinlynx/comments/202417.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/08/08/202417.html#Feedback0http://m.shnenglu.com/kevinlynx/comments/commentRss/202417.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/202417.html

dhtcrawler2鏈寮濮嬩嬌鐢╩ongodb鑷甫鐨勫叏鏂囨悳绱㈠紩鎿庢悳绱㈣祫婧愩傛悳绱竴浜涚煭鍏抽敭瀛楁椂寰堝鏄撳鑷磂rlang榪涚▼call timeout錛屼篃灝辨槸鏌ヨ鏃墮棿澶暱銆傚浜庡儚avi榪欑鍏抽敭瀛楋紝鎼滅儲鏃墮棿闀胯揪鍗佸嚑縐掋傛悳绱㈢殑璧勬簮鏁伴噺200涓囧乏鍙熾傝繖鍏朵腑澶ч儴鍒嗚祫婧愬彧鏄root鏂囦歡鍚嶈繘琛屼簡绱㈠紩錛屽嵆瀵逛簬澶氭枃浠惰祫婧愯岃█娌℃湁绱㈠紩鍗曚釜鏂囦歡鍚嶃傜儲寮曟柟寮忔湁閮ㄥ垎璧勬簮鏄寜鐓у瓧絎︿覆瀛愪覆鐨勫艦寮忥紝娌℃湁鎷嗚瘝錛岄潪甯稿崰鐢ㄥ瓨鍌ㄧ┖闂達紱鏈夐儴鍒嗘槸浣跨敤浜唕mmseg錛堟垜緙栬瘧浜唕mmseg-cpp浣滀負erlang nif搴撹皟鐢?erl-rmmseg錛夎繘琛屼簡鎷嗚瘝錛屽崰鐢ㄧ┖闂村皬浜嗗緢澶氾紝浣嗙敱浜庤瘝搴撻棶棰樺緢澶氱墖閲岀殑璇嶆眹娌℃媶鍑烘潵銆?/p>

寰堟棭浠ュ墠鎴戜互涓烘悳绱㈣楁椂鐨勫師鍥犳槸鍥犱負鏁版嵁搴撳お蹇欙紝鎯抽儴緗蹭釜mongodb闆嗙兢鍑烘潵銆傚悗鏉ュ彂鐜版暟鎹簱娌℃湁浠諱綍璇誨啓鐨勭姸鎬佷笅錛屾煡璇緷鐒舵參銆傜粓浜庡彧濂芥斁寮僲ongodb鑷甫鐨勬枃鏈悳绱€備簬鏄垜鏀圭敤sphinx銆傜畝鍗曡搗瑙侊紝鎴戠洿鎺ヤ笅杞戒簡coreseek4.1錛坰phinx鐨勪竴涓敮鎸佷腑鏂囨媶璇嶇殑鍖呰錛夈?/p>

鐜板湪錛屽凡緇忓鍏ヤ簡200澶氫竾鐨勮祫婧愯繘sphinx錛屽茍涓旂儲寮曚簡鎵鏈夋枃浠跺悕錛岀儲寮曟枃浠惰揪800M銆傚浜?code>avi鍏抽敭瀛楃殑鎼滅儲澶ф娑堣?.2縐掔殑鏃墮棿銆?a >鎼滅儲璇曡瘯銆?/p>

浠ヤ笅璁板綍涓媠phinx鍦╠htcrawler鐨勫簲鐢?/p>

sphinx綆浠?/h3>

sphinx鍖呭惈涓や釜涓昏鐨勭▼搴忥細indexer鍜宻earchd銆俰ndexer鐢ㄤ簬寤虹珛鏂囨湰鍐呭鐨勭儲寮曪紝鐒跺悗searchd鍩轟簬榪欎簺绱㈠紩鎻愪緵鏂囨湰鎼滅儲鍔熻兘錛岃岃浣跨敤璇ュ姛鑳斤紝鍙互閬靛驚searchd鐨勭綉緇滃崗璁繛鎺earchd榪欎釜鏈嶅姟鏉ヤ嬌鐢ㄣ?/p>

indexer鍙互閫氳繃澶氱鏂瑰紡鏉ヨ幏鍙栬繖浜涙枃鏈唴瀹癸紝鏂囨湰鍐呭鐨勬潵婧愮О涓烘暟鎹簮銆俿phinx鍐呯疆mysql榪欑鏁版嵁婧愶紝鎰忔濇槸鍙互鐩存帴浠巑ysql鏁版嵁搴撲腑鍙栧緱鏁版嵁銆俿phinx榪樻敮鎸亁mlpipe2榪欑鏁版嵁婧愶紝鍏舵暟鎹互xml鏍煎紡鎻愪緵緇檌ndexer銆傝瀵煎叆mongodb鏁版嵁搴撻噷鐨勫唴瀹癸紝鍙互閫夋嫨浣跨敤xmlpipe2榪欑鏂瑰紡銆?/p>

sphinx document

xmlpipe2鏁版嵁婧愰渶瑕佹寜鐓т互涓嬫牸寮忔彁浜わ細

<sphinx:docset>
    <sphinx:schema>
        <sphinx:field name="subject"/>
        <sphinx:field name="files"/>
        <sphinx:attr name="hash1" type="int" bits="32"/>
        <sphinx:attr name="hash2" type="int" bits="32"/>
    </sphinx:schema>
    <sphinx:document id="1">
        <subject>this is the subject</subject>
        <files>file content</files>
        <hash1>111</hash1>
    </sphinx:document>
</sphinx:docset>

璇ユ枃浠跺寘鍚袱澶ч儴鍒嗭細schema鍜?code>documents錛屽叾涓?code>schema鍙堝寘鍚袱閮ㄥ垎錛?code>field鍜?code>attr錛屽叾涓敱field鏍囪瘑鐨勫瓧孌靛氨浼氳indexer璇誨彇騫跺叏閮ㄤ綔涓鴻緭鍏ユ枃鏈緩绔嬬儲寮曪紝鑰?code>attr鍒欐爣璇嗘煡璇㈢粨鏋滈渶瑕侀檮甯︾殑淇℃伅錛?code>documents鍒欐槸鐢變竴涓釜sphinx:document緇勬垚錛屽嵆indexer鐪熸瑕佸鐞嗙殑鏁版嵁銆傛敞鎰忓叾涓schema寮曠敤鐨勫睘鎬у悕銆?/p>

document涓涓緢閲嶈鐨勫睘鎬у氨鏄畠鐨刬d銆傝繖涓猧d瀵瑰簲浜巗phinx闇瑕佸敮涓錛屾煡璇㈢粨鏋滀篃浼氬寘鍚id銆備竴鑸儏鍐典笅錛屾id鍙互鐩存帴鏄暟鎹簱涓婚敭錛屽彲鐢ㄤ簬鏌ヨ鍒拌緇嗕俊鎭俿earchd鎼滅儲鍏抽敭瀛楋紝鍏跺疄鍙互鐪嬩綔涓烘悳绱㈣繖浜沝ocument錛屾悳绱㈠嚭鏉ョ殑緇撴灉涔熸槸榪欎簺document錛屾悳绱㈢粨鏋滀腑涓昏鍖呭惈schema涓寚瀹氱殑attr銆?/p>

澧為噺绱㈠紩

鏁版嵁婧愮殑鏁版嵁涓鑸槸鍙樺寲鐨勶紝鏂板鐨勬暟鎹鍔犲叆鍒皊phinx绱㈠紩鏂囦歡涓紝鎵嶈兘浣垮緱searchd鎼滅儲鍒版柊褰曞叆鐨勬暟鎹傝涓嶆柇鍦板姞鍏ユ柊鏁版嵁錛屽彲浠ヤ嬌鐢ㄥ閲忕儲寮曟満鍒躲傚閲忕儲寮曟満鍒朵腑錛岄渶瑕佷竴涓富绱㈠紩鍜屼竴涓绱㈠紩(delta index)銆傛瘡嬈℃柊澧炵殑鏁版嵁閮藉緩绔嬩負嬈$儲寮曪紝鐒跺悗涓孌墊椂闂村悗鍐嶅悎騫惰繘涓葷儲寮曘傝繖涓繃紼嬩富瑕佽繕鏄嬌鐢╥ndexer鍜宻earchd紼嬪簭銆傚疄闄呬笂錛宻earchd鏄竴涓渶瑕佷竴鐩磋繍琛岀殑鏈嶅姟錛岃宨ndexer鍒欐槸涓涓緩绔嬪畬绱㈠紩灝遍鍑虹殑宸ュ叿紼嬪簭銆傛墍浠ワ紝榪欓噷鐨勫閲忕儲寮曟満鍒訛紝鍏朵腑娑夊強鍒扮殑“姣忛殧涓瀹氭椂闂村氨鍚堝茍”榪欑宸ヤ綔錛岄渶瑕佽嚜宸卞啓紼嬪簭鏉ュ崗璋冿紙鎴栭氳繃鍏朵粬宸ュ叿錛?/p>

sphinx涓巑ongodb

涓婇潰鎻愬埌錛屼竴鑸瑂phinx document鐨刬d閮芥槸浣跨敤鐨勬暟鎹簱涓婚敭錛屼互鏂逛究鏌ヨ銆備絾mongodb涓粯璁ゆ儏鍐典笉浣跨敤鏁板瓧浣滀負涓婚敭銆俤htcrawler鐨勮祫婧愭暟鎹簱浣跨敤鐨勬槸璧勬簮info-hash浣滀負涓婚敭錛岃繖鏃犳硶浣滀負sphinx document鐨刬d銆備竴縐嶈В鍐沖姙娉曟槸錛屽皢璇ash鎸変綅鎷嗗垎錛屾媶鍒嗘垚鑻ュ共涓猻phinx document attr鏀寔浣嶆暟鐨勬暣鏁般備緥濡傦紝info-hash鏄竴涓?60浣嶇殑id錛屽鏋滀嬌鐢?2浣嶇殑attr錛堥珮鐗堟湰鐨剆phinx鏀寔64浣嶇殑鏁存暟錛夛紝閭d箞鍙互鎶婅info-hash鎸変綅鎷嗗垎鎴?涓猘ttr銆傝宻phinx document id鍒欏彲浠ヤ嬌鐢ㄤ換鎰忔暟瀛楋紝鍙淇濊瘉涓嶅啿紿佸氨琛屻傚綋鑾峰緱鏌ヨ緇撴灉鏃訛紝鍙栧緱瀵瑰簲鐨刟ttr錛岀粍鍚堜負info-hash鍗沖彲銆?/p>

mongodb榛樿鐨凮bject id涔熷彲浠ユ寜榪欑鏂瑰紡鎷嗗垎銆?/p>

dhtcrawler2涓巗phinx

dhtcrawler2涓垜鑷繁鍐欎簡涓涓鍏ョ▼搴忋傝紼嬪簭浠巑ongodb涓鍑烘暟鎹紝鏁版嵁鍒頒竴瀹氶噺鏃訛紝灝辮緭鍑轟負xmlpipe2鏍煎紡鐨剎ml鏂囦歡錛岀劧鍚庡緩绔嬩負嬈$儲寮曪紝鏈鍚庡悎騫惰繘涓葷儲寮曘傝繃紼嬪緢綆鍗曪紝鍖呭惈涓ゆ鍚姩澶栭儴榪涚▼鐨勫伐浣滐紝榪欎釜鍙互閫氳繃erlang涓璷s:cmd瀹屾垚銆?/p>

鍊煎緱娉ㄦ剰鐨勬槸錛屽湪浠巑ongodb涓鏁版嵁鏃訛紝浣跨敤skip鍩烘湰鏄笉闈犺氨鐨勶紝skip 100涓囦釜鏁版嵁闇瑕佸ソ鍑犲垎閽燂紝涓轟簡涓嶅鍔犻澶栫殑绱㈠紩瀛楁錛屾垜鍙ソ鍦?code>created_at瀛楁涓婂姞绱㈠紩錛岀劧鍚庢寜鏃墮棿孌墊潵璇誨彇璧勬簮錛岃繖涓鍒囬兘鏄負浜嗘敮鎸佺▼搴忓叧闂噸鍚悗錛屽彲浠ョ戶緇笂嬈″伐浣滐紝鑰屼笉鏄噸澶村啀鏉ャ?00涓囩殑鏁版嵁錛屽凡緇忓鐞嗕簡濂藉嚑澶╀簡銆?/p>

鍚庡ご鏁版嵁寤虹珛濂戒簡錛岄渶瑕佸湪鍓嶅彴灞曠ず鍑烘潵銆俥rlang涓技涔庡彧鏈変竴涓猻phinx瀹㈡埛绔簱錛?a >giza銆傝繖涓簱鏈夌偣鑰侊紝鍐欐垚鐨勬椂鍊欒矊浼艱繕鍦ㄤ嬌鐢╯phinx0.9鐗堟湰銆傚叾涓煡璇唬鐮佸寘鍚簡鐗堟湰鍒ゅ畾錛屽凡緇忔棤娉曞湪鎴戜嬌鐢ㄧ殑sphinx2.x鐗堟湰涓嬌鐢ㄣ傛棤濂堜箣涓嬫垜鍙ソ淇敼浜嗚繖涓簱鐨勬簮鐮侊紝騫歌繍鐨勬槸鏌ヨ鍔熻兘灞呯劧鏄甯哥殑錛屾剰鍛崇潃sphinx鑻ュ共涓増鏈簡涔熸病鏀瑰姩閫氫俊鍗忚錛熷悗鏉ワ紝鎴戜負浜嗗彇寰楁煡璇㈢殑緇熻淇℃伅錛屼緥濡傛秷鑰楁椂闂翠互鍙婃葷粨鏋滐紝鎴戝啀涓嬈′慨鏀逛簡giza鐨勬簮鐮併傛柊鐨勭増鏈彲浠ュ湪鎴戠殑github涓婃壘鍒幫細my giza錛岀湅璧鋒潵鎴戞病渚電姱鐗堟湰鍗忚鍚э紵

鐩墠dhtcrawler鐨勬悳绱紝鍏堟槸鍩轟簬sphinx鎼滅儲鍑篽ash鍒楄〃錛岀劧鍚庡啀鍘籱ongodb涓悳绱ash瀵瑰簲鐨勮祫婧愩備簨瀹炰笂錛屽彲浠ヤ負sphinx鐨刣ocument鐩存帴闄勫姞榪欎簺璧勬簮鐨勬弿榪頒俊鎭紝灝卞彲浠ラ伩鍏嶅幓鏁版嵁搴撴煡璇€備絾鎴戞兂錛岃繖鏍蜂細澧炲姞sphinx绱㈠紩鏂囦歡鐨勫ぇ灝忥紝鎷呭績浼氬獎鍝嶆悳绱㈤熷害銆傚疄闄呮祴璇曟椂錛屽彂鐜版暟鎹簱鏌ヨ鏈夋椂鍊欒繕鐪熺殑寰堟秷鑰楁椂闂達紝灝界鎴戝仛浜嗗垎欏碉紝浠ヤ嬌寰楀崟欏典粎瀵規暟鎹簱榪涜灝戦噺鏌ヨ銆?/p>

xml unicode

鍦ㄥ鍏ml鍒皊phinx鐨勭儲寮曡繃紼嬩腑錛屾湰韜垜杈撳嚭鐨勫唴瀹歸兘鏄痷nicode鐨勶紝浣嗘湁寰堝璧勬簮浼氬鑷磇ndexer瑙f瀽xml鍑洪敊銆傚嚭閿欏悗indexer鐩存帴鍋滄瀵瑰綋鍓峹ml鐨勫鐞嗐傚悗鏉ユ煡闃呰祫鏂欏彂鐜版槸鍥犱負榪欎簺鏃犳硶琚玦ndexer澶勭悊鐨剎ml鍐呭鍖呭惈unicode閲岀殑鎺у埗瀛楃錛屼緥濡?ä (U+00E4)銆傛垜鐨勮В鍐沖姙娉曟槸鐩存帴榪囨護鎺夎繖浜涙帶鍒跺瓧絎︺倁nicode鐨勬帶鍒跺瓧絎﹀弬鐪?a >UTF-8 encoding table and Unicode characters銆傚湪erlang涓共榪欎釜浜嬪眳鐒朵笉澶嶆潅錛?/p>

strip_invalid_unicode(<<>>) ->
    <<>>;
strip_invalid_unicode(<<C/utf8, R/binary>>) ->
    case is_valid_unicode(C) of
        true ->
            RR = strip_invalid_unicode(R),
            <<C/utf8, RR/binary>>;
        false ->
            strip_invalid_unicode(R)
    end;
strip_invalid_unicode(<<_, R/binary>>) ->
    strip_invalid_unicode(R).
    
is_valid_unicode(C) when C < 16#20 ->
    false;
is_valid_unicode(C) when C >= 16#7f, C =< 16#ff ->
    false;
is_valid_unicode(_) ->
    true.


Kevin Lynx 2013-08-08 23:04 鍙戣〃璇勮
]]>
紓佸姏鎼滅儲絎簩鐗?dhtcrawler2http://m.shnenglu.com/kevinlynx/archive/2013/07/20/201994.htmlKevin LynxKevin LynxSat, 20 Jul 2013 08:37:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/07/20/201994.htmlhttp://m.shnenglu.com/kevinlynx/comments/201994.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/07/20/201994.html#Feedback0http://m.shnenglu.com/kevinlynx/comments/commentRss/201994.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/201994.html

鎺?a >涓婄瘒銆?/p>

涓嬭澆浣跨敤

鐩墠涓烘dhtcrawler2鐩稿dhtcrawler鑰岃█錛屾暟鎹簱閮ㄥ垎璋冩暣寰堝ぇ錛孌HT閮ㄥ垎鍩烘湰娌跨敤涔嬪墠銆備絾鍗曠函浣滀負涓涓埇璧勬簮鐨勭▼搴忚岃█錛孌HT閮ㄥ垎鍙互榪涜澶у箙鍓婂噺錛岃繖涓互鍚庡啀璇淬傝繖涓増鏈洿蹇佹洿紼沖畾銆備負浜嗘柟渚匡紝鎴戝皢緙栬瘧濂界殑erlang浜岃繘鍒舵枃浠朵綔涓篻it鐨勪富鍒嗘敮錛屾垜榪樻坊鍔犱簡涓浜沇indows涓嬬殑鎵瑰鐞嗚剼鏈紝鎬諱箣鍩烘湰涓婁笅杞芥簮鐮佷互鍚庡嵆鍙繍琛屻?/p>

欏圭洰鍦板潃錛?a >https://github.com/kevinlynx/dhtcrawler2

浣跨敤鏂規硶

  • 涓嬭澆erlang錛屾垜嫻嬭瘯鐨勬槸R16B鐗堟湰錛岀‘淇漞rl絳夌▼搴忚鍔犲叆Path鐜鍙橀噺
  • 涓嬭澆mongodb錛岃В鍘嬪嵆鐢細

      mongod --dbpath xxx --setParameter textSearchEnabled=true
    
  • 涓嬭澆dhtcrawler2

      git clone https://github.com/kevinlynx/dhtcrawler2.git
    
  • 榪愯win_start_crawler.bat

  • 榪愯win_start_hash.bat
  • 榪愯win_start_http.bat
  • 鎵撳紑localhost:8000鏌ョ湅stats

鐖櫕姣忔榪愯閮戒細淇濆瓨DHT鑺傜偣鐘舵侊紝鏃╂湡榪愯鐨勬椂鍊欐敹闆嗛熷害浼氫笉澶熴俤htcrawler2灝嗙▼搴忓垎涓?閮ㄥ垎錛?/p>

  • crawler錛屽嵆DHT鐖櫕閮ㄥ垎錛屼粎璐熻矗鏀墮泦hash
  • hash錛屽噯紜潵璁插彨hash reader錛屽鐞嗙埇铏敹闆嗙殑hash錛屽鐞嗚繃紼嬩富瑕佹秹鍙婂埌涓嬭澆縐嶅瓙鏂囦歡
  • http錛屼嬌鐢╤ash澶勭悊鍑烘潵鐨勬暟鎹簱錛屼互浣滀負Web绔帴鍙?/li>

鎴戞病鏈夋湇鍔″櫒錛屼絾紼嬪簭鏈夎閮ㄧ講鍦ㄥ埆浜虹殑鏈嶅姟鍣ㄤ笂錛?a >bt.cm錛?a >http://222.175.114.126:8000/銆?/p>

鍏朵粬宸ュ叿

涓轟簡鎻愰珮璧勬簮绱㈠紩閫熷害錛屾垜闄嗙畫鍐欎簡涓浜涘伐鍏鳳紝鍖呮嫭錛?/p>

  • import_tors錛岀敤浜庡鍏ユ湰鍦扮瀛愭枃浠跺埌鏁版嵁搴?/li>
  • tor_cache錛岀敤浜庝笅杞界瀛愬埌鏈湴錛屼粎浠呮彁渚涗笅杞界殑鍔熻兘錛宧ash_reader鍦ㄩ渶瑕佺瀛愭枃浠舵椂錛屽彲浠ュ厛浠庢湰鍦板彇
  • cache_indexer錛岀洰鍓峢ash_reader鍙栫瀛愰兘鏄粠torrage.com涔嬬被鐨勭瀛愮紦瀛樼珯鐐瑰彇錛岃繖浜涚珯鐐規彁渚涗簡縐嶅瓙鍒楄〃錛宑ache_indexer灝嗚繖浜涘垪琛ㄥ鍏ユ暟鎹簱錛宧ash_reader鍦ㄨ姹傜瀛愭枃浠跺墠鍙互閫氳繃璇ユ暟鎹簱媯鏌orrage.com涓婃湁鏃犳縐嶅瓙錛屼粠鑰屽噺灝戝浣欑殑http璇鋒眰

榪欎簺宸ュ叿鐨勪唬鐮侀兘琚斁鍦╠htcrawler2涓紝鍙互鏌ョ湅瀵瑰簲鐨勫惎鍔ㄨ剼鏈潵鏌ョ湅鍏蜂綋濡備綍鍚姩銆?/p>

OS/Database

鏍規嵁瀹為檯鐨勬祴璇曟晥鏋滄潵鐪嬶紝褰撴敹闆嗙殑璧勬簮閲忚繃鐧句竾鏃訛紙鐩墠bt.cm褰曞叆榪?60涓囪祫婧愶級錛?G鍐呭瓨鐨刉indows騫沖彴錛宮ongodb寰堝鏄撳氨浼氭寕鎺夈傛寕鎺夌殑鍘熷洜鍏ㄦ槸1455錛岄〉闈㈡枃浠跺お灝忋傛湁浜哄緩璁笉瑕佸湪Windows涓嬩嬌鐢╩ongodb錛孡inux涓嬫垜鑷繁娌″仛榪囨祴璇曘?/p>

mongodb鍙互閮ㄧ講涓洪泦緹ゅ艦寮?replica-set)錛屽綋鍒濇垜鎯蟲妸http閮ㄥ垎鐨勬煡璇㈡斁鍦ㄤ竴涓彧璇葷殑mongodb瀹炰緥涓婏紝浣嗗洜涓哄緩绔嬮泦緹ゆ椂錛岃鍚屾宸叉湁鐨?0G鏁版嵁搴擄紝鑰屾瘡嬈″悓姝ラ兘浠ongodb鎸傛帀緇撴潫錛岄亗鏀懼純銆傚湪鐩墠bt.cm鐨勯厤緗腑錛屾暟鎹簱torrent鐨勯攣姣斾緥錛坉b lock錛夊緢瀹規槗涓?0%錛岃繖涔熻http鍦ㄦ悳绱㈡椂錛岀粡甯稿嚭鐜版悳绱㈣秴鏃剁殑鎯呭喌銆?/p>

鎶鏈俊鎭?/h2>

dhtcrawler鏈鏃╃殑鐗堟湰鏈夊緢澶氶棶棰橈紝淇榪囩殑鏈澶х殑涓涓棶棰樻槸鍏充簬erlang瀹氭椂鍣ㄧ殑錛屽湪DHT瀹炵幇涓紝闇瑕佸姣忎釜鑺傜偣姣忎釜peer鍋氳秴鏃跺鐞嗭紝鍦╡rlang涓殑鍋氭硶鐩存帴鏄拡瀵規瘡涓妭鐐規敞鍐屼簡涓涓畾鏃跺櫒銆傝繖涓嶆槸闂錛岄棶棰樺湪浜庡畾鏃跺櫒璧勬簮灝卞儚娌℃湁GC鐨勫唴瀛樿祫婧愪竴鏍鳳紝鏄細鐢變簬紼嬪簭鍛樼殑浠g爜闂鑰屽嚭鐜拌祫婧愭硠婕忋傛墍浠ワ紝dhtcrawler絎竴涓増鏈湪鑺傜偣鏁伴厤緗湪100浠ヤ笂鐨勬儏鍐典笅錛岀敤涓嶄簡澶氫箙灝變細鍐呭瓨鑰楀敖錛屾渶緇堝鑷磂rlang铏氭嫙鏈篶ore dump銆?/p>

闄や簡榪欎釜闂浠ュ錛宒htcrawler鐨勮祫婧愭敹褰曢熷害涔熶笉鏄緢蹇傝繖褰撶劧璺熸暟鎹簱鍜岃幏鍙栫瀛愮殑閫熷害鏈夌洿鎺ュ叧緋匯傚挨鍏舵槸鑾峰彇縐嶅瓙錛屼嬌鐢ㄧ殑鏄竴浜涙彁渚沬nfo-hash鍒扮瀛愭槧灝勭殑緗戠珯錛岄氳繃HTTP璇鋒眰鏉ヤ笅杞界瀛愭枃浠躲傛垜浠ヤ負閫氳繃BT鍗忚鐩存帴涓嬭澆縐嶅瓙浼氬揩浜涳紝騫朵笖瀹炴椂鎬т篃瑕侀珮寰堝錛屽洜涓鴻繖涓瀛愬彲鑳芥湭琚繖浜涚紦瀛樼綉绔欐敹褰曪紝浣嗗嵈鍙互鐩存帴鍚戝鏂硅姹傚緱鍒般備負姝わ紝鎴戣繕鐗瑰湴緲婚槄浜嗙浉鍏?a >鍗忚錛屽茍涓旂敤erlang瀹炵幇浜嗭紙浠ュ悗鐨勬枃绔犳垜浼氳鍒板叿浣撳疄鐜拌繖涓崗璁級銆?/p>

鍚庢潵鎴戞鐤慻et_peers鐨勬暟閲忎細涓嶄細姣攁nnounce_peer澶氾紝浣嗘槸鐞嗚涓婁竴鑸殑瀹㈡埛绔湪get_peers涔嬪悗閮芥槸announce_peer錛屼絾鏄鏋済et_peers鏌ヨ鐨刾eers鎭板ソ涓嶅湪綰垮憿錛熻繖鎰忓懗鐫寰堝璧勬簮铏界劧宸茬粡瀛樺湪錛屽彧涓嶈繃浣犳伆濂芥殏鏃惰姹備笉鍒般傚疄闄呮祴璇曟椂錛屽彂鐜癵et_peers鍩烘湰鏄痑nnounce_peer鏁伴噺鐨?0鍊嶃?/p>

灝唄ash鐨勮幏鍙栨柟寮忓仛浜嗚皟鏁村悗錛宒htcrawler鍦ㄥ嚑鍒嗛挓浠ュ唴浠ュ嚑涔庢瘡縐掍笂鐧句釜鏂板縐嶅瓙鐨勯熷害宸ヤ綔銆傜劧鍚庯紝紼嬪簭鎸傛帀銆?/p>

浠巇htcrawler鍒頒粖澶╀負姝㈢殑dhtcrawler2錛屼腑闂撮棿闅斾簡鍒氬ソ1涓湀銆傛垜鐨勬墍鏈変笟浣欐椂闂村叏閮ㄦ墤鍦ㄨ繖涓」鐩笂錛岄潰涓寸殑闂涓鐩撮兘鏄▼搴忕殑鍐呭瓨娉勬紡銆佽祫婧愭敹褰曠殑閫熷害涓嶅蹇紝鍒板悗鏉ュ張鍙樹負鏁版嵁搴撳帇鍔涜繃澶с傛瘡涓澶╂垜閮戒互涓烘垜灝嗕細瀹屾垚涓涓ǔ瀹氱増鏈紝鐒跺悗緇堜簬鍙互鍘誨共鐐瑰埆鐨勪簨鎯咃紝浣嗘繪槸騫蹭笉瀹岋紝鐩墠瀹屾病瀹岄兘榪樺湪瑙傚療銆傛垜濮嬬粓鏄庣櫧鍦ㄥ仛浼樺寲鍓嶉渶瑕佽繘琛岃灝界殑鏁版嵁鏀墮泦鍜屽垎鏋愶紝浠庤岀湡姝e湴浼樺寲鍒版紜殑鐐逛笂錛屼絾涔熸繪槸鍑洿瑙夊拰灝戦噺鏁版嵁鍒嗘瀽灝卞紑濮嬪皾璇曘?/p>

榪欓噷璋堣皥閬囧埌鐨勪竴浜涢棶棰樸?/p>

erlang call timeout

鏈寮濮嬮亣鍒癳rlang涓?code>gen_server:call鍑虹幇timeout閿欒鏃訛紝鎴戣繕涓鐩翠互涓烘槸榪涚▼姝婚攣浜嗐傜浉鍏充唬鐮佽鏉ヨ鍘伙紝瀹炲湪瑙夊緱涓嶅彲鑳藉彂鐢熸閿併傚悗鏉ュ彂鐜幫紝褰揺rlang铏氭嫙鏈哄帇鍔涗笂鍘誨悗錛屼緥濡傚唴瀛樺お澶э紝浣嗘病澶у埌鑰楀敖緋葷粺鎵鏈夊唴瀛橈紙鑰楄繘鎵鏈夊唴瀛樺熀鏈氨core dump浜嗭級錛岃繘紼嬮棿鐨勮皟鐢ㄥ氨浼氬嚭鐜皌imeout銆?/p>

褰撶劧錛屽唴瀛樺崰鐢ㄨ繃澶у彲鑳藉彧鏄〃璞°傚叾榪涚▼榪囧錛岃繘紼嬫秷鎭槦鍒楀お闀匡紝涔熻鎵嶆槸瀵艱嚧鍑虹幇timeout鐨勬牴鏈師鍥犮傛秷鎭槦鍒楄繃闀匡紝涔熷彲鑳芥槸鐢變簬鍙戠敓浜?em>娑堟伅娉勬紡鐨勭紭鏁呫傛秷鎭硠婕忔垜鎸囩殑鏄繖鏍蜂竴縐嶆儏鍐碉紝榪涚▼鑷繁緇欒嚜宸卞彂娑堟伅錛堝綋鐒舵槸cast鎴杋nfo錛夛紝榪欎釜娑堟伅琚鐞嗘椂鍙堜細鍙戦佺浉鍚岀殑娑堟伅錛屾甯告儏鍐典笅錛実en_server澶勭悊浜嗕竴涓娑堟伅錛屽氨浼氫粠娑堟伅闃熷垪閲岀Щ闄ゅ畠錛岀劧鍚庡啀鍙戦佺浉鍚岀殑娑堟伅錛岃繖涓嶄細鍑洪棶棰樸備絾鏄綋紼嬪簭閫昏緫鍑洪棶棰橈紝姣忔澶勭悊璇ユ秷鎭椂錛岄兘浼氬彂鐢熷浣欎竴涓殑鍚岀被娑堟伅錛岄偅娑堟伅闃熷垪鑷劧灝變細涓鐩村闀褲?/p>

淇濇寔榪涚▼閫昏緫綆鍗曪紝浠ラ伩鍏嶈繖縐嶉昏緫閿欒銆?/p>

erlang gb_trees

鎴戝湪涓嶅皯鐨勫湴鏂逛嬌鐢ㄤ簡gb_trees錛宒ht_crawler閲屽氨鍙兘鍑虹幇gb_trees:get(xxx, nil)榪欑閿欒銆備箥涓鐪嬶紝鎴戜互涓烘垜鐪熺殑浼犲叆浜嗕竴涓?code>nil鍊艱繘鍘匯傜劧鍚庢垜鑻︾湅浠g爜錛屼互涓哄湪鏌愪釜鍦版柟鎴戜細鎶婅繖涓猤b_trees瀵硅薄鏀規垚浜唍il銆備絾浜嬫儏涓嶆槸榪欐牱鐨勶紝gb_tress浣跨敤涓涓猼uple浣滀負tree鐨勮妭鐐癸紝褰撴煇涓妭鐐規病鏈夊瓙鑺傜偣鏃訛紝灝變細浠il琛ㄧず銆?/p>

gb_trees:get(xxx, nil)綾諱技鐨勯敊璇紝瀹為檯鎸囩殑鏄?code>xxx娌℃湁鍦ㄨ繖涓猤b_trees涓壘鍒般?/p>

erlang httpc

dht_crawler閫氳繃http鍗忚浠巘orrage.com涔嬬被鐨勭紦瀛樼綉绔欎笅杞界瀛愩傛渶寮濮嬫垜涓轟簡灝介噺灝戜緷璧栫涓夋柟搴擄紝浣跨敤鐨勬槸erlang鑷甫鐨刪ttpc銆傚悗鏉ュ彂鐜扮▼搴忔湁鍐呭瓨娉勬紡錛実oogle鍙戠幇erlang鑷甫鐨刪ttpc鏃╀負浜鴻療鐥咃紝褰撶劧涔熸湁澶х璇村湪鏌愪釜鐗堟湰涔嬪悗榪欎釜httpc宸茬粡寰堜笉閿欍備負浜嗙渷浜嬶紝鎴戠洿鎺ユ崲浜唅browse錛屾浛鎹箣鍚庢甯稿緢澶氥備絾鏄敱浜庢病鏈夊叿浣撳垎鏋愭祴璇曡繃錛屽姞涔嬫椂闂存湁鐐硅繙浜嗭紝鎴戜篃璁頒笉澶竻緇嗚妭銆傚洜涓烘棭鏈熺殑http璇鋒眰閮ㄥ垎錛屾病鏈夊仛鏁伴噺闄愬埗錛屼篃鍙兘鏄敱浜庢垜鐨勪嬌鐢ㄥ鑷寸殑闂銆?/p>

鏌愪釜鐗堟湰鍚庯紝鎴戞墠灝唄ttp閮ㄥ垎涓ユ牸鍦頒笌hash澶勭悊閮ㄥ垎鍖哄垎寮鏉ャ傜浉杈冩暟鎹簱鎿嶄綔鑰岃█錛宧ttp璇鋒眰閮ㄥ垎鎱簡鑻ュ共鏁伴噺綰с傚湪hash_reader涓皢榪欎袱鍧楀垎寮錛屼弗鏍奸檺鍒朵簡鎻愪氦緇檋ttpc鐨勮姹傛暟錛屼互鑾峰緱紼沖畾鎬с?/p>

瀵逛簬涓涓鏉傜殑緗戠粶緋葷粺鑰岃█錛屽垎娓呭摢浜涙槸鑰楁椂鐨勫摢浜涙槸涓嶅ぇ鑰楁椂鐨勶紝鎵嶅彲鑳借幏寰楁ц兘鐨勬彁鍗囥傚浜巋ash_reader鑰岃█錛屽鐞嗕竴涓猦ash鐨勯熷害錛岃櫧鐒跺緢澶х▼搴﹀彇鍐充簬鏁版嵁搴擄紝浣嗙浉杈僪ttp璇鋒眰錛屽凡緇忓揩寰堝銆傚畠鍦ㄥ鐞嗚繖浜沨ash鏃訛紝浼氬皢鏁版嵁搴撳凡鏀跺綍鐨勮祫婧愬拰寰呬笅杞界殑璧勬簮鍒嗙寮錛屼互灝藉揩鐨勯熷害澶勭悊宸插瓨鍦ㄧ殑錛岃屽皢寰呬笅杞界殑澶勭悊閫熷害浜ょ粰httpc鐨勫搷搴旈熷害銆?/p>

erlang httpc ssl

ibrowse澶勭悊https璇鋒眰鏃訛紝榛樿鍜宔rlang鑷甫鐨刪ttpc浣跨敤鐩稿悓鐨凷SL瀹炵幇銆傝繖緇忓父瀵艱嚧鍑虹幇tls_connection榪涚▼鎸傛帀鐨勯敊璇紝鍏蜂綋鍘熷洜涓嶆槑銆?/p>

erlang璋冭瘯

棣栧厛鍚堢悊鐨勬棩蹇楁槸浠諱綍緋葷粺璋冭瘯鐨勫繀澶囥?/p>

鎴戦潰涓寸殑澶ч儴鍒嗛棶棰橀兘鏄唴瀛樻硠婕忕浉鍏籌紝鎵浠ヤ緷璧栫殑erlang宸ュ叿涔熸槸鍜屽唴瀛樼浉鍏崇殑錛?/p>

  • 浣跨敤etop錛屽彲浠ユ鏌ュ唴瀛樺崰鐢ㄥ鐨勮繘紼嬨佹秷鎭槦鍒楀ぇ鐨勮繘紼嬨丆PU娑堣楀鐨勮繘紼嬬瓑絳夛細

      spawn(fun() -> etop:start([{output, text}, {interval, 10}, {lines, 20}, {sort, msg_q }]) end).
    
  • 浣跨敤erlang:system_info(allocated_areas).媯鏌ュ唴瀛樹嬌鐢ㄦ儏鍐碉紝鍏朵腑浼氳緭鍑虹郴緇?code>timer鏁伴噺

  • 浣跨敤erlang:process_info鏌ョ湅鏌愪釜鍏蜂綋鐨勮繘紼嬶紝榪欎釜鐢氳嚦浼氳緭鍑烘秷鎭槦鍒楅噷鐨勬秷鎭?/li>

hash_writer/crawler

crawler鏈韓浠呮敹闆唄ash錛岀劧鍚庡啓鍏ユ暟鎹簱錛屾墍浠ュ彲浠ョОcrawler涓篽ash_writer銆傝繖浜沨ash閲屽瓨鍦ㄥぇ閲忕殑閲嶅銆俬ash_reader浠庢暟鎹簱閲屽彇鍑鴻繖浜沨ash鐒跺悗鍋氬鐞嗐傚鐞嗚繃紼嬩細棣栧厛鍒ゅ畾璇ash瀵瑰簲鐨勮祫婧愭槸鍚﹁鏀跺綍錛屾病鏈夋敹褰曞氨鍏堥氳繃http鑾峰彇縐嶅瓙銆?/p>

鍦ㄦ煇涓増鏈箣鍚庯紝crawler浼氱畝鍗曞湴棰勫厛澶勭悊榪欎簺hash銆傚畠緙撳瓨涓瀹氭暟閲忕殑hash錛屾帴鏀跺埌鏂癶ash鏃訛紝灝卞悎騫跺埌hash緙撳瓨閲岋紝浠ヤ繚璇佺紦瀛橀噷娌℃湁閲嶅鐨刪ash銆傝繖涓噸澶嶇巼緇忚繃瀹為檯鏁版嵁鍒嗘瀽錛屽ぇ姒傛槸50%宸﹀彸錛屽嵆鏀跺埌鐨?00涓姹傞噷錛屾湁50涓槸閲嶅鐨勩傝繖鏍風殑浼樺寲錛屼笉浠呬細闄嶄綆hash鏁版嵁搴撶殑鍘嬪姏錛宧ash_reader澶勭悊鐨刪ash鏁伴噺灝戜簡錛屼篃浼氬torrent鏁版嵁搴撴湁寰堝ぇ鎻愬崌銆?/p>

褰撶劧榪涗竴姝ョ殑鏂規鍙互灝哻rawler鍜宧ash_reader涔嬮棿浜や簰鐨勮繖浜沨ash鐩存帴鏀懼湪鍐呭瓨涓鐞嗭紝鐪佸幓涓棿鏁版嵁搴撱備絾鏄敱浜巑ongodb澶ч噺浣跨敤铏氭嫙鍐呭瓨鐨勭紭鏁咃紙鍐呭瓨鏄犲皠鏂囦歡錛夛紝緇忓父瀵艱嚧鏈嶅姟鍣ㄥ唴瀛樹笉澶燂紙4G錛夛紝鍐呭瓨涔熷氨鎴愪簡鐝嶇█璧勬簮銆傚綋鐒惰繖涓柟妗堣繕鏈変釜寮婄鏄毦浠ユ潈琛ash緙撳瓨鐨勭鐞嗐俢rawler鏀跺埌hash鏄竴涓笉紼沖畾鐨勮繃紼嬶紝鍦ㄦ煇浜涙椂闂寸偣榪欎簺hash鍙兘鐖嗗錛岃宧ash_reader澶勭悊hash鐨勯熷害涔熶細涓嶅お紼沖畾錛屽彈闄愪簬鏀跺埌鐨刪ash綾誨埆錛堟槸鏂板璧勬簮榪樻槸宸插瓨鍦ㄨ祫婧愶級銆佺瀛愯姹傞熷害銆佹槸鍚︽湁鏁堢瓑銆?/p>

褰撶劧錛屼篃鍙互闄愬埗緙撳瓨澶у皬錛屼互鍙婂hash_reader/crawler澶勭悊閫熷害寤虹珛鍏崇郴鏉ヨВ鍐寵繖浜涢棶棰樸備絾鍙︿竴鏂歸潰錛岃繖閲岀殑浼樺寲鏄惁瀵圭洰鍓嶇殑緋葷粺鏈夋彁鍗囷紝鏄惁鏄洰鍓嶇郴緇熼潰涓寸殑鏈澶ч棶棰橈紝鍗存槸闇瑕佽冪┒鐨勪簨鎯呫?/p>

cache indexer

dht_crawler鏄粠torrage.com絳夌綉绔欒幏鍙栫瀛愭枃浠訛紝榪欎簺緗戠珯鐪嬭搗鏉ラ兘鏄嬌鐢ㄤ簡鐩稿悓鐨勬帴鍙o紝鍏墮兘鏈変竴涓猻ync鐩綍錛岄噷闈㈠瓨鏀句簡姣忓ぉ姣忎釜鏈堢儲寮曠殑縐嶅瓙hash錛屼緥濡?http://torrage.com/sync/銆傝繖涓綉绔欎笂鏄惁鏈夋煇涓猦ash瀵瑰簲鐨勭瀛愶紝灝卞彲浠ヤ粠榪欎簺绱㈠紩涓鏌ャ?/p>

hash_reader鍦ㄥ鐞嗘柊璧勬簮鏃訛紝璇鋒眰縐嶅瓙鐨勮繃紼嬩腑鍙戠幇澶ч儴鍒嗗湪榪欎簺鏈嶅姟鍣ㄤ笂閮芥病鏈夋壘鍒幫紝涔熷氨鏄彂璧風殑寰堝http璇鋒眰閮芥槸404鍥炲簲錛岃繖涓嶄絾闄嶄綆浜嗙郴緇熺殑澶勭悊鑳藉姏銆佸甫瀹斤紝涔熼檷浣庝簡绱㈠紩閫熷害銆傛墍浠ユ垜鍐欎簡涓涓伐鍏鳳紝鍏堟墜宸ュ皢sync鐩綍涓嬬殑鎵鏈夋枃浠朵笅杞藉埌鏈湴錛岀劧鍚庨氳繃榪欎釜宸ュ叿 (cache indexer) 灝嗚繖浜涚儲寮曟枃浠墮噷鐨刪ash鍏ㄩ儴瀵煎叆鏁版嵁搴撱傚湪浠ュ悗鐨勮繍琛岃繃紼嬩腑錛岃宸ュ叿浠呬笅杞藉綋澶╃殑绱㈠紩鏂囦歡錛屼互鏇存柊鏁版嵁搴撱?hash_reader 鏍規嵁閰嶇疆錛屼細棣栧厛媯鏌ユ煇涓猦ash鏄惁瀛樺湪璇ユ暟鎹簱涓紝瀛樺湪鐨刪ash鎵嶅彲鑳藉湪torrage.com涓婁笅杞藉緱鍒般?/p>

縐嶅瓙緙撳瓨

hash_reader鍙互閫氳繃閰嶇疆錛屽皢涓嬭澆寰楀埌鐨勭瀛愪繚瀛樺湪鏈湴鏂囦歡緋葷粺鎴栨暟鎹簱涓傝繖鍙互寤虹珛鑷繁鐨勭瀛愮紦瀛橈紝浣嗕繚瀛樺湪鏁版嵁搴撲腑浼氬鏁版嵁搴撻犳垚鍘嬪姏錛屽挨鍏跺湪褰撳墠嫻嬭瘯鏈嶅姟鍣ㄧ‖浠剁幆澧冧笅錛涜屼繚瀛樹負鏈湴鏂囦歡錛屽張鐗瑰埆鍗犵敤紜洏絀洪棿銆?/p>

鍩轟簬BT鍗忚鐨勭瀛愪笅杞?/h3>

閫氳繃http浠庣瀛愮紦瀛橀噷鍙栫瀛愭枃浠訛紝鍙兘浼氭病鏈夌洿鎺ヤ粠P2P緗戠粶閲屽彇鏇村疄鏃躲傜洰鍓嶈繕娌℃潵寰楀強鏌ョ湅榪欎簺縐嶅瓙緙撳瓨緗戠珯鐨勫疄鐜板師鐞嗐備絾鏄氳繃BT鍗忚鑾峰彇縐嶅瓙浼氭湁鐐歸夯鐑︼紝鍥犱負dht_crawler鏄牴鎹?code>get_peer璇鋒眰绱㈠紩璧勬簮鐨勶紝鎵浠ュ鏋滆閫氳繃BT鍗忚鍙栫瀛愶紝閭d箞榪欓噷榪樺緱鍘籇HT緗戠粶閲屾煡璇㈣縐嶅瓙錛岃繖涓煡璇㈣繃紼嬪彲鑳戒細杈冮暱錛岀浉姣斾箣涓嬩細娌℃湁http涓嬭澆蹇傝屽鏋滈氳繃announce_peer鏉ョ儲寮曟柊璧勬簮鐨勮瘽錛屽叾绱㈠紩閫熷害浼氬ぇ澶ч檷浣庯紝鍥犱負announce_peer璇鋒眰姣?code>get_peer璇鋒眰灝戝緢澶氾紝鍑犱箮10鍊嶃?/p>

鎵浠ワ紝榪欓噷鐨勬柟妗堝彲鑳戒細緇撳悎涓よ咃紝鏂板紑涓涓湇鍔★紝寤虹珛鑷繁鐨勭瀛愮紦瀛樸?/p>

涓枃鍒嗚瘝

mongodb鐨勫叏鏂囩儲寮曟槸涓嶆敮鎸佷腑鏂囩殑銆傛垜鍦ㄤ箣鍓嶆彁鍒幫紝涓轟簡鏀寔鎼滅儲涓枃錛屾垜灝嗗瓧絎︿覆鎷嗘垚浜嗚嫢騫插瓙涓層傝繖鏍風殑鍚庢灉灝辨槸瀛楃涓茬儲寮曚細紼嶇◢鍋忓ぇ錛岃屼笖鐩墠榪欎竴鍧楃殑浠g爜榪樼壒鍒畝鍗曪紝浼氬皢寰堝闈炴枃瀛楀瓧絎︿篃綆楀湪鍐呫傚悗鏉ユ垜鍔犱簡涓腑鏂囧垎璇嶅簱錛屼嬌鐢ㄧ殑鏄痳mmseg-cpp銆傛垜灝嗗叾C++閮ㄥ垎鎶界鍑烘潵緙栬瘧鎴恊rlang nif錛岃繖鍙互鍦ㄦ垜鐨刧ithub涓婃壘鍒般?/p>

浣嗘槸榪欎釜搴撴媶鍒嗕腑鏂囧彞瀛愪緷璧栦簬璇嶅簱錛岃岃繖涓瘝搴撲笉澶柊錛宒htcrawler鐖埌鐨勫ぇ閮ㄥ垎璧勬簮綾誨瀷浣犱滑涔熸噦錛岄偅浜涜瘝姹囨媶鍑烘潵鐨勬瘮鐜囦笉澶珮錛岃繖浼氬鑷存悳绱㈠嚭鏉ョ殑緇撴灉娌′綘鎯崇殑閭d箞鐩寸櫧銆傚綋鐒舵洿鏂拌瘝搴撳簲璇ユ槸鍙互瑙e喅榪欎釜闂鐨勶紝鐩墠榪樻病鏈夋椂闂撮【榪欎竴鍧椼?/p>

鎬葷粨

涓涓佸瀵規垜璇磋繃錛?#8221;i have 2 children to feed, so i will not do this only for fun”銆?/p>

浣犵殑澶ч儴鍒嗙紪紼嬬煡璇嗘潵婧愪簬緗戠粶錛屾墍浠ョ◢紼嶅洖棣堜竴涓嬩笉浼氳浣犱涪浜嗛キ紕椼?/p>

鎴戝緢絀鳳紝濡傛灉浣犺兘璁╂垜鏀惰幏閲戦挶鍜岀紪紼嬫垚灝憋紝榪樹笉浼氬珜鎴戠┛寰楀お閭嬮仮錛宼hat’s really kind of you銆?/p>



Kevin Lynx 2013-07-20 16:37 鍙戣〃璇勮
]]>
浣跨敤erlang瀹炵幇P2P紓佸姏鎼滅儲-瀹炵幇http://m.shnenglu.com/kevinlynx/archive/2013/06/20/201179.htmlKevin LynxKevin LynxThu, 20 Jun 2013 12:40:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/06/20/201179.htmlhttp://m.shnenglu.com/kevinlynx/comments/201179.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/06/20/201179.html#Feedback1http://m.shnenglu.com/kevinlynx/comments/commentRss/201179.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/201179.html

鎺?a >涓婄瘒錛屾湰綃囪皥璋堜竴浜涘疄鐜扮粏鑺傘?/p>

榪欎釜鐖櫕紼嬪簭涓昏鐨勯棶棰樺湪浜庡浣曡幏鍙朠2P緗戠粶涓垎浜殑璧勬簮錛岃幏鍙栧埌璧勬簮鍚庣儲寮曞埌鏁版嵁搴撲腑錛屾悳绱㈠氨鏄嚜鐒惰岀劧鐨勪簨鎯呫?/p>

DHT

DHT緗戠粶鏈川涓婃槸涓涓敤浜庢煡璇㈢殑緗戠粶錛屽叾鐢ㄤ簬鏌ヨ涓涓祫婧愭湁鍝簺璁$畻鏈烘鍦ㄤ笅杞姐傛瘡涓祫婧愰兘鏈変竴涓?0瀛楄妭闀垮害鐨処D鐢ㄤ簬鏍囩ず錛岀О涓篿nfohash銆傚綋涓涓▼搴忎綔涓篋HT鑺傜偣鍔犲叆榪欎釜緗戠粶鏃訛紝灝變細鏈夊叾浠栬妭鐐規潵鍚戜綘鏌ヨ錛屽綋浣犲仛鍑哄洖搴斿悗錛屽鏂瑰氨浼氳褰曚笅浣犮傚鏂硅繕浼氳闂叾浠栬妭鐐癸紝褰撳鏂瑰紑濮嬩笅杞借繖涓猧nfohash瀵瑰簲鐨勮祫婧愭椂錛屼粬灝變細鍛婅瘔鎵鏈夋浘緇忚闂繃鐨勮妭鐐癸紝鍖呮嫭浣犮傝繖涓椂鍊欏氨鍙互紜畾錛岃繖涓猧nfohash瀵瑰簲鐨勮祫婧愬湪榪欎釜緗戠粶涓槸鏈夋晥鐨勩?/p>

鍏充簬榪欎釜緗戠粶鐨勫伐浣滃師鐞嗭紝鍙傜湅錛?a >P2P涓璂HT緗戠粶鐖櫕浠ュ強鍐欎簡涓鍔涙悳绱㈢殑緗戦〉銆?/p>

鑾峰彇鍒癷nfohash鍚庤兘鍋氫粈涔堬紵鍏抽敭鐐瑰湪浜庯紝鎴戜滑鐜板湪浣跨敤鐨勭鍔涢摼鎺?magnet url)錛屾槸鍜宨nfohash瀵瑰簲璧鋒潵鐨勩備篃灝辨槸鎷垮埌infohash錛屽氨絳変簬鎷垮埌涓涓鍔涢摼鎺ャ備絾鏄繖涓埇铏繕闇瑕佸緩绔嬭祫婧愮殑淇℃伅錛岃繖浜涗俊鎭潵婧愪簬縐嶅瓙鏂囦歡銆傜瀛愭枃浠跺叾瀹炰篃鏄搴斿埌涓涓祫婧愶紝縐嶅瓙鏂囦歡鍖呭惈璧勬簮鍚嶃佹弿榪般佹枃浠跺垪琛ㄣ佹枃浠跺ぇ灝忕瓑淇℃伅銆傝幏鍙栧埌infohash鏃訛紝鍏跺疄涔熻幏鍙栧埌浜嗗搴旂殑璁$畻鏈哄湴鍧錛屾垜浠彲浠ュ湪榪欎簺璁$畻鏈轟笂涓嬭澆鍒板搴旂殑縐嶅瓙鏂囦歡銆?/p>

浣嗘槸鎴戜負浜嗙畝鍗曪紝鍦ㄨ幏鍙栧埌infohash鍚庯紝浠庝竴浜涙彁渚涙槧灝勭鍔涢摼鍒扮瀛愭枃浠舵湇鍔$殑緗戠珯涓婄洿鎺ヤ笅杞戒簡瀵瑰簲鐨勭瀛愩俤htcrawler閲屼嬌鐢ㄤ簡浠ヤ笅緗戠珯錛?/p>

http://torrage.com
https://zoink.it
http://bt.box.n0808.com

浣跨敤榪欎簺緗戠珯鏃訛紝闇鎻愪緵紓佸姏鍝堝笇錛坕nfohash鍙洿鎺ヨ漿鎹級錛屾瀯寤虹壒瀹氱殑URL錛屽彂鍑篐TTP璇鋒眰鍗沖彲銆?/p>

   U1 = "http://torrage.com/torrent/" ++ MagHash ++ ".torrent",
    U2 = "https://zoink.it/torrent/" ++ MagHash ++ ".torrent",
    U3 = format_btbox_url(MagHash),

format_btbox_url(MagHash) ->
    H = lists:sublist(MagHash, 2),
    T = lists:nthtail(38, MagHash),
    "http://bt.box.n0808.com/" ++ H ++ "/" ++ T ++ "/" ++ MagHash ++ ".torrent".

浣嗘槸錛屼互涓涓妭鐐圭殑韜喚鍔犲叆DHT緗戠粶錛屾槸鏃犳硶鑾峰彇澶ч噺鏌ヨ鐨勩傚湪DHT緗戠粶涓紝姣忎釜鑺傜偣閮芥湁涓涓狪D銆傛瘡涓妭鐐瑰湪鏌ヨ淇℃伅鏃訛紝浠呰闂淇℃伅杈冭繎鐨勮妭鐐廣傝繖閲岀殑淇℃伅闄や簡infohash澶栬繕鍖呭惈鑺傜偣錛屽嵆鑺傜偣璇㈤棶涓涓妭鐐癸紝榪欎釜鑺傜偣鍦ㄥ摢閲屻侱HT鐨勫吀鍨嬪疄鐜頒腑錛圞ademlia錛夛紝浣跨敤涓や釜ID鐨剎or鎿嶄綔鏉ョ‘瀹氳窛紱匯傛棦鐒惰窛紱葷殑璁$畻鏄熀浜嶪D鐨勶紝涓轟簡灝藉彲鑳借幏鍙栨暣涓狣HT緗戠粶浜ゆ崲鐨勪俊鎭紝鐖櫕紼嬪簭灝卞彲浠ュ緩绔嬪敖鍙兘澶氱殑DHT鑺傜偣錛岃榪欎簺鑺傜偣鐨処D鍧囧寑鍦板垎甯冨湪ID鍙栧煎尯闂村唴錛屼互榪欐牱鐨勬柟寮忓姞鍏ョ綉緇溿?/p>

鍦╠htcrawler涓紝鎴戜嬌鐢ㄤ互涓嬫柟寮忎駭鐢熶簡N涓ぇ鑷村潎鍖鍒嗗竷鐨処D錛?/p>

create_discrete_ids(1) ->
    [dht_id:random()];
create_discrete_ids(Count) ->
    Max = dht_id:max(),
    Piece = Max div Count,
    [random:uniform(Piece) + Index * Piece || Index <- lists:seq(0, Count - 1)].

闄や簡灝藉彲鑳藉鍦板線DHT緗戠粶閲岄儴緗茶妭鐐逛箣澶栵紝瀵瑰崟涓妭鐐硅岃█錛屼篃鏈変簺娉ㄦ剰浜嬮」銆備緥濡傚簲灝藉彲鑳藉揩鍦板皢鑷繁鍛婅瘔灝藉彲鑳藉鐨勮妭鐐癸紝榪欏彲浠ュ湪鍚姩鏃惰繘琛屽ぇ閲忕殑闅忔満infohash鐨勬煡璇€傞殢鐫鏌ヨ榪囩▼鐨勬繁鍏ワ紝璇ヨ妭鐐逛細涓庢洿澶氱殑鑺傜偣鎵撲氦閬撱傚洜涓篋HT緗戠粶閲岀殑鑺傜偣瀹為檯涓婃槸涓嶇ǔ瀹氱殑錛屽畠浠婂ぉ鍦ㄧ嚎錛屾槑澶╁悗澶╁彲鑳戒笉鍦ㄧ嚎錛屾墍浠ヨ綆椾綘鐨処D鍥哄畾錛屽摢浜涜妭鐐逛笌浣犺緝榪戯紝鏈韓灝辨槸涓浉瀵規蹇點傝妭鐐瑰湪紼嬪簭閫鍑烘椂錛屼篃鏈濂藉皢鑷繁鐨勮礬鐢變俊鎭紙涓庤嚜宸變氦浜掔殑鑺傜偣鍒楄〃錛変繚瀛樿搗鏉ワ紝榪欐牱涓嬫鍚姩鏃跺氨鍙互鏇村揩鍦板姞鍏ョ綉緇溿?/p>

鍦╠htcrawler鐨勫疄鐜頒腑錛屾瘡涓妭鐐規瘡涓竴瀹氭椂闂達紝閮戒細鍚戠綉緇滀腑闅忔満鏌ヨ涓涓猧nfohash錛岃繖涓猧nfohash鏄殢鏈轟駭鐢熺殑銆傚叾鏌ヨ鐩殑涓嶅湪浜巌nfohash錛岃屽湪浜庡憡璇夋洿澶氱殑鑺傜偣錛屼互鍙婂湪鍏朵粬鑺傜偣涓婁繚鎸佽嚜宸辯殑媧昏穬銆?/p>

handle_event(startup, {MyID}) ->
    timer:apply_interval(?QUERY_INTERVAL, ?MODULE, start_tell_more_nodes, [MyID]).

start_tell_more_nodes(MyID) ->
    spawn(?MODULE, tell_more_nodes, [MyID]).

tell_more_nodes(MyID) ->
    [search:get_peers(MyID, dht_id:random()) || _ <- lists:seq(1, 3)].

DHT鑺傜偣鐨勫畬鏁村疄鐜版槸姣旇緝綣佺悙鐨勶紝娑夊強鍒版煡璇互鍙婄箒鏉傜殑鍚勭瀵硅薄鐨勮秴鏃訛紙鑺傜偣銆佹《銆乮nfohash錛夛紝鑰岃秴鏃剁殑澶勭悊騫朵笉鏄矖鏆村湴鍋氬垹闄ゆ搷浣溿傚洜涓烘湰韜槸鍩轟簬UDP鍗忚錛屼綘寰楀榪欎簺瓚呮椂瀵硅薄鍋氳繘涓姝ョ殑鏌ヨ鎵嶈兘姝g‘鍦拌繘涓姝ュ仛鍏朵粬浜嬫儏銆傝屾悳绱篃鏄釜綣佹潅鐨勪簨鎯咃紝閫掑綊鍦版煡璇㈣妭鐐癸紝鎰熻涓婏紝浣犱笉涓瀹氱鐩爣瓚婃潵瓚婅繎錛岀敱浜庤鏌ヨ鑺傜偣鐨勪笉紜畾鎬э紙鏃犳硶紜畾瀵規柟鏄惁鍦ㄧ帺寮勪綘錛屾垨鑰呮湰韜鏂瑰氨鏄釜鍌婚鹼級錛屼綘寰堝彲鑳芥帴涓嬫潵瑕佹煡璇㈢殑鑺傜偣鍙嶈岀鐩爣鍙樿繙浜嗐?/p>

鍦ㄦ垜絎竴嬈$殑DHT瀹炵幇涓紝鎴戜嬌鐢ㄤ簡綾諱技transmission閲孌HT瀹炵幇鐨勬柟娉曪紝涓嶆柇鏃犺剳閫掑綊錛屽綋鎼滅儲鏈夊お涔呮椂闂存病寰楀埌鍝嶅簲鍚庣粓姝㈡悳绱€傜浜屾瀹炵幇鏃訛紝鎴戝氨浣跨敤浜唀torrent閲岀殑瀹炵幇銆傝繖涓悳绱㈡洿鑱槑錛屽畠璁板綍鎼滅儲榪囩殑鑺傜偣錛屽茍涓旀鏌ユ槸鍚︾鐩爣瓚婃潵瓚婅繙銆傚綋榪滅鐩爣鏃訛紝灝辮涓烘悳绱㈡槸涓嶅お鏈夋晥鐨勶紝涓嶅お鏈夋晥鐨勬悳绱㈠皾璇曞嚑嬈″氨鍙互鏀懼純銆?/p>

瀹為檯涓婏紝鐖櫕鐨勫疄鐜板茍涓嶉渶瑕佸畬鏁村湴瀹炵幇DHT鑺傜偣鐨勬甯稿姛鑳姐?strong>鐖櫕浣滀負涓涓狣HT鑺傜偣鐨勫敮涓鍔ㄦ満浠呮槸鑾峰彇緗戠粶閲屽叾浠栬妭鐐圭殑鏌ヨ銆傝岃瀹屾垚榪欎釜鍔熻兘錛屼綘鍙渶瑕佽寰楀儚涓甯鎬漢灝辮銆傝繖閲屼笉闇瑕佷繚瀛榠nfohash瀵瑰簲鐨刾eer鍒楄〃錛岄潰涓存瘡涓嬈℃煡璇紝浣犻殢渚垮洖澶嶅嚑涓妭鐐瑰湴鍧灝卞彲浠ャ備絾鏄繖閲屾湁涓矗浠婚棶棰橈紝濡傛灉鏁翠釜DHT緗戠粶鏈?000涓妭鐐癸紝鑰屼綘榪欎釜鐖櫕灝辨湁1000涓妭鐐癸紝閭d箞浣犵殑闅忔剰鍥炲錛屽氨鍙兘瀵艱嚧瀵規柟鏍規湰鎵句笉鍒版紜殑淇℃伅錛岃繖鏍蜂綘渚濈劧寰椾笉鍒版湁鏁堢殑璧勬簮銆傦紙鍙互鍒╃敤榪欎竴鐐圭牬鍧廌HT緗戠粶錛?/p>

DHT鐨勫疄鐜版病鏈変嬌鐢ㄧ涓夋柟搴撱?/p>

縐嶅瓙

縐嶅瓙鏂囦歡鐨勬牸寮忓悓DHT緗戠粶娑堟伅鏍煎紡涓鏍鳳紝浣跨敤涓縐嶇О涓篵encode鐨勬枃鏈牸寮忔潵緙栫爜銆傜瀛愭枃浠跺垎涓轟袱綾伙細鍗曚釜鏂囦歡鍜屽涓枃浠躲?/p>

鏂囦歡鐨勪俊鎭棤闈炲氨鏄枃浠跺悕銆佸ぇ灝忋傛枃浠跺悕鍙兘鍖呭惈utf8緙栫爜鐨勫悕瀛楋紝涓轟簡鍚庨潰澶勭悊鐨勬柟渚匡紝dhtcrawler閮戒細浼樺厛浣跨敤utf8緙栫爜銆?/p>

   {ok, {dict, Info}} = dict:find(<<"info">>, TD),
    case type(Info) of
        single -> {single, parse_single(Info)};
        multi -> {multi, parse_multi(Info)}
    end.
parse_single(Info) ->
    Name = read_string("name", Info),
    {ok, Length} = dict:find(<<"length">>, Info),
    {Name, Length}.

parse_multi(Info) ->
    Root = read_string("name", Info),
    {ok, {list, Files}} = dict:find(<<"files">>, Info),
    FileInfo = [parse_file_item(Item) || {dict, Item} <- Files],
    {Root, FileInfo}.

鏁版嵁搴?/h2>

鎴戞渶寮濮嬪湪閫夌敤鏁版嵁搴撴椂錛屼負浜嗕笉浣跨敤絎笁鏂瑰簱錛屾墦綆椾嬌鐢╡rlang鑷甫鐨刴nesia銆備絾鏄洜涓烘秹鍙婂埌瀛楃涓插尮閰嶆悳绱紝mnesia鐨勬煡璇㈣鍙ュ湪鎴戠湅鏉ュお涓嶅弸濂斤紝鍦ㄧ粡榪囦竴浜涜祫鏂欐煡闃呭悗灝辯洿鎺ユ斁寮冧簡銆?/p>

鐒跺悗鎴戞墦綆椾嬌鐢╟ouchdb錛屽洜涓哄畠鏄痚rlang鍐欑殑錛岃屾垜姝e湪鐢╡rlang鍐欑▼搴忋傜涓嬈℃帴瑙﹂潪鍏崇郴鍨嬫暟鎹簱錛屽彂鐜癗oSQL鏁版嵁搴撲嬌鐢ㄨ搗鏉ユ瘮SQL綾葷殑綆鍗曞浜嗐備絾鏄湪erlang閲岃浣跨敤couchdb瀹炲湪澶姌鑵句簡銆傛垜浣跨敤鐨勫鎴風搴撴槸couchbeam銆?/p>

鍥犱負couchdb鏆撮湶鐨凙PI閮芥槸鍩轟簬HTTP鍗忚鐨勶紝鍏舵暟鎹牸寮忎嬌鐢ㄤ簡json錛屾墍浠ouchbeam瀹為檯涓婂氨鏄鍚勭HTTP璇鋒眰銆佸洖搴斿拰json鐨勫寘瑁呫備絾鏄畠绔熺劧浣跨敤浜唅browse榪欎釜絎笁鏂笻TTP瀹㈡埛绔簱錛岃屼笉鏄痚rlang鑷甫鐨勩俰browse鍙堜嬌鐢ㄤ簡jiffy榪欎釜瑙f瀽json鐨勫簱銆傝繖涓簱鏇存儴鐑堢殑鏄畠鐨勮В鏋愬伐浣滈兘鏄氦緇機璇█鍐欑殑鍔ㄦ佸簱鏉ュ畬鎴愶紝鎴戣繕寰楃紪璇戦偅涓狢搴撱?/p>

couchdb鐪嬭搗鏉ヤ笉鏀寔瀛楃涓叉煡璇紝鎴戝緱鑷繁鍒涘緩涓涓獀iew錛岃繖涓獀iew閲屾垜閫氳繃緲婚槄浜嗕竴浜涜祫鏂欏啓浜嗕竴涓皢姣忎釜doc鐨刵ame鎷嗗垎鎴愯嫢騫叉鏌ヨ緇撴灉鐨刴ap銆傝繖涓猰ap鍦ㄥ鐞嗘瘡涓嬈℃煡璇㈡椂錛屾垜閮藉緱鍔ㄦ佹洿鏂頒箣銆俢ouchdb鏄笉鏀寔灞閮ㄦ洿鏂扮殑錛岃繖榪樹笉綆楀ぇ闂銆傜劧鍚庡緢楂樺叴錛岀粓浜庢敮鎸佸瓧絎︿覆鏌ヨ浜嗐傝繖閲岀殑瀛楃涓叉煡璇㈤兘鏄熀浜庡瓧絎︿覆鐨勫瓙涓叉煡璇€備絾鏄棶棰樺湪浜庯紝澶參浜嗐傛瘡涓嬈″湪WEB绔殑鏌ヨ錛岄兘鐩存帴瀵艱嚧erlang榪涚▼鐨刢all瓚呮椂銆?/p>

瑕佽couchdb鏀寔瀛楃涓叉煡璇紝瑕佸揩閫燂紝褰撶劧鏄湁瑙e喅鏂規鐨勩備絾鏄繖涓椂鍊欐垜宸茬粡娌℃湁蹇冩濈戶緇姌鑵撅紝浠諱綍涓涓簱銆佺▼搴忓鏋滄帴鍙h璁″緱濡傛涓嶆柟渚匡紝閭e氨鍙互鑰冭檻鎹竴涓叾浠栫殑銆?/p>

鎴戦夋嫨浜唌ongodb銆傚悓鏍風殑鍩轟簬鏂囨。鐨勬暟鎹簱銆?.4鐗堟湰榪樻敮鎸佸叏鏂囨悳绱€備粈涔堟槸鍏ㄦ枃鎼滅儲鍛紝榪欐槸涓縐嶅熀浜庡崟璇嶇殑鍏ㄦ枃鎼滅儲鏂瑰紡銆?code>hello world鎴戝彲浠ユ悳绱?code>hello錛屽熀浜庡崟璇嶃俶ongodb浼氳嚜鍔ㄦ媶璇嶃傛洿鍏抽敭鏇磋浜虹埥鐨勬槸錛岃寮鍚繖涓姛鑳介潪甯哥畝鍗曪細璁劇疆鍚姩鍙傛暟銆佸緩绔嬬儲寮曘傛病浜嗐俶ongodb鐨別rlang瀹㈡埛绔簱mongodb-erlang涔熷彧渚濊禆涓涓猙son-erlang搴撱傜劧鍚庢垜鍙堝煁澶磋嫤騫詫紝鍑犱釜灝忔椂鍊欐垜鐨勮繖涓埇铏▼搴忓氨鍙互鍦ㄦ祻瑙堝櫒绔悳绱㈠叧閿瓧浜嗐?/p>

鍚庢潵鎴戝彂鐜幫紝mongodb鐨勫叏鏂囨悳绱㈡槸涓嶆敮鎸佷腑鏂囩殑銆傚洜涓哄畠榪樹笉鐭ラ亾涓枃璇ユ庝箞鎷嗚瘝銆傛伆濂芥垜鏈変釜鍚屼簨鍋氳繃涓枃鎷嗚瘝鐨勭爺絀訛紝鐪嬭搗鏉ユ秹鍙婂埌寰堝鏉傜殑綆楁硶銆傜洿鍒拌繖涓椂鍊欙紝鎴戜粬濡堟墠閱掓偀錛屾垜涓轟粈涔堥渶瑕佸熀浜庡崟璇嶇殑鎼滅儲銆傛垜浠ぇ閮ㄥ垎鐨勬悳绱㈠叾瀹為兘鏄熀浜庡瓙瀛楃涓茬殑鎼滅儲銆?/p>

浜庢槸錛屾垜灝嗙瀛愭枃浠剁殑鍚嶅瓧鎷嗗垎鎴愪簡鑻ュ共涓瓙瀛楃涓詫紝灝嗚繖浜涘瓙瀛楃涓蹭互鏁扮粍鐨勫艦寮忎綔涓虹瀛愭枃妗g殑涓涓敭鍊煎瓨鍌紝鑰屾垜渚濈劧榪樺彲浠ヤ嬌鐢ㄥ叏鏂囩儲寮曪紝鍥犱負鍏ㄦ枃绱㈠紩浼氬皢鏁翠釜瀛楃涓蹭綔涓哄崟璇嶆瘮杈冦傚疄闄呬笂錛屽熀浜庝竴鑸殑鏌ヨ鏂瑰紡涔熸槸鍙互鐨勩傚綋鐒訛紝绱㈠紩榪樻槸寰楀緩绔嬨?/p>

浣跨敤mongodb鏃跺敮涓璁╂垜寰堜笉鐖界殑鏄痬ongodb-erlang榪欎釜瀹㈡埛绔簱鐨勬枃妗eお嬈犵己銆傝繖榪樹笉綆楀ぇ闂錛屽洜涓虹湅鐪嬫簮鐮佸弬鏁拌繕鏄彲浠ュぇ姒傜寽鍒扮敤娉曘傜湡姝f偛鍓х殑鏄痬ongodb鐨勬湁浜涙煡璇㈠姛鑳藉畠鏄笉鏀寔鐨勩備緥濡傞氳繃cursor鏉ユ帓搴忔潵闄愬埗鏁伴噺銆傚湪cursor妯″潡騫舵病鏈夊搴旂殑mongodb鎺ュ彛銆傛渶緇堟垜鍙ソ閫氳繃浠ヤ笅鏂瑰紡鏌ヨ錛屾垜涓嶆槑鐧絙atchsize錛屼絾瀹冨彲浠ュ伐浣滐細

search_announce_top(Conn, Count) ->
    Sel = {'$query', {}, '$orderby', {announce, -1}},
    List = mongo_do(Conn, fun() ->
        Cursor = mongo:find(?COLLNAME, Sel, [], 0, Count), 
        mongo_cursor:rest(Cursor)
    end),
    [decode_torrent_item(Item) || Item <- List].

鍙︿竴涓偛鍓х殑鏄紝mongodb-erlang榪樹笉鏀寔鏂囨。鐨勫眬閮ㄦ洿鏂幫紝瀹冪殑update鎺ュ彛鐩存帴瑕佹眰浼犲叆鏁翠釜鏂囨。銆傚嚑緇忔姌鑵撅紝鎴戝彲浠ラ氳繃runCommand鏉ュ畬鎴愶細

inc_announce(Conn, Hash) when is_list(Hash) ->
    Cmd = {findAndModify, ?COLLNAME, query, {'_id', list_to_binary(Hash)}, 
        update, {'$inc', {announce, 1}},
        new, true},
    Ret = mongo_do(Conn, fun() ->
        mongo:command(Cmd)
    end).

Unicode

涓嶇煡閬撳湪鍝噷鎴戠湅鍒拌繃erlang璇磋嚜宸卞叾瀹炴槸涓嶉渶瑕佹敮鎸乽nicode鐨勶紝鍥犱負榪欓棬璇█鏈韓鏄氳繃list鏉ユā鎷熷瓧絎︿覆銆傚浜巙nicode鑰岃█錛屽搴旂殑list淇濆瓨鐨勬湰韜氨鏄暣鏁板箋備絾鏄負浜嗘柟渚垮鐞嗭紝erlang榪樻槸鎻愪緵浜嗕竴浜泆nicode鎿嶄綔鐨勬帴鍙c?/p>

鍥犱負鎴戦渶瑕佸皢縐嶅瓙鐨勫悕瀛楁寜瀛楁媶鍒嗭紝瀵逛簬a涓枃榪欐牱鐨勫瓧絎︿覆鑰岃█錛屾垜闇瑕佹媶鍒嗘垚浠ヤ笅緇撴灉錛?/p>

a
a涓?
a涓枃
涓?
涓枃
鏂?

閭d箞錛屽湪erlang涓綋鎴戣幏鍙栧埌涓涓瓧絎︿覆list鏃訛紝鎴戝氨闇瑕佺煡閬撳摢鍑犱釜鏁存暟鍚堣搗鏉ュ疄闄呬笂瀵瑰簲鐫涓涓眽瀛椼俥rlang閲寀nicode妯″潡閲屾湁鍑犱釜鍑芥暟鍙互灝唘nicode瀛楃涓瞝ist瀵瑰簲鐨勬暣鏁板悎璧鋒潵錛屼緥濡傦細[111, 222, 333]鍙兘琛ㄧず鐨勬槸涓涓眽瀛楋紝灝嗗叾杞崲浠ヤ笅鍙緱鍒?code>[111222333]榪欐牱鐨勫艦寮忋?/p>

split(Str) when is_list(Str) ->
    B = list_to_binary(Str), % 蹇呴』杞崲涓篵inary
    case unicode:characters_to_list(B) of
        {error, L, D} ->
            {error, L, D};
        {incomplete, L, D} ->
            {incomplete, L, D};
        UL ->
        {ok, subsplit(UL)}
    end.

subsplit([]) ->
    [];

subsplit(L) ->
    [_|R] = L,
    {PreL, _} = lists:splitwith(fun(Ch) -> not is_spliter(Ch) end, L),
    [unicode:characters_to_binary(lists:sublist(PreL, Len)) 
        || Len <- lists:seq(1, length(PreL))] ++ subsplit(R).

闄や簡榪欓噷鐨勬媶瀛椾箣澶栵紝URL鐨勭紪鐮併佹暟鎹簱鐨勫瓨鍌ㄩ兘榪樺ソ錛屾病閬囧埌闂銆?/p>

娉ㄦ剰錛屼互涓婇拡瀵規暟鎹簱鏈韓鐨勫悙妲斤紝瀹屽叏鍩轟簬鎴戜笉鐔熸倝璇ユ暟鎹簱鐨勬儏鍐典笅錛屼笉寤鴻浣滀負浣犲伐鍏烽夋嫨鐨勫弬鑰冦?/p>

erlang鐨勭ǔ瀹氭?/h2>

閮借鍙互鐢╡rlang鏉ョ紪鍐欓珮瀹歸敊鐨勬湇鍔″櫒紼嬪簭銆傜湅鐪嬪畠鐨剆upervisor錛岀洃瑙嗗瓙榪涚▼錛岃嚜鍔ㄩ噸鍚瓙榪涚▼銆傚ぉ鐢熺殑瀹歸敊鍔熻兘錛屽氨綆椾綘瀹曚釜鍑犳錛屽崟涓繘紼嬭嚜鍔ㄩ噸鍚紝鏁翠釜紼嬪簭鐪嬭搗鏉ヨ繕紼沖仴鍦板湪榪愯錛屽鐗涢煎晩銆傚啀鐪嬬湅erlang鐨勮繘紼嬶紝杞婚噺綰х殑璇█鐗規э紝灝卞儚OOP璇█閲岀殑涓涓璞′竴鏍瘋交閲忋傚鏋滆浣跨敤OOP璇█鍐欑▼搴忓緱think in object錛岄偅鐢╡rlang浣犲氨寰梩hink in process錛屽鐗涢煎楠囦漢鍟娿?/p>

瀹為檯涓婏紝浠ユ垜鐨勭粡楠屾潵鐪嬶紝浣犺繕寰椾互浼犵粺鐨勬濈淮鍘葷湅寰卐rlang鐨勮繘紼嬨備竴浜涘綰跨▼紼嬪簭閲岀殑闂錛屽湪erlang鐨勮繘紼嬬幆澧冧腑渚濈劧瀛樺湪錛屼緥濡傛閿併?/p>

鍦╡rlang涓紝瀵逛簬涓浜涘紓姝ユ搷浣滐紝浣犲彲浠ラ氳繃榪涚▼闂寸殑浜や簰灝嗚繖涓搷浣滃寘瑁呮垚鍚屾鎺ュ彛錛屼緥濡俻ing鐨勫疄鐜幫紝鍙互絳夊埌瀵規柟鍥炲簲涔嬪悗鍐嶈繑鍥炪傝闃誨鐨勮繘紼嬪弽姝e緢杞婚噺錛屽叾鍖呭惈鐨勯昏緫寰堝崟涓銆傝繖涓嶄絾鏄竴縐嶈壇濂界殑鍖呰錛岀敋鑷沖彲浠ヨ鏄竴縐峞rlang-style銆備絾榪欏緢瀹規槗甯︽潵姝婚攣銆傚湪鏈寮濮嬬殑鏃跺欐垜娌℃湁娉ㄦ剰榪欎釜闂錛屽綋鐖櫕鑺傜偣鏁頒笂鍗囩殑鏃跺欙紝緗戠粶鏁版嵁澶嶆潅鐨勬椂鍊欙紝浼間箮灝卞嚭鐜頒簡姝婚攣鍨嬪畷鏈猴紙榪涚▼浜掔浉絳夊緟澶箙錛岀洿鎺imeout錛夈?/p>

鍙︿竴涓鏄撳湪澶氳繘紼嬬幆澧冧笅鍑虹幇鐨勯棶棰樺氨鏄秷鎭緷璧栫殑涓婁笅鏂囨敼鍙橀棶棰樸傚綋鎶曢掍竴涓秷鎭埌鏌愪釜榪涚▼錛屽埌榪欎釜娑堟伅琚鐞嗕箣鍓嶏紝榪欐鏃墮棿榪欎釜娑堟伅鍏寵仈鐨勯昏緫榪愮畻鎵渚濊禆鐨勪笂涓嬫枃鐜鏀瑰彉浜嗭紝渚嬪鏌愪釜ets鍏冪礌涓嶈浜嗭紝鍦ㄥ鐞嗚繖涓秷鎭椂錛屼綘榪樺緱浠ュ綰跨▼緙栫▼鐨勬濈淮鏉ョ紪鍐欎唬鐮併?/p>

鑷充簬supervisor錛岃繖鐜╂剰浣犲緱绔鎬佸害銆傚畠涓嶆槸鐢ㄦ潵鍖呭浣犵殑鍌婚奸敊璇殑銆傚綋浣犲啓涓嬪偦閫間唬鐮佸鑷磋繘紼嬮綣佸穿婧冪殑鏃跺欙紝supervisor灞佺敤娌℃湁銆俿upervisor鐨勫敮涓浣滅敤錛屼粎浠呮槸鍦ㄤ竴涓‘瀹炴湰韜彲闈犵殑緋葷粺錛岀‘瀹炰漢鍝侀棶棰樹竾鍒嗕箣涓宕╂簝浜嗭紝閲嶅惎瀹冦傛瘯绔燂紝涓涓噸鍚鐜囩殑鎺ㄨ崘鍊鹼紝鏄竴涓皬鏃?嬈°?/p>



]]>浣跨敤erlang瀹炵幇P2P紓佸姏鎼滅儲(寮婧?http://m.shnenglu.com/kevinlynx/archive/2013/06/20/201175.htmlKevin LynxKevin LynxThu, 20 Jun 2013 06:44:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/06/20/201175.htmlhttp://m.shnenglu.com/kevinlynx/comments/201175.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/06/20/201175.html#Feedback0http://m.shnenglu.com/kevinlynx/comments/commentRss/201175.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/201175.html

鎺ヤ笂鍥炲DHT緗戠粶鐨勭爺絀?/a>錛屾垜鐢╡rlang鍏嬮殕浜嗕竴涓?a >紓佸姏鎼滅儲寮曟搸銆傛垜榪欎釜瀹炵幇鍖呭惈浜嗗畬鏁寸殑鍔熻兘錛孌HT緗戠粶鐨勫姞鍏ャ乮nfohash鐨勬帴鏀躲佺瀛愮殑鑾峰彇銆佽祫婧愪俊鎭殑绱㈠紩銆佹悳绱€?/p>

濡備笅鍥撅細

screenshot

鍦ㄦ垜鐨勭瑪璁版湰涓婏紝鎴戝紑鍚簡100涓狣HT鑺傜偣錛屽ぇ鑷村潎鍖鍦板垎甯冨湪DHT緗戠粶閲岋紝璧勬簮绱㈠紩閫熷害澶ф鍦?灝忔椂涓涓囦釜宸﹀彸錛堝寘鍚噸澶嶈祫婧愶級銆?/p>

榪欎釜紼嬪簭鍖呭惈涓夊ぇ閮ㄥ垎錛?/p>

  • DHT瀹炵幇錛宬dht錛?a >https://github.com/kevinlynx/kdht
  • 鍩轟簬璇HT瀹炵幇鐨勬悳绱㈠紩鎿庯紝dhtcrawler錛?a >https://github.com/kevinlynx/dhtcrawler錛岃欏圭洰鍖呭惈鐖櫕閮ㄥ垎鍜屼竴涓畝鍗曠殑WEB绔?/li>

榪欎袱涓」鐩誨叡鍖呭惈澶ф2500琛岀殑erlang浠g爜銆傚叾涓紝DHT瀹炵幇閮ㄥ垎灝咲HT緗戠粶鐨勫姞鍏ュ寘瑁呮垚涓涓簱錛岀埇铏儴鍒嗗湪鎼滅儲縐嶅瓙鏃訛紝鏆傛椂娌℃湁浣跨敤P2P閲岀殑縐嶅瓙涓嬭澆鏂瑰紡錛岃屾槸浣跨敤鐜版垚鐨勭鍔涢摼杞瀛愮殑緗戠珯鏈嶅姟錛岃繖鏍鋒垜鍙渶瑕佷嬌鐢╡rlang鑷甫鐨凥TTP瀹㈡埛绔氨鍙互鑾峰彇縐嶅瓙淇℃伅銆傜埇铏湪鑾峰彇鍒扮瀛愪俊鎭悗錛屽皢鏁版嵁瀛樺偍鍒癿ongodb閲屻俉EB绔垜涓轟簡灝介噺灝戠敤絎笁鏂瑰簱錛屾垜鍙ソ浣跨敤erlang鑷甫鐨凥TTP鏈嶅姟鍣紝鍥犳緗戦〉鍐呭鐨勫垱寤烘病鏈夋ā鏉跨郴緇熷彲鐢紝鍙ソ閫氳繃瀛楃涓叉瀯寤猴紝緙栧啓璧鋒潵涓嶅お鏂逛究銆?/p>

浣跨敤

鏁翠釜紼嬪簭渚濊禆浜嗕袱涓簱錛歜son-erlang鍜宮ongodb-erlang錛屼絾涓嬭澆渚濊禆搴撶殑浜嬮兘鍙互閫氳繃rebar瑙e喅錛岄」鐩枃浠墮噷鎴戝凡緇忓寘鍚簡rebar鐨勬墽琛岀▼搴忋傛垜浠呭湪Windows7涓婃祴璇曡繃錛屼絾鐞嗚涓婂湪鎵鏈塭rlang鏀寔鐨勭郴緇熶笂閮藉彲浠ャ?/p>

  • 涓嬭澆瀹夎mongodb
  • 榪涘叆mongodb bin鐩綍鍚姩mongodb錛屾暟鎹簱鐩綍淇濆瓨鍦╠b涓嬶紝闇鎵嬪姩寤虹珛璇ョ洰褰?/p>

      mongod --dbpath db --setParameter textSearchEnabled=true
    
  • 涓嬭澆erlang錛屾垜浣跨敤鐨勬槸R16B鐗堟湰

  • 涓嬭澆dhtcrawler錛屼笉闇瑕佸崟鐙笅杞絢dht錛屽緟浼氫笅杞戒緷璧栭」鐨勬椂鍊欎細鑷姩涓嬭澆

      git clone git@github.com:kevinlynx/dhtcrawler.git
    
  • cmd榪涘叆dhtcrawler鐩綍錛屼笅杞戒緷璧栭」鍓嶉渶淇濊瘉鐜鍙橀噺閲屾湁git錛屼緥濡?code>D:\Program Files (x86)\Git\cmd錛岄渶娉ㄦ剰涓嶈灝哹ash鐨勭洰褰曞姞鍏ヨ繘鏉ワ紝浣跨敤浠ヤ笅鍛戒護涓嬭澆渚濊禆欏?/p>

      rebar get-deps
    
  • 緙栬瘧

      rebar compile
    
  • 鍦╠htcrawler鐩綍涓嬶紝鍚姩erlang

      erl -pa ebin
    
  • 鍦╡rlang shell閲岃繍琛岀埇铏紝erlang璇彞浠ョ偣鍙?.)浣滀負緇撴潫

      crawler_app:start().
    
  • erlang shell閲岃繍琛孒TTP鏈嶅姟鍣?/p>

      crawler_http:start().
    
  • 嫻忚鍣ㄩ噷杈撳叆localhost:8000/index.html錛岃繖涓椂鍊欒繕娌℃湁绱㈠紩鍒拌祫婧愶紝寤鴻鐩戣緗戠粶嫻侀噺浠ヨ瀵熺埇铏▼搴忔槸鍚︽紜伐浣?/p>

鐖櫕紼嬪簭鍚姩鏃朵細璇誨彇priv/dhtcrawler.config閰嶇疆鏂囦歡錛岃鏂囦歡閲岄厤緗簡DHT鑺傜偣鐨刄DP鐩戝惉绔彛銆佽妭鐐規暟閲忋佹暟鎹簱鍦板潃絳夛紝鍙嚜琛岄厤緗?/p>

鎺ヤ笅鏉ユ垜浼氳皥璋堝悇閮ㄥ垎鐨勫疄鐜版柟娉曘?/p>



]]>
Erlang浣跨敤鎰熷彈http://m.shnenglu.com/kevinlynx/archive/2013/05/09/200138.htmlKevin LynxKevin LynxThu, 09 May 2013 13:24:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/05/09/200138.htmlhttp://m.shnenglu.com/kevinlynx/comments/200138.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/05/09/200138.html#Feedback0http://m.shnenglu.com/kevinlynx/comments/commentRss/200138.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/200138.html

鐢╡rlang涔熺畻鍐欎簡浜涗唬鐮佷簡錛屼富瑕佸寘鎷?a >浣跨敤RabbitMQ鐨勭粌涔?/a>錛屼互鍙婃渶榪戝啓鐨?a >kl_tserver鍜?a >icerl銆傚叾涓璱cerl鏄竴涓疄鐜頒簡Ice鐨別rlang搴撱?/p>

erlang鐨勪功杈冨皯錛屾垜涓昏璇昏繃<Programming Erlang>鍜?lt;Erlang/OTP in Action>銆傚叾瀹瀍rlang鏈韓灝辮璦鏉ヨ鐨勮瘽姣旇緝綆鍗曪紝鍚宺uby涓鏍鳳紝綾諱技榪欑鏈韓鐩爣鏄簲鐢ㄤ簬瀹為檯杞歡欏圭洰鐨勮璦閮芥瘮杈冪畝鍗曪紝瀵瑰簲鐨勮娉曚功寰堝揩鍙互緲誨畬銆?/p>

榪欓噷鎴戜粎璋堣皥鑷繁鍦ㄧ紪鍐檈rlang浠g爜榪囩▼涓殑涓浜涙劅鍙椼?/p>

璇硶

erlang璇硶寰堢畝鍗曪紝鎺ヨЕ榪囧嚱鏁板紡璇█鐨勭▼搴忓憳涓婃墜浼氬緢蹇傚畠娌℃湁綾諱技common lisp閲屽畯榪欑杈冨鏉傜殑璇█鐗規с傚叾璇硶鍏冪礌寰堢揣鍑戯紝涓嶅瓨鍦ㄤ竴浜涚敤澶勪笉澶х殑鐗規с傚湪榪欎箣鍓嶏紝鎴戝涔犺繃ruby鍜宑ommon lisp銆俽uby浠g爜鍐欑殑姣攃ommon lisp澶氥備絾鏄湪瀛︿範erlang鐨勮繃紼嬩腑鎴戠殑鑴戞搗閲屽嵈涓嶆柇鍑虹幇common lisp閲岀殑璇硶鐗規с傝繖澶ф鏄洜涓篶ommon lisp鐨勮娉曠浉瀵箁uby鏉ヨ錛屾洿鎺ヨ繎erlang銆?/p>

緙栫▼妯″紡

erlang涓嶆槸涓涓潰鍚戝璞$殑璇█錛屽畠涔熶笉鍚宑ommon lisp鎻愪緵澶氱緙栫▼妯″紡銆傚畠鐨勪唬鐮佸氨鏄潬涓涓釜鍑芥暟緇勭粐鍑烘潵鐨勩傞潰鍚戝璞¤璦鍦ㄨ娉曚笂鏈変竴鐐硅鎴戝緢鐖界殑鏄紝鍏跺嚱鏁拌皟鐢ㄦ洿鑷劧銆俥rlang鐨勬帴鍙h皟鐢ㄥ氨鍍廋璇█閲屾帴鍙g殑璋冪敤涓鏍鳳細

func(Obj, args)
Obj->func(args)

鍗抽渶瑕佸湪鍑芥暟絎竴涓弬鏁頒紶閫掓搷浣滃璞°備絾鏄潰鍚戝璞¤璦涔熶細甯︽潵涓浜涜娉曠殑澶嶆潅鎬с傚鏋滀竴闂ㄨ璦鍙互鐢ㄥ緢灝戠殑璇硶鍏冪礌琛ㄨ揪寰堝淇℃伅錛岄偅涔堟垜瑙夊緱榪欓棬璇█灝辨槸闂ㄤ紭縐鐨勮璦銆?/p>

琛ㄨ揪寮?璇彞

erlang閲屾病鏈夎鍙ワ紝鍏ㄩ儴鏄〃杈懼紡錛屾剰鎬濇槸鎵鏈夎娉曞厓绱犻兘鏄湁榪斿洖鍊肩殑銆傝繖瀹炲湪澶ソ浜嗭紝鍏ㄤ笘鐣岄兘鏈夎繑鍥炲煎彲浠ヨ浠g爜鍐欒搗鏉ョ畝鍗曞浜嗭細

    Flag = case func() of 1 -> true; 0 -> false end, 

鍛藉悕

鎴戜箣鎵浠ヤ笉鎯沖啓涓琛宲ython浠g爜鐨勫緢澶т竴閮ㄥ垎鍘熷洜鍦ㄤ簬榪欓棬璇█灞呯劧瑕佹眰鎴戝繀欏諱嬌鐢ㄤ唬鐮佺緝榪涙潵緙栫▼錛岀湡鏄笉鏁㈢浉淇°俥rlang閲岃櫧鐒舵病鏈夋瑙勫畾錛屽嵈涔熸湁涓嶅悓鐨勮娉曞厓绱犳湁澶у皬鍐欑殑闄愬畾銆傚彉閲忛瀛楁瘝蹇呴』澶у啓錛宎tom蹇呴』浠ュ皬鍐欏瓧姣嶅紑澶達紝鏇撮湼姘旂殑鏄ā鍧楀懡鍚嶅繀欏誨拰鏂囦歡鍚嶇浉鍚屻?/p>

鍙橀噺

erlang閲岀殑鍙橀噺鏄笉鍙洿鏀圭殑銆傚疄闄呬笂緇欎竴涓彉閲忚祴鍊鹼紝涓ユ牸鏉ヨ搴旇鍙?code>bound錛屽嵆緇戝畾銆傝繖涓壒鎬у畬鍏ㄥ氨鏄嚱鏁板紡璇█閲岀殑鐗規с傚叾甯︽潵鐨勫ソ澶勫氨鍍忓嚱鏁板紡璇█瀹f壃鐨勪竴鏍鳳紝榪欎細浣垮緱浠g爜娌℃湁鍓綔鐢?side effect)銆傚洜涓虹▼搴忛噷鐨勬墍鏈夊嚱鏁頒笉璁烘庢牱璋冪敤錛屽叾紼嬪簭鐘舵侀兘涓嶄細鏀瑰彉錛屽洜涓哄彉閲忔棤娉曡鏀瑰彉銆?/p>

鍙橀噺涓嶅彲鏇存敼錛岀洿鎺ユ剰鍛崇潃鍏ㄥ眬鍙橀噺娌℃湁瀛樺湪鐨勬剰涔夛紝涔熷氨鎰忓懗鐫涓嶈浣犵殑緋葷粺鏄涔堝鏉傚湴琚瀯寤哄嚭鏉ワ紝褰撶郴緇熷穿婧冩椂錛屽叾宕╂簝鎵鍦ㄤ綅緗殑涓婁笅鏂囧氨瓚沖鎵懼埌闂銆?/p>

浣嗘槸鍙橀噺涓嶅彲鏀瑰彉涔熶細甯︽潵涓浜涗唬鐮佺紪鍐欎笂鐨勪笉渚褲傛垜鎯寵繖澶ф鏄紪紼嬫濈淮鐨勮漿鍙橀棶棰樸俥rlang鐨勮娉曠壒鎬т細寮鴻揩浜虹紪鍐欓潪甯哥煭灝忕殑鍑芥暟錛屼綘澶ф涓嶆効鎰忕湅鍒頒綘鐨勫嚱鏁板疄鐜伴噷鍑虹幇Var1/Var2/Var3榪欐牱鐨勫彉閲忥紝鑰屽疄闄呬笂榪欐牱鐨勫懡鍚嶅湪鍛戒護寮忚璦閲屽叾瀹炴寚鐨勬槸鍚屼竴涓彉閲忥紝鍙笉榪囧叾鍊間笉鍚岃屽凡銆?/p>

浣嗘槸鎴戜滑鐨勭▼搴忔繪槸搴旇鏈夌姸鎬佺殑銆傚湪erlang閲屾垜浠氳繃涓嶆柇鍒涘緩鏂扮殑鍙橀噺鏉ュ瓨鍌ㄨ繖涓姸鎬併傛垜浠渶瑕侀氳繃灝嗚繖涓姸鎬侀殢鐫鎴戜滑鐨勭▼搴忔祦紼嬩笉鏂湴閫氳繃鍑芥暟鍙傛暟鍜岃繑鍥炲間紶閫掍笅鍘匯?/p>

atom

atom榪欎釜璇硶鐗規ф湰韜病闂錛屽畠灝卞悓lisp閲岀殑atom涓鏍鳳紝娌′粈涔堟剰涔夛紝灝辨槸涓涓悕瀛椼傚畠涓昏鐢ㄥ湪澧炲姞浠g爜鐨勫彲璇繪т笂銆備絾鏄繖涓猘tom甯︽潵鐨勫ソ澶勶紝鐩存帴瀵艱嚧erlang涓嶅幓鍐呯疆璇稿true/false榪欑鍏抽敭瀛椼俥rlang浣跨敤true/false榪欎袱涓猘tom鏉ヤ綔涓篵oolean operator鐨勮繑鍥炲箋備絾erlang閲屼弗鏍兼潵璇存槸娌℃湁甯冨皵綾誨瀷鐨勩傝繖鍏跺疄娌′粈涔堬紝緋熺硶鐨勬槸錛屽浜庝竴浜涜緝甯歌鐨勫嚱鏁拌繑鍥炲鹼紝渚嬪true/false錛宔rlang紼嬪簭鍛樹箣闂村氨寰楀仛綰﹀畾銆傝琛ㄧず涓涓嚱鏁版墽琛屽け璐ヤ簡錛屾垜鍙互榪斿洖false銆乶ull銆乫ailed銆乪rror銆乶il錛岀敋鑷硍hat_the_fuck錛岃繖涓搴﹁鎴戣糠鎯樸?/p>

list/tuple

erlang閲岀殑list褰撶劧娌℃湁lisp閲岀殑list鐗涢鹼紝鍒漢鏁翠釜涓栫晫灝辨槸鐢眑ist鏋勬垚鐨勩傚湪涓孌墊椂闂撮噷錛屾垜涓鐩翠互涓簂ist閲屽彧鑳戒繚瀛樼浉鍚岀被鍨嬬殑鍏冪礌錛岃宼uple鎵嶆槸鐢ㄤ簬淇濆瓨涓嶅悓綾誨瀷鍏冪礌鐨勫鍣ㄣ傜洿鍒版湁涓澶╂垜鍙戠幇tuple鐨勬搷浣滀笉鑳芥弧瓚蟲垜鐨勯渶姹備簡錛屾垜鎵嶅彂鐜發ist灞呯劧鏄彲浠ヤ繚瀛樹笉鍚岀被鍨嬬殑銆?/p>

list鐩稿浜巘uple鑰岃█錛屾洿鍘夊鐨勫湴鏂瑰氨鍦ㄤ簬澶村尮閰嶏紝鎰忔濇槸鍙互閫氳繃鍖歸厤鏉ユ媶鍒唋ist鐨勫ご鍜屽墿浣欓儴鍒嗐?/p>

鍖歸厤(match)

erlang鐨勫尮閰嶆満鍒舵槸涓ソ涓滆タ銆傝繖涓笢瑗胯瘡絀夸簡鏁翠釜璇█銆傚湪鎴戠悊瑙g湅鏉ワ紝鍖歸厤鏈哄埗鍑忓皯浜嗗緢澶氬垽鏂唬鐮併傚畠璇曞浘鐢ㄤ竴涓湡鏈涚殑綾誨瀷鍘誨尮閰嶅彟涓涓笢瑗匡紝濡傛灉榪欎釜涓滆タ鍑轟簡閿欙紝瀹冨氨鏃犳硶瀹屾垚榪欎釜鍖歸厤銆傛棤娉曞畬鎴愬尮閰嶅氨瀵艱嚧紼嬪簭鏂帀銆?/p>

鍖歸厤榪樻湁涓柟渚跨殑鍦版柟鍦ㄤ簬鍙互寰堟柟渚垮湴鍙栧嚭record閲岀殑鎴愬憳錛屾垨鑰卼uple鍜宭ist鐨勬煇涓儴鍒嗭紝榪欏叾瀹炲寮轟簡鍏朵粬璇硶鍏冪礌鐨勮兘鍔涖?/p>

寰幆

erlang閲屾病鏈夊驚鐜娉曞厓绱狅紝榪欑湡鏄お濂戒簡銆傚嚱鏁板紡璇█閲屼負浠涔堣鏈夊驚鐜娉曞憿錛焎ommon lisp騫叉瘺瑕佸姞涓婇偅浜涘鏉傜殑寰幆錛堝畯錛夛紝姣忔鎴戦亣鍒伴渶瑕佸啓寰幆鐨勫満鏅椂錛屾垜閮借瘹鎯惰瘹鎭愶紝鏈鍚庤繕鏄敤閫掑綊鏉ヨВ鍐熾?/p>

鍚屾牱錛屽湪erlang閲屾垜浠篃鏄敤鍑芥暟閫掑綊鏉ヨВ鍐沖驚鐜棶棰樸傜敋鑷籌紝鎴戜滑榪樻湁list comprehension銆傚綋鎴戝啓C++浠g爜鏃訛紝鎴戝緢涓嶆儏鎰跨敤寰幆鍘誨啓閭d簺瀹瑰櫒閬嶅巻浠g爜錛屽垢榪愮殑鏄湪C++11閲岄氳繃lambda鍜孲TL閲岄偅浜涚畻娉曟垜緇堜簬涓嶇敤鍐嶅啓榪欐牱鐨勫驚鐜唬鐮佷簡銆?/p>

if/case/guard

erlang閲屾湁鏉′歡鍒ゅ畾璇硶if錛岀敋鑷寵繕鏈夌被浼糃璇█閲岀殑switch鈥ase銆傝繖涓垜涓鏃跺崐浼氳繕涓嶆暍璇勪環錛屽ソ鍍廻askell閲屼篃淇濈暀浜唅f銆俥rlang閲屽悓haskell涓鏍鋒湁guard鐨勬蹇碉紝榪欏叾瀹炴槸涓縐嶅彉鐩哥殑鏉′歡鍒ゆ柇錛屽彧涓嶈繃鍏朵嬌鐢ㄥ満鏅笉涓鏍楓?/p>

榪涚▼

騫跺彂鎬ф敮鎸佸睘浜巈rlang鐨勬渶澶т寒鐐廣俥rlang閲岀殑榪涚▼姒傚康闈炲父綆鍗曪紝鍩轟簬娑堟伅鏈哄埗錛岀▼搴忓憳浠庢潵涓嶉渶瑕佹媴蹇冨悓姝ラ棶棰樸傛瘡涓繘紼嬮兘鏈変竴涓猰ailbox錛岀敤浜庣紦瀛樺彂閫佸埌姝よ繘紼嬬殑娑堟伅銆俥rlang鎻愪緵鍐呯疆鐨勮娉曞厓绱犳潵鍙戦佸拰鎺ユ敹娑堟伅銆?/p>

erlang鐢氳嚦鎻愪緵鍒嗗竷寮忔敮鎸侊紝鏇撮叿鐨勬槸浣犲線緗戠粶涓婄殑鍏朵粬榪涚▼鍙戦佹秷鎭紝鍏惰娉曞拰寰鏈湴榪涚▼鍙戦佹槸涓鏍風殑銆?/p>

妯″潡鍔犺澆

濡傛灉鎴戝啓浜嗕竴涓猠rlang搴擄紝璇ュ浣曞湪鍙︿竴涓猠rlang紼嬪簭閲屽姞杞借繖涓簱錛熻繖涓棶棰樹竴搴﹁鎴戣糠鎯樸俥rlang閲岃矊浼兼湁瀵瑰簱鎵撳寘鐨勫姛鑳?.ez?)錛屾寜鐞嗚搴旇鎻愪緵涓縐嶆暣涓簱鍔犺澆鐨勬柟寮忥紝鐒跺悗鍙互閫氳繃鎵嬪姩璋冪敤鍑芥暟鎴栬呮寚瀹氫唬鐮佷緷璧栭」鏉ュ姞杞姐傜粨鏋滀笉鏄繖鏍楓?/p>

erlang涓嶆槸鎸夋暣涓簱鏉ュ姞杞界殑錛屽洜涓轟篃娌℃湁鏂瑰紡鍘繪弿榪頒竴涓簱錛堝簲璇ユ湁絎笁鏂圭殑錛夈傚綋鎴戜滑璋冪敤鏌愪釜妯″潡閲岀殑鍑芥暟鏃訛紝erlang浼氳嚜鍔ㄤ粠鏌愪釜鐩綍鍒楄〃閲屽幓鎼滅儲瀵瑰簲鐨刡eam鏂囦歡銆傛墍浠ワ紝鍙互閫氳繃鍦ㄥ惎鍔╡rlang娣誨姞榪欎釜妯″潡鏂囦歡鎵鍦ㄧ洰褰曟潵瀹炵幇鍔犺澆錛岃繖榪樻槸鑷姩鐨勩傚綋鐒訛紝涔熷彲浠ュ湪erlang shell閲岄氳繃鍑芥暟娣誨姞榪欎釜鐩綍銆?/p>

OTP

浣跨敤erlang鏉ョ紪鍐欑▼搴忥紝鏈澶х殑浼樺娍鍙兘灝辨槸鍏禣TP浜嗐侽TP鍩烘湰涓婂氨鏄竴浜涢殢erlang涓璧峰彂甯冪殑搴撱傝繖浜涘簱涓渶閲嶈鐨勪竴涓蹇墊槸behaviour銆俠ehaviour鍏跺疄灝辨槸鎻愪緵浜嗕竴縐嶇紪紼嬫鏋訛紝搴旂敤灞傛彁渚涘悇縐嶅洖璋冨嚱鏁扮粰榪欎釜妗嗘灦錛屼粠鑰岃幏寰椾竴涓仴澹殑騫跺彂紼嬪簭銆?/p>

application behaviour

application behaviour鐢ㄤ簬緇勭粐涓涓猠rlang紼嬪簭錛岄氳繃涓涓厤緗枃浠訛紝鍜屾彁渚涜嫢騫插洖璋冿紝灝卞彲浠ヨ鎴戜滑緙栧啓鐨別rlang紼嬪簭浠ヤ竴縐嶇粺涓鐨勬柟寮忓惎鍔ㄣ傛垜涔嬪墠鍐欑殑閮芥槸erlang搴擄紝騫朵笉闇瑕佸惎鍔紝鑰屾槸鎻愪緵緇欏簲鐢ㄥ眰浣跨敤錛屾墍浠ヤ篃娌′嬌鐢ㄨbehaviour銆?/p>

gen_server behaviour

榪欎釜behaviour搴旇鏄嬌鐢ㄩ鐜囧緢楂樼殑銆傚畠灝佽浜嗚繘紼嬩嬌鐢ㄧ殑緇嗚妭錛屾湰璐ㄤ笂涔熷氨鏄皢涓誨姩鏀跺彇娑堟伅鏀規垚浜嗚嚜鍔ㄦ敹鍙栵紝鏀跺彇鍚庡啀鍥炶皟緇欎綘鐨勬ā鍧椼?/p>

supervisor behaviour

榪欎釜behaviour鐪嬭搗鏉ュ緢鍘夊錛岄氳繃瀵瑰畠榪涜涓浜涢厤緗紝浣犲彲浠ユ妸浣犵殑騫跺彂紼嬪簭閲岀殑鎵鏈夎繘紼嬪緩绔嬫垚鏍戠姸緇撴瀯銆傝繖涓粨鏋勭殑鐗涢間箣澶勫湪浜庯紝褰撴煇涓繘紼嬫寕鎺変箣鍚庯紝閫氳繃supervisor鍙互鑷姩閲嶆柊鍚姩榪欎釜鎸傛帀鐨勮繘紼嬶紝褰撶劧閲嶅惎娌¤繖涔堢畝鍗曪紝瀹冩彁渚涘縐嶉噸鍚鍒欙紝浠ヨ鏁翠釜緋葷粺紜疄閫氳繃閲嶅惎鍙樻垚姝e父鐘舵併傝繖瀹炲湪澶墰閫間簡錛岃繖鎰忓懗鐫浣犵殑鏈嶅姟鍣ㄥ彲浠?x24灝忔椂鍦拌繍琛屼簡錛屽氨綆楁湁闂浣犱篃鍙互绔嬪埢鑾峰緱涓涓噸鍐欏伐浣滅殑緋葷粺銆?/p>

鐑洿鏂?/h3>

浠g爜鐑洿鏂板浜庝竴涓姩鎬佽璦鑰岃█鍏跺疄鏍規湰綆椾笉涓婁粈涔堜紭鐐癸紝鍩烘湰涓婂姩鎬佽璦閮借兘鍋氬埌榪欎竴鐐廣備絾鏄妸鐑洿鏂拌繖涓姛鑳藉姞鍒頒竴涓敤浜庡紑鍙戝茍鍙戠▼搴忕殑璇█閲岋紝閭e氨寰堢墰閫間簡銆備綘鍐嶄竴嬈″彲浠ョ‘淇濅綘鐨勬湇鍔″櫒7x24灝忔椂涓嶅仠鏈虹淮鎶ゃ?/p>

gen_tcp

鏈寮濮嬫垜浠ヤ負erlang灝嗙綉緇滈儴鍒嗗皝瑁呭緱宸茬粡璁や笉鍑烘湁socket榪欎釜姒傚康浜嗐傝嚦灝戯紝浣犱篃寰楁湁涓涓墰閫肩殑緗戠粶搴撳惂銆傜粨鏋滃彂鐜頒緷鐒惰繕鏄痵ocket閭d竴濂椼傜劧鍚庢垜寰堝け鏈涖傜洿鍒板悗鏉ワ紝鍙戠幇浣跨敤涓浜沚ehaviour錛屽姞涓婅皟鏁磄en_tcp鐨勪竴浜沷ption錛屽眳鐒跺彲浠ヤ互寰堝皯鐨勪唬鐮佸啓鍑轟竴涓淮鎶ゅぇ閲忚繛鎺ョ殑TCP鏈嶅姟鍣ㄣ傛槸鍟婏紝erlang澶╃敓灝辨槸騫跺彂鐨勶紝鍦ㄤ紶緇熺殑緗戠粶妯″瀷涓紝鎴戜滑浼氳寰椾嬌鐢╫ne-thread-per-connection铏界劧綆鍗曞嵈涓嶆槸鍙鐨勶紝鍥犱負thread鏄疧S璧勬簮錛屽お鏄傝吹銆備絾鏄湪erlang閲岋紝one-process-per-connection鍗存槸鍐嶈嚜鐒朵笉榪囩殑浜嬫儏銆備綘瑕佹槸鍐欎釜erlang紼嬪簭閲岄潰鍗村彧鏈変竴涓猵rocess浣犻兘涓嶅ソ鎰忔濆憡璇夊埆浜轟綘鍐欑殑鏄痚rlang銆俻rocess鏄珮鏁堢殑錛堝鎴戜滑榪欑浜屾祦紼嬪簭鍛樿岃█錛夛紝瀹冨氨鍍廋++閲屼竴涓緢鏅氱殑瀵硅薄涓鏍楓?/p>

鍦ㄤ嬌鐢╣en_tcp鐨勮繃紼嬩腑鎴戝彂鐜頒竴涓棶棰橈紝涓嶇鎴戜嬌鐢ㄥ摢涓縐嶆ā鍨嬶紝鎴戠珶鐒舵壘涓嶅埌涓縐嶆俯鏌旂殑鍏抽棴鏂瑰紡銆傛垜鏌ョ湅浜嗗嚑涓猼utorial錛岃繖浜涙販铔嬬珶鐒舵病鏈変竴涓漢鎻愬埌濡備綍鍘繪甯稿叧闂竴涓猠rlang TCP鏈嶅姟鍣ㄣ傚悗鏉ワ紝鎴戞病鏈夊姙娉曪紝鍙ソ浣跨敤API寮哄埗鍏抽棴鏈嶅姟鍣ㄨ繘紼嬨?/p>

Story

鍏跺疄錛屾垜鍜宔rlang涔嬮棿鏄湁鏁呬簨鐨勩傛垜騫朵笉鏄繖涓湀寮濮嬫墠鎺ヨЕerlang銆傛棭鍦?009騫村澶╃殑鏃跺欐垜灝卞涔犺繃榪欓棬璇█銆傞偅鏃跺欐垜榪樻病鎺ヨЕ榪囦換浣曞嚱鏁板紡璇█錛岄偅鏃跺檒ua閲岀殑闂寘閮借鎴戣寰楁柊濂囥傜劧鍚庢棤鎰忛棿錛屾垜鑾悕鍏跺鍦版帴瑙︿簡haskell錛?lt;Real World Haskell>錛夛紝鍦ㄦ垜鍐沖畾寮濮嬪啓鐐逛粈涔坔askell緇冧範鏃訛紝鎴戝彂鐜版垜鏃犱粠涓嬫墜錛屾渶鍚庯紝Monads鎶婃垜鍚撳摥浜嗐俬askell瀹炲湪澶彲鎬曚簡銆?/p>

绱ф帴鐫鎴戞鎻g潃瀵瑰嚱鏁板紡璇█鐨勬祿鐑堝ソ濂囧績鐪嬪埌浜唀rlang銆傚綋鎴戠湅鍒頒簡concurrent programming鐨勭珷鑺傛椂錛屽湪涓涓嚗鐑毦鑰愮殑涓嬪崍鎴戠殑棰嗗鎵懼埌浜嗘垜錛屽悓鎴戞帰璁ㄨ搗erlang瀵規垜浠殑緗戞父鏈嶅姟鍣ㄦ湁浠涔堝ソ澶勩傜劧鍚庯紝鎴戠粨鏉熸垜浜嗙殑erlang涔嬫梾銆?/p>

鏃墮殧鍥涘勾錛岃繖縐嶅皬浼楄璦錛屽眳鐒惰繘鍏ヤ簡涓浗紼嬪簭鍛樼殑瑙嗛噹錛屽茍琚敤浜庡紑鍙戠綉欏墊父鎴忔湇鍔″櫒銆傛椂浠e湪榪涙錛屾垜浠繪槸琚敥鍦ㄥ悗闈€?/p>



]]>
erlang鍜孯abbitMQ瀛︿範鎬葷粨http://m.shnenglu.com/kevinlynx/archive/2013/04/12/199393.htmlKevin LynxKevin LynxFri, 12 Apr 2013 13:27:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2013/04/12/199393.htmlhttp://m.shnenglu.com/kevinlynx/comments/199393.htmlhttp://m.shnenglu.com/kevinlynx/archive/2013/04/12/199393.html#Feedback0http://m.shnenglu.com/kevinlynx/comments/commentRss/199393.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/199393.html

AMQP鍜孯abbitMQ姒傝堪

AMQP(Advanced Message Queue Protocol)瀹氫箟浜嗕竴縐嶆秷鎭郴緇熻鑼冦傝繖涓鑼冩弿榪頒簡鍦ㄤ竴涓垎甯冨紡鐨勭郴緇熶腑鍚勪釜瀛愮郴緇熷浣曢氳繃娑堟伅浜や簰銆傝?a >RabbitMQ鍒欐槸AMQP鐨勪竴縐嶅熀浜巈rlang鐨勫疄鐜般?/p>

AMQP灝嗗垎甯冨紡緋葷粺涓悇涓瓙緋葷粺闅旂寮鏉ワ紝瀛愮郴緇熶箣闂翠笉鍐嶆湁渚濊禆銆傚瓙緋葷粺浠呬緷璧栦簬娑堟伅銆傚瓙緋葷粺涓嶅叧蹇冩秷鎭殑鍙戦佽咃紝涔熶笉鍏沖績娑堟伅鐨勬帴鍙楄呫?/p>

AMQP涓湁涓浜涙蹇碉紝鐢ㄤ簬瀹氫箟涓庡簲鐢ㄥ眰鐨勪氦浜掋傝繖浜涙蹇靛寘鎷細message銆乹ueue銆乪xchange銆乧hannel, connection, broker銆乿host銆?/p>

娉細鍒扮洰鍓嶄負姝㈡垜騫舵病鏈夋墦綆椾嬌鐢ˋMQP錛屾墍浠ユ病鏈夊仛鏇存繁鍏ョ殑瀛︿範錛屼粎涓轟簡鎵句釜鏈轟細鍐欏啓erlang浠g爜錛屼互涓嬩俊鎭粎渚涘弬鑰冦?/em>

  • message錛屽嵆娑堟伅錛岀畝鍗曟潵璇村氨鏄簲鐢ㄥ眰闇瑕佸彂閫佺殑鏁版嵁
  • queue錛屽嵆闃熷垪錛岀敤浜庡瓨鍌ㄦ秷鎭?/li>
  • exchange錛屾湁緲昏瘧涓?#8220;璺敱”錛屽畠鐢ㄤ簬鎶曢掓秷鎭紝搴旂敤紼嬪簭鍦ㄥ彂閫佹秷鎭椂騫朵笉鏄寚瀹氭秷鎭鍙戦佸埌鍝釜闃熷垪錛岃屾槸灝嗘秷鎭姇閫掔粰璺敱錛岀敱璺敱鎶曢掑埌闃熷垪
  • channel錛屽嚑涔庢墍鏈夋搷浣滈兘鍦╟hannel涓繘琛岋紝鏈夌偣綾諱技涓涓矡閫氶氶亾
  • connection錛屽簲鐢ㄧ▼搴忎笌broker鐨勭綉緇滆繛鎺?/li>
  • broker錛屽彲綆鍗曠悊瑙d負瀹炵幇AMQP鐨勬湇鍔★紝渚嬪RabbitMQ鏈嶅姟

鍏充簬AMQP鍙互閫氳繃涓綃囧緢鏈夊悕鐨勬枃绔犱簡瑙f洿澶氾細RabbitMQ+Python鍏ラ棬緇忓吀 鍏斿瓙鍜屽厰瀛愮獫

RabbitMQ鐨勮繍琛岄渶瑕乪rlang鐨勬敮鎸侊紝erlang鍜孯abbitMQ鍦╳indows涓嬮兘鍙互鐩存帴浣跨敤瀹夎紼嬪簭錛岄潪甯哥畝鍗曘俁abbitMQ榪樻敮鎸佺綉欏電鐨勭鐞嗭紝榪欓渶瑕佸紑鍚竴浜汻abbitMQ鐨勬彃浠訛紝鍙互鍙傝?a >瀹樻柟鏂囨。銆?/p>

RabbitMQ鏈川涓婂叾瀹炴槸涓涓湇鍔″櫒錛屼笌榪欎釜鏈嶅姟鍣ㄥ仛浜や簰鍒欐槸閫氳繃AMQP瀹氫箟鐨勫崗璁紝搴旂敤鍙互浣跨敤涓涓疄鐜頒簡AMQP鍗忚鐨勫簱鏉ヤ笌鏈嶅姟鍣ㄤ氦浜掋傝繖閲屾垜浣跨敤erlang鐨勪竴涓鎴風錛屽搴旂潃RabbitMQ鐨則utorial錛屼嬌鐢╡rlang瀹炵幇浜嗕竴閬嶃傚熀浜庤繖涓繃紼嬫垜灝嗕竴浜涘叧閿疄鐜扮綏鍒楀嚭鏉ヤ互渚涜蹇嗭細

涓昏鍔熻兘浣跨敤

鍏充簬RabbitMQ erlang client鐨勪嬌鐢ㄨ鏄庡彲浠ュ弬鑰?a >瀹樻柟鏂囨。銆傝繖涓猚lient library涓嬭澆涓嬫潵鍚庢槸涓や釜ez鏂囦歡錛屽叾瀹炲氨鏄痾ip鏂囦歡錛屾湰韜槸erlang鏀寔鐨勫簱鎵撳寘鏍煎紡錛屼絾鎹榪欎釜feature榪樹笉鎴愮啛銆傛諱箣鎴戞槸鐩存帴瑙e帇錛岀劧鍚庡湪鐜鍙橀噺涓寚瀹?code>ERL_LIBS鍒拌В鍘嬬洰褰曘備嬌鐢ㄦ椂浣跨敤include_lib鍖呭惈搴撴枃浠訛紙綾諱技C璇█閲岀殑澶存枃浠訛級錛?/p>

    -include_lib("amqp_client/include/amqp_client.hrl").

Connection/Channel

瀵逛簬榪炴帴鍒版湰鍦扮殑RabbitMQ鏈嶅姟錛?/p>

    {ok, Connection} = amqp_connection:start(#amqp_params_network{}),
    {ok, Channel} = amqp_connection:open_channel(Connection),

鍒涘緩Queue

姣忎釜Queue閮芥湁鍚嶅瓧錛岃繖涓悕瀛楀彲浠ヤ漢涓烘寚瀹氾紝涔熷彲浠ョ敱緋葷粺鍒嗛厤銆俀ueue鍒涘緩鍚庡鏋滀笉鏄劇ず鍒犻櫎錛屾柇寮緗戠粶榪炴帴鏄笉浼氳嚜鍔ㄥ垹闄よ繖涓猀ueue鐨勶紝榪欎釜鍙互鍦≧abbitMQ鐨剋eb綆$悊绔湅鍒般?/p>

    #'queue.declare_ok'{queue = Q}
        = amqp_channel:call(Channel, #'queue.declare'{queue = <<"rpc_queue">>}),

浣嗕篃鍙互鎸囧畾Queue浼氬湪紼嬪簭閫鍑哄悗琚嚜鍔ㄥ垹闄わ紝闇瑕佹寚瀹?code>exclusive鍙傛暟錛?/p>

    QDecl = #'queue.declare'{queue = <<>>, exclusive = true},
    #'queue.declare_ok'{queue = Q} = amqp_channel:call(Channel, QDecl),

涓婁緥涓璹ueue鐨勫悕瀛楁湭鎸囧畾錛岀敱緋葷粺鍒嗛厤銆?/p>

鍙戦佹秷鎭?/h3>

涓鑸儏鍐典笅錛屾秷鎭叾瀹炴槸鍙戦佺粰exchange鐨勶細

    Payload = <<"hello">>
    Publish = #'basic.publish'{exchange = <<"log_exchange">>},
    amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Payload}),

exchange鏈変竴緋誨垪瑙勫垯錛屽喅瀹氭煇涓秷鎭皢琚姇閫掑埌鍝釜闃熷垪銆?/p>

鍙戦佹秷鎭椂涔熷彲浠ヤ笉鎸囧畾exchange錛岃繖涓椂鍊欐秷鎭殑鎶曢掑皢渚濊禆浜?code>routing_key錛?code>routing_key鍦ㄨ繖縐嶅満鏅笅灝卞搴旂潃鐩爣queue鐨勫悕瀛楋細

    #'queue.declare_ok'{queue = Q}
        = amqp_channel:call(Channel, #'queue.declare'{queue = <<"rpc_queue">>}),
    Payload = <<"hello">>,
    Publish = #'basic.publish'{exchange = <<>>, routing_key = Q},
    amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Payload}),

鎺ユ敹娑堟伅

鍙互閫氳繃娉ㄥ唽涓涓秷鎭痗onsumer鏉ュ畬鎴愭秷鎭殑寮傛鎺ユ敹錛?/p>

    Sub = #'basic.consume' {queue = Q},
    #'basic.consume_ok'{consumer_tag = Tag} = amqp_channel:subscribe(Channel, Sub, self()),

浠ヤ笂娉ㄥ唽浜嗕簡涓涓猚onsumer錛岀洃鍚彉閲?code>Q鎸囧畾鐨勯槦鍒椼傚綋鏈夋秷鎭埌杈捐闃熷垪鏃訛紝緋葷粺灝變細鍚慶onsumer榪涚▼瀵瑰簲鐨刴ailbox鎶曢掍竴涓氱煡錛屾垜浠彲浠ヤ嬌鐢?code>receive鏉ユ帴鏀惰閫氱煡錛?/p>

    loop(Channel) ->
        receive 
            % This is the first message received (from RabbitMQ)
            #'basic.consume_ok'{} -> 
                loop(Channel);
            % a delivery
            {#'basic.deliver'{delivery_tag = Tag}, #amqp_msg{payload = Payload}} ->
                echo(Payload),
                % ack the message
                amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),
                loop(Channel);
        ...

緇戝畾exchange鍜宷ueue

緇戝畾(binding)鍏跺疄涔熺畻AMQP閲岀殑涓涓叧閿蹇碉紝瀹冪敤浜庡緩绔媏xchange鍜宷ueue涔嬮棿鐨勮仈緋伙紝浠ユ柟渚縠xchange鍦ㄦ敹鍒版秷鎭悗灝嗘秷鎭姇閫掑埌闃熷垪銆傛垜浠笉涓瀹氶渶瑕佸皢闃熷垪鍜宔xchange緇戝畾璧鋒潵銆?/p>

    Binding = #'queue.bind'{queue = Queue, exchange = Exchange, routing_key = RoutingKey},
    #'queue.bind_ok'{} = amqp_channel:call(Channel, Binding)

鍦ㄧ粦瀹氱殑鏃跺欓渶瑕佸~鍏ヤ竴涓?code>routing_key鐨勫弬鏁幫紝涓嶅悓綾誨瀷鐨別xchange瀵硅鍊肩殑澶勭悊鏂瑰紡涓嶄竴鏍鳳紝渚嬪鍚庨潰鎻愬埌fanout綾誨瀷鐨別xchange鏃訛紝灝變笉闇瑕佽鍊箋?/p>

鏇村緇嗚妭

閫氳繃闃呰RabbitMQ tutorial錛屾垜浠繕浼氳幏寰楀緢澶氱粏鑺備俊鎭備緥濡俥xchange鐨勭綾匯乥inding絳夈?/p>

exchange鍒嗙被

exchange鏈夊洓縐嶇被鍨嬶紝涓嶅悓綾誨瀷鍐沖畾浜嗗叾鍦ㄦ敹鍒版秷鎭悗錛岃濡備綍澶勭悊榪欐潯娑堟伅錛堟姇閫掕鍒欙級錛岃繖鍥涚綾誨瀷涓猴細

  • fanout
  • direct
  • topic
  • headers

fanout綾誨瀷鐨別xchange鏄竴涓箍鎾璭xchange錛屽畠鍦ㄦ敹鍒版秷鎭悗浼氬皢娑堟伅騫挎挱緇欐墍鏈夌粦瀹氬埌瀹冧笂闈㈢殑闃熷垪銆傜粦瀹?binding)鐢ㄤ簬灝嗛槦鍒楀拰exchange鍏寵仈璧鋒潵銆傛垜浠彲浠ュ湪鍒涘緩exchange鐨勬椂鍊欐寚瀹歟xchange鐨勭被鍨嬶細

    Declare = #'exchange.declare'{exchange = <<"my_exchange">>, type = <<"fanout">>}
    #'exchange.declare_ok'{} = amqp_channel:call(Channel, Declare)

direct綾誨瀷鐨別xchange鍦ㄦ敹鍒版秷鎭悗錛屼細灝嗘娑堟伅鎶曢掑埌鍙戦佹秷鎭椂鎸囧畾鐨?code>routing_key鍜岀粦瀹氶槦鍒楀埌exchange涓婃椂鐨?code>routing_key鐩稿悓鐨勯槦鍒楅噷銆傚彲浠ュ嬈$粦瀹氫竴涓槦鍒楀埌涓涓猠xchange涓婏紝姣忔鎸囧畾涓嶅悓鐨?code>routing_key錛屽氨鍙互鎺ユ敹澶氱routing_key綾誨瀷鐨勬秷鎭?strong>娉ㄦ剰錛岀粦瀹氶槦鍒楁椂鎴戜滑鍙互濉叆涓涓?code>routing_key錛屽彂閫佹秷鎭椂涔熷彲浠ユ寚瀹氫竴涓?code>routing_key銆?/strong>

topic綾誨瀷鐨別xchange鐩稿綋浜庢槸direct exchange鐨勬墿灞曪紝direct exchange鍦ㄦ姇閫掓秷鎭埌闃熷垪鏃訛紝鏄崟綰殑瀵?code>routing_key鍋氱浉絳夊垽瀹氾紝鑰宼opic exchange鍒欐槸涓涓?code>routing_key鐨勫瓧絎︿覆鍖歸厤錛屽氨鍍忔鍒欒〃杈懼紡涓鏍楓傚湪routing_key涓彲浠ュ~鍏ヤ竴縐嶅瓧絎︿覆鍖歸厤絎﹀彿錛?/p>

* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.

header exchange tutorial涓湭鎻愬埌錛屾垜涔熶笉娣辯┒

娑堟伅鎶曢掑強鍥炲簲

姣忎釜娑堟伅閮藉彲浠ユ彁渚涘洖搴旓紝浠ヤ嬌RabbitMQ紜畾璇ユ秷鎭‘瀹炶鏀跺埌銆俁abbitMQ閲嶆柊鎶曢掓秷鎭粎渚濋潬涓巆onsumer鐨勭綉緇滆繛鎺ユ儏鍐碉紝鎵浠ュ彧瑕佺綉緇滆繛鎺ユ甯革紝consumer鍗℃涔熶笉浼氬鑷碦abbitMQ閲嶆姇娑堟伅銆傚涓嬪洖搴旀秷鎭細

    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),

鍏朵腑Tag鏉ユ簮浜庢帴鏀跺埌娑堟伅鏃墮噷鐨?code>Tag銆?/p>

濡傛灉鏈夊涓猚onsumer鐩戝惉浜嗕竴涓槦鍒楋紝RabbitMQ浼氫緷嬈℃妸娑堟伅鎶曢掑埌榪欎簺consumer涓娿傝繖閲岀殑鎶曢掑師鍒欎嬌鐢ㄤ簡round robin鏂規硶錛屼篃灝辨槸杞祦鏂瑰紡銆傚鍓嶆墍榪幫紝濡傛灉鏌愪釜consumer鐨勫鐞嗛昏緫鑰楁椂涓ラ噸錛屽垯灝嗗鑷村涓猚onsumer鍑虹幇璐熻澆涓嶅潎琛$殑鎯呭喌錛岃孯abbitMQ騫朵笉鍏沖績consumer鐨勮礋杞姐傚彲浠ラ氳繃娑堟伅鍥炲簲鏈哄埗鏉ラ伩鍏峈abbitMQ浣跨敤榪欑娑堟伅鏁板鉤鍧囩殑鎶曢掑師鍒欙細

    Prefetch = 1,
    amqp_channel:call(Channel, #'basic.qos'{prefetch_count = Prefetch})

娑堟伅鍙潬鎬?/h3>

RabbitMQ鍙互淇濊瘉娑堟伅鐨勫彲闈犳э紝榪欓渶瑕佽緗秷鎭拰闃熷垪閮戒負durable鐨勶細

    #'queue.declare_ok'{queue = Q} = amqp_channel:call(Channel, #'queue.declare'{queue = <<"hello_queue">>, durable = true}),

    Payload = <<"foobar">>,
    Publish = #'basic.publish'{exchange = "", routing_key = Queue},
    Props = #'P_basic'{delivery_mode = 2}, %% persistent message
    Msg = #amqp_msg{props = Props, payload = Payload},
    amqp_channel:cast(Channel, Publish, Msg)

鍙傝?/h2>

闄や簡鍙傝僐abbitMQ tutorial澶栵紝榪樺彲浠ョ湅鐪嬪埆浜轟嬌鐢╡rlang鏄浣曞疄鐜拌繖浜泃utorial鐨勶紝github涓婃湁涓涓繖鏍風殑欏圭洰錛?a >rabbitmq-tutorials銆傛垜鑷繁涔熷疄鐜頒簡涓浠斤紝鍖呮嫭rabbitmq-tutorials涓病瀹炵幇鐨凴PC銆傚悗鏉ユ垜鍙戠幇鍘熸潵rabbitmq erlang client鐨勫疄鐜伴噷宸茬粡鍖呭惈浜嗕竴涓猂PC妯″潡銆?/p>



]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲精品一区二区三区不| 欧美在线观看视频一区二区三区 | 国产精品国产三级国产aⅴ入口 | 一区二区高清在线观看| 亚洲精品影视在线观看| 一本一本久久| 欧美亚洲日本一区| 美女国产一区| 欧美日韩一区二区三区在线| 欧美色图五月天| 国产一区二区三区在线观看网站 | 国产精品香蕉在线观看| 一区二区三区在线观看欧美| 亚洲毛片在线观看| 亚洲男女毛片无遮挡| 久久精品国产69国产精品亚洲| 久久婷婷国产综合尤物精品| 亚洲国产精品999| 日韩一级黄色片| 小黄鸭视频精品导航| 久久男人资源视频| 欧美日韩日本国产亚洲在线| 国产一区二区三区在线免费观看| 亚洲欧洲精品一区二区三区| 午夜精品久久久久| 亚洲第一精品福利| 亚洲一区在线观看视频| 女仆av观看一区| 国产亚洲精品福利| 亚洲视频欧洲视频| 亚洲第一在线综合在线| 久久精品卡一| 亚洲第一中文字幕在线观看| 中国成人黄色视屏| 欧美在线3区| 美乳少妇欧美精品| 欧美性色视频在线| 在线观看三级视频欧美| 国产精品99久久久久久白浆小说| 久久精品在线观看| 日韩视频国产视频| 久久久久久9999| 国产女人水真多18毛片18精品视频| 亚洲国产一区二区a毛片| 亚洲在线成人精品| 亚洲国产导航| 久久精品视频va| 国产精品美腿一区在线看| 亚洲区在线播放| 久久久久久久久久码影片| 日韩天天综合| 欧美成年人网| 亚洲电影免费| 久热精品在线| 久久动漫亚洲| 亚洲自拍偷拍一区| 欧美在线免费观看视频| 欧美不卡视频一区发布| 国产精品亚洲成人| 日韩一级在线| 亚洲国产精品成人综合| 久久www成人_看片免费不卡| 国产麻豆午夜三级精品| 午夜日韩在线| 香蕉成人久久| 狠狠色丁香婷婷综合影院| 欧美一区二区视频在线观看2020 | 欧美黑人在线播放| 久久亚洲精品网站| 亚洲国产成人精品视频| 美女亚洲精品| 久久人人爽人人爽| 亚洲国产日韩在线一区模特| 美玉足脚交一区二区三区图片| 欧美一区二区三区免费观看视频 | 久久久久久欧美| 亚洲大片av| 亚洲黄色成人久久久| 欧美激情一区二区三区四区| 日韩一二三在线视频播| 国产精品久久久久9999| 国产精品99一区二区| 日韩一区二区精品| 欧美一区日韩一区| 国产精品wwwwww| 日韩视频精品在线观看| 亚洲美女免费精品视频在线观看| 欧美日本一区二区三区| 亚洲自拍偷拍福利| 欧美在线一级va免费观看| 亚洲国产精品悠悠久久琪琪| 亚洲免费观看高清在线观看 | 一区二区亚洲欧洲国产日韩| 免费成人美女女| 欧美精品自拍| 久久久噜噜噜| 欧美日韩中文字幕精品| 久久精品国产久精国产爱| 免费亚洲视频| 亚洲你懂的在线视频| 久久国产88| 国产精品99久久久久久白浆小说| 久久国产成人| 亚洲一区视频| 男女av一区三区二区色多| 亚洲制服少妇| 欧美激情中文字幕一区二区| 久久高清福利视频| 欧美精品18+| 欧美sm重口味系列视频在线观看| 国产精品美女久久久| 亚洲大胆美女视频| 亚洲一区中文| 欧美在线高清视频| 亚洲在线播放电影| 嫩草影视亚洲| 快she精品国产999| 国产精品一区视频网站| 亚洲精品视频免费在线观看| 一区三区视频| 亚洲欧美成人一区二区三区| 久久久最新网址| 欧美理论电影在线播放| 夜夜嗨一区二区三区| 久久精品久久99精品久久| 亚洲一区欧美| 欧美日韩黄色一区二区| 欧美激情一区二区三级高清视频| 国产日韩一区二区三区| 亚洲午夜电影网| 亚洲在线观看免费| 欧美日韩一区成人| 亚洲精一区二区三区| 亚洲精品日产精品乱码不卡| 久热精品视频在线| 浪潮色综合久久天堂| 国产一区自拍视频| 欧美一区二区视频在线观看| 久久狠狠一本精品综合网| 国产精品视频导航| 亚洲天堂视频在线观看| 亚洲欧美激情诱惑| 欧美色大人视频| 9l视频自拍蝌蚪9l视频成人| 亚洲视频视频在线| 国产欧美韩日| 久久国产精品99国产| 免费观看在线综合| 最近看过的日韩成人| 欧美黄色大片网站| 一本色道久久综合亚洲精品小说| 亚洲欧美成aⅴ人在线观看| 国产精品视频免费| 久久久久久电影| 欧美国产日韩在线观看| 亚洲精品网址在线观看| 欧美日韩成人| 亚洲女女女同性video| 久久久久国产精品一区| 91久久精品国产91久久性色tv| 欧美激情按摩在线| 亚洲一区二区少妇| 久久在线91| 一区二区三区偷拍| 国产婷婷色一区二区三区在线| 久久久噜噜噜| 日韩午夜剧场| 久久综合图片| 亚洲小视频在线| 激情婷婷亚洲| 国产精品ⅴa在线观看h| 久久久亚洲影院你懂的| av不卡在线看| 免费不卡亚洲欧美| 亚洲淫性视频| 在线日韩电影| 欧美日韩亚洲一区二区三区在线| 性xx色xx综合久久久xx| 亚洲国产日韩欧美在线动漫| 欧美一区二区精品久久911| 在线观看日韩精品| 国产精品久久久久久久午夜| 久久久亚洲高清| 亚洲一区二区三区精品在线观看| 欧美a级片网| 久久精品99久久香蕉国产色戒| 日韩视频在线一区二区三区| 国产亚洲欧美激情| 欧美精品乱码久久久久久按摩| 欧美在线免费视屏| 在线视频日韩精品| 亚洲激情二区| 麻豆精品一区二区av白丝在线| 在线综合亚洲欧美在线视频| 亚洲电影免费观看高清完整版在线 | 久热国产精品视频| 亚洲一区二区高清| 亚洲欧洲一区| 亚洲电影av在线| 欧美国产精品久久|