Elixir / Erlang เข้ากับวิธีการของไมโครเซอร์วิสได้ที่ไหน? [ปิด]


109

เมื่อเร็ว ๆ นี้ฉันได้ทำการทดลองกับนักเทียบท่าเพื่อปรับใช้ไมโครเซอร์วิสที่ทำงานร่วมกันได้หลายตัว ฉันเห็นประโยชน์มากมายที่ไมโครเซอร์วิสมอบให้และตอนนี้มีชุดเครื่องมือที่ดีสำหรับการจัดการแล้วฉันคิดว่ามันไม่ยากเลยที่จะกระโดดเข้าไปในรถบรรทุกขนาดเล็ก

แต่ฉันได้ทดลองกับ Elixir ด้วยและฉันก็ค่อนข้างชอบประโยชน์ที่ได้รับจากตัวมันเอง เนื่องจากมันสนับสนุนให้บรรจุรหัสของคุณลงในแอปพลิเคชันที่แยกตัวออกมาหลายตัวและรองรับการอัปเกรดรหัสร้อนคุณจะผสมนักเทียบท่ากับยาอมฤต (หรือ erlang สำหรับเรื่องนั้นอย่างไร)

ตัวอย่างเช่นถ้าฉันต้องการใช้นักเทียบท่าเพราะมันมีความเท่าเทียมกันของ dev-prod ยาอมจะเข้ากันได้อย่างไร? เนื่องจากคอนเทนเนอร์นักเทียบท่าไม่เปลี่ยนรูปฉันจึงสูญเสียความสามารถในการอัปเกรดรหัสด่วนใช่ไหม? สิ่งที่เกี่ยวกับการปรับใช้สีน้ำเงิน / เขียวหรือการเผยแพร่ Canary?

ฉันหมายความว่าฉันสามารถเขียน microservices ด้วย Elixir และใช้งานได้ราวกับว่ามันถูกเขียนในภาษาอื่น ๆ การพูดหลายภาษาก็เป็นประโยชน์อย่างหนึ่งของ microservices อยู่ดี แต่ฉันก็ไม่ได้รับประโยชน์เต็มที่จากการใช้แพลตฟอร์ม OTP เดาว่าแอปพลิเคชัน Erlang ที่ทำงานร่วมกันอย่างแท้จริงเป็นวิธีที่ดีที่สุดในการใช้คิวกลางเพื่อสื่อสารระหว่างไมโครเซอร์วิสที่เขียนด้วยภาษา (หรือไม่) ที่แตกต่างกัน


7
ฉันเห็นว่าการโหวตลดลงเป็นเพราะคำถาม "ไม่ได้แสดงถึงความพยายามในการวิจัยใด ๆ " เป็นเรื่องน่าเศร้าเพราะมันไม่เป็นความจริงแน่นอนว่าปัญหาอาจเกิดจากคำถามเอง แต่ฉันไม่สามารถถูกกล่าวหาว่าไม่ค้นคว้าเพราะเมื่อเร็ว ๆ นี้มันเป็นสิ่งเดียวที่ฉันทำ มาก.
Papipo

1
คำถามนี้กว้างเกินไป - คำถามเกี่ยวกับ stackoverflow หมายถึงปัญหาเฉพาะ
Paweł Obrok

4
ฉันควรย้ายไปยังไซต์ stackexchange อื่นหรือไม่ เนื่องจาก quesiton เป็น IMO ที่ถูกต้อง
Papipo

2
ฉันคิดว่ามันเป็นคำถามที่น่าสนใจ แต่อาจเป็นของโปรแกรมเมอร์ stackexchange? ที่ถูกกล่าวว่าไม่ปิดโหวต
George Mauer

1
มันยอดเยี่ยมและสร้างมาเพื่องานโดยสิ้นเชิง
bryan hunt

คำตอบ:


139

นี่เป็นคำถามที่เปิดกว้างมาก แต่ฉันจะพยายามอธิบายว่าเหตุใด Elixir / Erlang จึงอาจเป็นแพลตฟอร์มที่ดีที่สุดสำหรับการพัฒนาระบบแบบกระจาย (ไม่ว่าคุณจะทำงานกับไมโครเซอร์วิสก็ตาม)

ก่อนอื่นเรามาเริ่มต้นด้วยความเป็นมา Erlang VM และไลบรารีมาตรฐานได้รับการออกแบบล่วงหน้าสำหรับการสร้างระบบแบบกระจายและสิ่งนี้จะปรากฏขึ้นจริงๆ เท่าที่ฉันรู้มันเป็นรันไทม์และ VM เดียวที่ใช้กันอย่างแพร่หลายในการผลิตที่ออกแบบไว้ล่วงหน้าสำหรับกรณีการใช้งานนี้

การใช้งาน

ตัวอย่างเช่นคุณได้บอกใบ้ "แอปพลิเคชัน" ไว้แล้ว ใน Erlang / Elixir รหัสจะถูกบรรจุไว้ในแอปพลิเคชันซึ่ง:

  1. เริ่มต้นและหยุดเป็นหน่วย การเริ่มต้นและการหยุดระบบของคุณเป็นเรื่องของการเริ่มต้นแอปพลิเคชันทั้งหมดในนั้น
  2. จัดเตรียมโครงสร้างไดเร็กทอรีแบบรวมและ API การกำหนดค่า (ซึ่งไม่ใช่ XML!) หากคุณเคยทำงานและกำหนดค่าแอปพลิเคชัน OTP แล้วคุณจะรู้วิธีทำงานกับแอปพลิเคชันอื่น ๆ
  3. มีโครงสร้างการกำกับดูแลแอปพลิเคชันของคุณโดยมีกระบวนการทั้งหมด (โดยกระบวนการฉันหมายถึง "กระบวนการ VM" ซึ่งเป็นเธรดการคำนวณที่มีน้ำหนักเบา) และสถานะของกระบวนการ

ผลกระทบของการออกแบบนี้มีมาก หมายความว่านักพัฒนา Elixir เมื่อเขียนแอปพลิเคชันมีแนวทางที่ชัดเจนยิ่งขึ้นในการ:

  1. รหัสเริ่มต้นและหยุดทำงานอย่างไร
  2. กระบวนการที่เป็นส่วนหนึ่งของแอปพลิเคชันคืออะไรและสถานะของแอปพลิเคชันคืออะไร
  3. กระบวนการเหล่านั้นจะตอบสนองและได้รับผลกระทบอย่างไรในกรณีที่เกิดข้อขัดข้องหรือเมื่อมีสิ่งผิดปกติเกิดขึ้น

ไม่เพียงแค่นั้นเครื่องมือเกี่ยวกับนามธรรมนี้ยังยอดเยี่ยม ถ้าคุณมียาอายุวัฒนะที่ติดตั้งให้เปิดขึ้น "Iex" :observer.start()และประเภท: นอกจากการแสดงข้อมูลและกราฟเกี่ยวกับระบบถ่ายทอดสดของคุณแล้วคุณยังสามารถฆ่ากระบวนการแบบสุ่มดูการใช้หน่วยความจำสถานะและอื่น ๆ นี่คือตัวอย่างของการเรียกใช้สิ่งนี้ในแอปพลิเคชัน Phoenix:

นักสังเกตการณ์ที่ทำงานด้วยแอปพลิเคชัน 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

ฉันสามารถไปได้ไกลกว่านี้ แต่ฉันหวังว่าฉันจะทำให้คุณมั่นใจในตอนนี้ :)


อันที่จริงฉันชอบ Elixir และ OTP มากคำถามคือเพิ่มเติมเกี่ยวกับวิธีรับประโยชน์บางอย่างของ microservices (เช่น dev-prod parity, canary release ฯลฯ ) ในขณะที่ใช้ Elixir
Papipo

ฉันมีย่อหน้าเกี่ยวกับ Docker แต่มันหายไป :) สาระสำคัญคือคุณใช้สำหรับการปรับใช้โหนดเพื่อให้คุณเลือกว่าแอปพลิเคชันใดเหมาะสมต่อโหนด การปรับใช้สีน้ำเงิน / เขียวสามารถทำได้อย่างแน่นอน แต่ขึ้นอยู่กับโปรโตคอลประเภทของสถานะและปัจจัยอื่น ๆ
José Valim

5
คำพูดที่ฉันพูดถึงครอบคลุมเลเยอร์การกำหนดเส้นทางที่สามารถใช้เป็นสีน้ำเงิน / เขียวหรือนกขมิ้น อีกครั้งขึ้นอยู่กับโปรโตคอลที่เลือก แต่คุณสามารถไปจากรายการทั่วโลกใน Erlang แบบกระจายบางสิ่งบางอย่างที่ใช้กงสุลหรือ haproxy สำหรับสิ่งที่ใช้ HTTP
José Valim

วิธีการค้นหาบริการมีความหมาย ฉันเดาว่าฉันมักจะคิดถึงเงื่อนไขการจัดสรรภาระงาน
Papipo

1
สิ่งที่เป็นประโยชน์อื่น ๆ ของบริการขนาดเล็กเช่นการเลือกภาษาที่ดีที่สุดสำหรับงานเฉพาะ ฉันชอบน้ำอมฤต แต่มันไม่ใช่ภาษาที่ดีที่สุดสำหรับทุกงาน สิ่งที่ฉันหมายถึงคืออาจต้องใช้บริการไมโครเฉพาะเพื่อใช้ภาษาอื่นแทนยาอายุวัฒนะ ควรจะยังคงเป็นไปตามสถาปัตยกรรมไมโครเซอร์วิสแบบเดิมหรือไม่?
Jeancarlo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.