Erlang庫 -- 有意思的庫匯總


抄自這里

 

首先,庫存在的目的大致可分為:
1、提供便利
2、盡可能解決一些痛點

首先,我們先明確一下Erlang編程語言的一些痛點(偽痛點):
1,單進程問題
Erlang虛擬機屬於搶占式調度,搶占式調度有很多好處,但是同樣也存在這弊端。虛擬機在默認情況下分配個每個進程的資源都是相同的,但是若一個進程(gen_server/event/fsm)要為其他許多進程提供服務,這個進程就極有可能成為整個Erlang系統的瓶頸所在。http://www.cnblogs.com/--00/p/4277640.html
2,列表解析效率
在Erlang編程語言中,list/string 是非常常見的一種數據類型,list處理的方式幾乎都是遍歷或者是尾遞歸,在list規模小的情況下,這種方式幾乎不會給大家造成麻煩,但是一旦list的規模很大之后,情況就會變得非常糟糕。如list的“++”操作存在陷阱,erlang:length(List) 存在陷阱,queue:len(Queue)存在陷阱,諸如這種陷阱看起來很細碎,但是如果不好好處理,指不定就容易出現各種讓我們摸不着頭腦的坑。
> 前不久,我們剛剛在一個系統中,優化了一個lists:keydelete/3 的操作,大幅度提升了整個接口處理的速度。
當然,這些問題和erts的設計思路有很大的關系,如:private heap,變量不變 ... 。
3,refc binary
binary的存在在一定程度上緩解了list處理帶來的“低效率”的問題,但是,refc binary(erlang:byte_size(Binary) > 64的binary)的gc又讓人比較蛋疼。Erlang process structure -- refc binary
4,OOM
在一定程度上,這也是單進程問題的一個附屬品。單進程獲得虛擬機資源有限,處理性能不足,導致message mail box 的message不斷擠壓,繼而引發large heap,導致整個Erlang 虛擬機crash。最最典型的就是lager了。
5,Erlang進程CPU消耗度量
一直以來,大家都在社區中試圖尋找度量單個Erlang進程CPU的消耗,但是不管是Erlang現在的API函數,還是社區中的方案,都沒有提供一種行之有效的方案。為什么?我簡單摘抄一段Erlang_IN_Anger中的一段描述吧:
> It is generally difficult to properly analyze the CPU usage of an Erlang node to pin problems to a specific piece of code. With everything concurrent and in a virtual machine, there is no guarantee you will find out if a specific process, driver, your own Erlang code, NIFs you may have installed, or some third-party library is eating up all your processing power.



那么,究竟有哪些庫,能幫我們解決(或者是緩解)這些痛點,能給我們帶來便利?
1、riak_sysmon
github : basho/riak_sysmon · GitHub
對erlang:system_monitor/0,1,2 的封裝,盡快的發現系統中存在的long_gc,large_heap等性能隱患。針對上述痛點中的“refc binary”和“OOM”。
2、recon
github : ferd/recon · GitHub
封裝了erlang:process_info/1,2 函數,並提供了TOPN的feature,recon_alloc封裝了度量虛擬機內部內存的使用量的查詢。
不僅如此,recon提供了一種近似度量Erlang進程CPU消耗的方案,Erlang tool -- recon ,memory leak的檢查。針對上述痛點中的“Erlang進程CPU消耗度量”、“refc binary”,並且提供了種種便利。好用到爆的感覺。
3、eper/redbug
github : massemanet/eper · GitHub
剛開始接觸Erlang時,社區提供的一種代碼調試方案是日志。然,這種方式太不優雅,使用起來非常麻煩。
redbug是對Erlang系統中dbg模塊的封裝,提供了非常安全有效的代碼調試方式。“安全”對生產環境來說,確實太過重要了。
4、pooler/poolboy
github : seth/pooler · GitHub
github : devinus/poolboy · GitHub
池。Erlang單進程效率的問題,非常常見的三種方式,第一種是池,第二種是noblock call,第三種是修改某個進程的資源配置。
在社區中,常見的是第一種方案,而第二種和第三種方案常見於Erlang編程語言編源碼中(rpc模塊,net_kernel模塊)。針對上述痛點中的“單進程問題”。
5、jiffy
github : davisp/jiffy · GitHub
json處理庫,而且是nif的,能夠盡可能保證效果,並且可以支持return_maps已經encode force_utf8,decode 的return_maps能直接返回map 數據類型,非常之方便。(雖然17的map效率不怎么樣,但是18版本做了很大的優化)
6、entop
github : mazenharake/entop · GitHub
有沒有覺得Erlang自帶的etop有些難用?entop提供了非常不錯的可替代方案。
7、erlang-lz4
github : szktty/erlang-lz4 · GitHub
不管是Erlang系統,還是其他系統,所倡導的都是“小消息,大計算”,加之Erlang消息傳遞是值傳遞的方式,對於大的message,稍微做一下壓縮,獲取能取得意想不到的效果。不放試一試,lz4 的算法,請Google 之。

8、sync
github : rustyio/sync · GitHub
on-the-fly recompiling and reloading in Erlang. 大幅度提高工作效率,避免接二連三的重新compile、generate。不過,要注意的是,最好只用在開發環境下。
> 關於熱更,多叨叨兩句:
> 1,在supervisor下增刪 gen_server child 熱更會失敗,目前無解,除非修改supervisor源代碼
> 2,gen_server record 增刪字段,這個可用 “使用proplists字段值”或者是“map字段值”
> 3,gen_server init 函數邏輯無法熱更,解決辦法,重寫code_change 代碼
> 至於常規的邏輯代碼,熱更基本上沒什么問題
9、erlang_term
github : okeuday/erlang_term · GitHub
存了一個Term到ETS表中,難道不應該知道這個Term到底占用了多大的內存空間嗎?要send一個大的message給另一個進程,不度量一點內存占用大小就隨心所欲?恐怕不太好。erlang_term可以作為貼心小工具。Erlang ets -- something about cache continue
10、folsom
github : boundary/folsom · GitHub
提供了多種Metrics 模型,根據自己的應用場景,選擇不同的模型就行。內部主要使用ets:update_counter/3,4,性能效果很有保證。
11、ej
github : seth/ej · GitHub
Helper module for working with Erlang terms representing JSON
試試就知道有沒有意思,好不好玩了。
12、task
github : redink-toys/task · GitHub
遇到過這樣一個有意思的場景:主進程是一個普通進程,有10W量級的列表,我想將其過濾之后,將1/2或者是1/4的列表寫入到ETS表中,然后進行后續的操作。如果我在主進程中做這一些列操作,這個主進程就會被掛住,因為GC(Erlang的GC不會STW,但很有可能會STP)。考慮到ETS表可以在不同的進程之間共享數據,我就可以在主進程中spawn一個進程,這個這個進程去執行過濾、寫入操作,然后這個進程生命周期結束之后,GC是很簡單快速的。
task就是一個spawn、receive的簡單封裝。
13、xref_runner
github : inaka/xref_runner · GitHub
做xref檢查:善待Erlang 代碼 -- Xref 實踐

 

 

謝沒人邀。我只是來安利一下我司和我司兄弟公司開源的一些Erlang庫。現在使用Erlang的公司越來越多,但是大家都在閉門自己造輪子。我們的原則是只要有好輪子一定要好輪子,沒有好輪子自己輪一個好輪子。輪子大法好。

@redink 已經安利了好多在生產環境下非常好用的一些輪子,我再補充一些我司的替代品。

1. inaka/elvis – inaka/elvis · GitHub
Erlang代碼style檢查,支持github webhook,支持Erlang shell內運行檢查。另外inaka/erlang_guidelines提供了對初學者很友好的style guide,對一開始養成良好的代碼格式用處很大。

2. inaka/xref_runner – inaka/xref_runner · GitHub
跑xref的, @redink 已經安利過了

3. inaka/apns4erl – inaka/apns4erl · GitHub
久經考驗的iOS APNS推送服務

4. inaka/shotgun – inaka/shotgun · GitHub
對ninenines/gun的封裝,支持SSE (Server-sent Events) handling

5. inaka/worker_pool – inaka/worker_pool · GitHub
提供比poolboy更輕量的worker pool實現,支持多種worker輪轉策略

其中whisper1, tigertext, inaka是我司和友司的Github,歡迎圍觀,其中inaka是最有料的repo。

再安利一個Erlang Makefile - ninenines/erlang.mk · GitHub,雖然現在和一些項目不兼容而且功能還不完善,但和rebar相比,erlang.mk極大的提高了並發編譯的速度。換了Erlang.mk之后感覺編譯速度快了幾倍。


說個坑。
benoitc/hackney · GitHub是個坑。Hackney是個坑。Hackney是個坑。雖然拼multi-part很好用,但是建議只使用hackney_lib里提供的函數封裝,再使用別的http庫發。Hackney pool有很多不可復現的未知問題。

最后的最后,希望越來越多公司可以開源生產級別的Erlang組件(玩具)。


P.S. 我在公司是個寫PPT的。如果需要內推我司在洛杉磯(Whisper\TigerText - 人需要在美國)、深圳、以及remote(Inaka)的工作請私信我。我司和友司都是業界前列使用Erlang分布式特性的公司。(300+節點,多數據中心)

 

 

 

 

 

 

謝邀。廣告時間到了。 當然是extralib了。 change-code/extralib · GitHub

extralib的本意是一些質量略低於標准庫(kernel和stdlib),但是從功能上講是目前標准庫所欠缺的功能,展示Erlang的潛力。

很多無腦黑認為Erlang缺乏metaprogramming能力,實際上Erlang是目前metaprogramming能力最強的語言。Erlang提供了parse_transform,還有隱藏的更深的core_transform。

更棒的是,現在在extralib里,我們引入了ext_syntax_trans,你可以使用任意語法寫Erlang程序了,同時,還復制粘貼了一遍Erlang的parser,這樣,就可以有scan_transform了。

現在就是來看看這個scan_transform有多大的威力了。在你的Erlang代碼里加入這么兩行,在Erlang里你就可以有和Python一樣的Raw String了。 @牛耿

-compile({parse_transform, ext_syntax_trans}).
-compile({parser, {ext_epp, parse_file, [{passes, [ext_tokenline_pp, ext_rawstring_pp]}, {scan_options, [text]}]}}).


在有這個之前你是這么寫正則表達式的

"\\r\\n\""


現在你可以這么寫了

r"\r\n\""


還不快來用Erlang


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM