ejabberdเป็นหนึ่งในแอปพลิเคชัน erlang ที่เป็นที่รู้จักมากที่สุดและเป็นแอปที่ฉันเรียนรู้ erlang ด้วย
ฉันคิดว่ามันเป็นหนึ่งในโครงการที่น่าสนใจที่สุดสำหรับการเรียนรู้ภาษา erlang เพราะมันเป็นการสร้างความแข็งแกร่งของ erlang (อย่างไรก็ตามบางคนอาจโต้แย้งว่าไม่ใช่ OTP แต่ไม่ต้องกังวลว่ายังมีรหัสที่ดีอยู่ภายใน ... )
ทำไม
เซิร์ฟเวอร์ XMPP (เช่น ejabberd) สามารถมองเห็นได้ในฐานะเราเตอร์ระดับสูงการกำหนดเส้นทางข้อความระหว่างผู้ใช้ปลายทาง แน่นอนว่ามีคุณสมบัติอื่น ๆ แต่นี่เป็นสิ่งสำคัญที่สุดของเซิร์ฟเวอร์การส่งข้อความทันที มีการกำหนดเส้นทางข้อความจำนวนมากพร้อมกันและจัดการการเชื่อมต่อ TCP / IP จำนวนมาก
ดังนั้นเราจึงมี 2 คุณสมบัติ:
- จัดการการเชื่อมต่อมากมาย
- ข้อความเส้นทางให้บางแง่มุมของข้อความ
นี่คือตัวอย่างที่ erlang ส่องแสง
จัดการการเชื่อมต่อมากมาย
มันง่ายมากที่จะสร้างเซิร์ฟเวอร์ TCP / IP แบบ non-blocking ที่ปรับขนาดได้ด้วย erlang ในความเป็นจริงมันถูกออกแบบมาเพื่อแก้ปัญหานี้ และเนื่องจากมันสามารถวางไข่กระบวนการนับแสน (และไม่ใช่เธรดมันเป็นวิธีที่ไม่มีส่วนแบ่งซึ่งง่ายต่อการออกแบบ) ejabberd ได้รับการออกแบบเป็นชุดของกระบวนการ erlang (ซึ่งสามารถแจกจ่ายผ่านเซิร์ฟเวอร์หลายเครื่อง):
- กระบวนการเชื่อมต่อลูกค้า
- กระบวนการเราเตอร์
- กระบวนการแชท
- เซิร์ฟเวอร์ต่อกระบวนการของเซิร์ฟเวอร์
พวกเขาทั้งหมดแลกเปลี่ยนข้อความ
ข้อความเส้นทางให้บางแง่มุมของข้อความ
อีกคุณสมบัติที่น่ารักมาก Erlang คือจับคู่รูปแบบ มันถูกใช้ตลอดทั้งภาษา
ตัวอย่างเช่นในต่อไปนี้:
access(moderator, _Config)-> rw;
access(participant, _Config)-> rw;
access(visitor, #config{type="public"})-> r;
access(visitor, #config{type="public_rw"})-> rw;
access(_User,_Config)-> none.
นั่นคือaccess
ฟังก์ชั่น5 เวอร์ชันที่แตกต่างกัน Erlang จะเลือกเวอร์ชันที่เหมาะสมที่สุดตามข้อโต้แย้งที่ได้รับ ( Config
เป็นโครงสร้างประเภท#config
ที่มีtype
แอตทริบิวต์)
ซึ่งหมายความว่าง่ายและชัดเจนกว่าการผูกมัดif/else
หรือswitch/case
สร้างกฎเกณฑ์ทางธุรกิจ
เพื่อสรุป
การเขียนเซิร์ฟเวอร์ที่ปรับขนาดได้นั่นคือจุดทั้งหมดของ erlang ทุกอย่างถูกออกแบบมาเพื่อทำให้เป็นเรื่องง่าย ในสองคุณสมบัติก่อนหน้านี้ฉันต้องการเพิ่ม:
- อัพเกรดรหัสร้อน
mnesia
ฐานข้อมูลเชิงสัมพันธ์แบบกระจาย (รวมอยู่ในการกระจายฐาน)
mochiweb
ซึ่งเซิร์ฟเวอร์ http erlang ส่วนใหญ่จะถูกสร้างขึ้น
- รองรับไบนารี่ (การถอดรหัสและการเข้ารหัสโปรโตคอลไบนารีง่ายเหมือนที่เคย)
- เป็นชุมชนที่ดีกับดีโครงการโอเพนซอร์ส (
ejabberd
, couchdb
แต่ยังwebmachine
, riak
และฆ่าของห้องสมุดง่ายมากที่จะฝังก)
LOCs น้อยลง
นอกจากนี้ยังมีบทความนี้จาก Richard Jones เขาเขียนแอปพลิเคชันใหม่จาก C ++ ถึง erlang: ลดจำนวนบรรทัดลง 75% ใน erlang