นี่เป็นคำถามที่เปิดกว้างมาก แต่ฉันจะพยายามอธิบายว่าเหตุใด Elixir / Erlang จึงอาจเป็นแพลตฟอร์มที่ดีที่สุดสำหรับการพัฒนาระบบแบบกระจาย (ไม่ว่าคุณจะทำงานกับไมโครเซอร์วิสก็ตาม)
ก่อนอื่นเรามาเริ่มต้นด้วยความเป็นมา Erlang VM และไลบรารีมาตรฐานได้รับการออกแบบล่วงหน้าสำหรับการสร้างระบบแบบกระจายและสิ่งนี้จะปรากฏขึ้นจริงๆ เท่าที่ฉันรู้มันเป็นรันไทม์และ VM เดียวที่ใช้กันอย่างแพร่หลายในการผลิตที่ออกแบบไว้ล่วงหน้าสำหรับกรณีการใช้งานนี้
การใช้งาน
ตัวอย่างเช่นคุณได้บอกใบ้ "แอปพลิเคชัน" ไว้แล้ว ใน Erlang / Elixir รหัสจะถูกบรรจุไว้ในแอปพลิเคชันซึ่ง:
- เริ่มต้นและหยุดเป็นหน่วย การเริ่มต้นและการหยุดระบบของคุณเป็นเรื่องของการเริ่มต้นแอปพลิเคชันทั้งหมดในนั้น
- จัดเตรียมโครงสร้างไดเร็กทอรีแบบรวมและ API การกำหนดค่า (ซึ่งไม่ใช่ XML!) หากคุณเคยทำงานและกำหนดค่าแอปพลิเคชัน OTP แล้วคุณจะรู้วิธีทำงานกับแอปพลิเคชันอื่น ๆ
- มีโครงสร้างการกำกับดูแลแอปพลิเคชันของคุณโดยมีกระบวนการทั้งหมด (โดยกระบวนการฉันหมายถึง "กระบวนการ VM" ซึ่งเป็นเธรดการคำนวณที่มีน้ำหนักเบา) และสถานะของกระบวนการ
ผลกระทบของการออกแบบนี้มีมาก หมายความว่านักพัฒนา Elixir เมื่อเขียนแอปพลิเคชันมีแนวทางที่ชัดเจนยิ่งขึ้นในการ:
- รหัสเริ่มต้นและหยุดทำงานอย่างไร
- กระบวนการที่เป็นส่วนหนึ่งของแอปพลิเคชันคืออะไรและสถานะของแอปพลิเคชันคืออะไร
- กระบวนการเหล่านั้นจะตอบสนองและได้รับผลกระทบอย่างไรในกรณีที่เกิดข้อขัดข้องหรือเมื่อมีสิ่งผิดปกติเกิดขึ้น
ไม่เพียงแค่นั้นเครื่องมือเกี่ยวกับนามธรรมนี้ยังยอดเยี่ยม ถ้าคุณมียาอายุวัฒนะที่ติดตั้งให้เปิดขึ้น "Iex" :observer.start()
และประเภท: นอกจากการแสดงข้อมูลและกราฟเกี่ยวกับระบบถ่ายทอดสดของคุณแล้วคุณยังสามารถฆ่ากระบวนการแบบสุ่มดูการใช้หน่วยความจำสถานะและอื่น ๆ นี่คือตัวอย่างของการเรียกใช้สิ่งนี้ในแอปพลิเคชัน Phoenix:
ความแตกต่างที่นี่คือการประยุกต์ใช้งานและกระบวนการให้คุณนามธรรมเหตุผลเกี่ยวกับรหัสของคุณในการผลิต หลายภาษามีแพ็กเกจอ็อบเจ็กต์และโมดูลสำหรับการจัดระเบียบโค้ดโดยไม่มีการสะท้อนกลับในระบบรันไทม์ หากคุณมีแอตทริบิวต์คลาสหรืออ็อบเจ็กต์เดี่ยวคุณจะให้เหตุผลเกี่ยวกับเอนทิตีที่สามารถจัดการได้อย่างไร หากคุณมีหน่วยความจำรั่วหรือคอขวดคุณจะพบหน่วยงานที่รับผิดชอบได้อย่างไร
หากคุณถามใครก็ตามที่ใช้ระบบแบบกระจายนั่นคือความเข้าใจที่พวกเขาต้องการและด้วย Erlang / Elixir คุณมีสิ่งนั้นเป็นส่วนประกอบสำคัญ
การสื่อสาร
ทั้งหมดนี้เป็นเพียงจุดเริ่มต้นจริงๆ เมื่อสร้างระบบแบบกระจายคุณต้องเลือกโปรโตคอลการสื่อสารและซีเรียลไลเซอร์ข้อมูล ผู้คนจำนวนมากเลือกใช้ HTTP และ JSON ซึ่งเมื่อคุณนึกถึงมันเป็นการผสมผสานที่ละเอียดและมีราคาแพงสำหรับการเรียกใช้ RPC จริงๆ
ด้วย Erlang / Elixir คุณมีโปรโตคอลการสื่อสารและกลไกการทำให้เป็นอนุกรมอยู่แล้ว หากคุณต้องการให้เครื่องจักรสองเครื่องสื่อสารกันคุณจะต้องตั้งชื่อให้พวกเขาเท่านั้นตรวจสอบให้แน่ใจว่ามีความลับเดียวกันเท่านี้ก็เสร็จเรียบร้อย
Jamie พูดคุยเกี่ยวกับเรื่องนี้ที่ Erlang Factory 2015 และวิธีที่พวกเขาสามารถใช้ประโยชน์จากสิ่งนี้เพื่อสร้างแพลตฟอร์มเกม: https://www.youtube.com/watch?v=_i6n-eWiVn4
หากคุณต้องการใช้ HTTP และ JSON ก็ใช้ได้เช่นกันและไลบรารีอย่าง Plug และ frameworks เช่น Phoenix ก็รับประกันว่าคุณจะทำงานได้อย่างมีประสิทธิภาพเช่นกัน
ไมโครเซอร์วิส
จนถึงตอนนี้ฉันยังไม่ได้พูดถึงไมโครเซอร์วิส นั่นเป็นเพราะถึงจุดนี้พวกเขาไม่สำคัญจริงๆ คุณกำลังออกแบบระบบและโหนดของคุณเกี่ยวกับกระบวนการเล็ก ๆ ที่แยกได้อยู่แล้ว เรียกพวกเขาว่าบริการนาโนหากคุณต้องการ!
ไม่เพียงแค่นั้นยังรวมอยู่ในแอปพลิเคชันซึ่งจัดกลุ่มเป็นเอนทิตีที่สามารถเริ่มต้นและหยุดเป็นหน่วยได้ หากคุณมีแอปพลิเคชัน A, B และ C จากนั้นคุณต้องการปรับใช้เป็น [A, B] + [C] หรือ [A] + [B] + [C] คุณจะมีปัญหาเล็กน้อยในการดำเนินการดังกล่าวเนื่องจาก กับการออกแบบโดยธรรมชาติของพวกเขา หรือที่ดีไปกว่านั้นถ้าคุณต้องการหลีกเลี่ยงการเพิ่มความซับซ้อนของการปรับใช้ไมโครเซอร์วิสในระบบของคุณล่วงหน้าคุณก็สามารถปรับใช้งานทั้งหมดในโหนดเดียวกันได้
และในตอนท้ายของวันถ้าคุณกำลังทำงานทั้งหมดนี้ใช้ Erlang กระจายพิธีสารคุณสามารถเรียกพวกเขาในโหนดที่แตกต่างกันและพวกเขาจะสามารถเข้าถึงอื่น ๆ ตราบเท่าที่คุณอ้างถึงพวกเขาโดยการแทน{:node@network, :name}
:name
ฉันสามารถไปได้ไกลกว่านี้ แต่ฉันหวังว่าฉันจะทำให้คุณมั่นใจในตอนนี้ :)