การใช้ Elixir Phoenix ในโปรเจกต์ SaaS เชิงพาณิชย์
Linkly เขียนด้วย Elixir
ฉันต้องการได้รับประสบการณ์กับ Erlang ecosystem เสมอ และ Elixir เป็นวิธีที่ง่าย
ฉันจะไม่ครอบคลุมถึงประโยชน์ของ BEAM หรือ Erlang โดยตรงที่นี่ เนื่องจากมีการเขียนเกี่ยวกับเรื่องนี้แล้วในที่อื่น แต่ฉันจะมุ่งเน้นไปที่ด้านปฏิบัติของการใช้ Elixir Phoenix สำหรับโปรเจกต์จริง
ฉันจะสมมติว่าคุณรู้ว่า Ruby on Rails คืออะไร เนื่องจาก Phoenix ซึ่งเป็น web framework ของ Elixir ได้รับแรงบันดาลใจอย่างมากจาก Rails
การเขียนโปรแกรมใน Elixir Phoenix จริง ๆ
การเขียนโปรแกรมใน Elixir เป็นประสบการณ์ที่ยอดเยี่ยม
มันทำตามหลักการที่คล้ายกับ Rails รวมถึง MVC และดูคล้ายกันด้วย
ต่างจาก Rails โค้ดจะถูกรวบรวม (compile) ก่อนที่จะรัน ซึ่งเป็นขั้นตอนที่มีประโยชน์เนื่องจากช่วยให้คุณสามารถจับข้อผิดพลาดที่อาจจะไม่พบได้
Models ใน Phoenix ถูกจัดกลุ่มเป็น 'Contexts' ซึ่งเป็นระดับของนามธรรม (abstraction) เพิ่มเติม มีจุดประสงค์เพื่อสร้างการแยกที่ชัดเจนระหว่างส่วนต่าง ๆ ของแอปพลิเคชัน เช่น Users และ Products แต่ละ context สามารถมี models ได้จำนวนเท่าใดก็ได้
ประสิทธิภาพ
มีการพูดถึงประสิทธิภาพในบล็อกอื่น ๆ มากมาย ดังนั้นฉันจะครอบคลุมด้านปฏิบัติที่นี่
สำหรับ web framework ที่มี feature ครบถ้วน ประสิทธิภาพนั้นชัดเจนว่าเร็วกว่า Rails มากและต้องการฮาร์ดแวร์น้อยกว่าในการรัน
เวลา 'to boot' ของการรัน mix phx.server กับ rails server นั้นเร็วกว่า แม้แต่เมื่อพัฒนาบนแล็ปท็อป หน้าเว็บจะโหลดเร็วขึ้นอย่างเห็นได้ชัดด้วย Phoenix
ความพร้อมใช้งานของ Packages สำหรับ Elixir Phoenix กับ Rails
ในเบื้องต้น ดูเหมือนว่ามีความแตกต่างที่นี่ Rails มี gems หลายพันตัวเทียบกับ Elixir's Hex repository
ตามที่เกิดขึ้น เกือบทุกอย่างที่คุณจะใช้จริงมีอยู่ในระบบ Elixir Hex package - JSON parsers, HTTP clients, เครื่องมือสำหรับการจัดรูปแบบและการ parse Markdown - มันทั้งหมดอยู่ที่นี่ และคุณภาพของโมดูลนั้นยอดเยี่ยม
ใน Rails มี gems มากมายแต่คุณจะไม่รวมมันในโปรเจกต์จริง เนื่องจากสถานะที่ไม่ได้รักษาหรือความเสี่ยงที่เกี่ยวข้องกับการสร้างการพึ่งพาภายนอกมากเกินไปในแอปพลิเคชันของคุณ
แพลตฟอร์มเช่น Stripe และ Recurly รักษา gems ของ Rails เป็นของตัวเองสำหรับการโต้ตอบกับ APIs ของพวกเขา นี่สามารถเป็นประโยชน์ได้ และโดยทั่วไปแล้วขาดการสนับสนุน Elixir
อย่างไรก็ตาม ฉันพบว่าการใช้ Elixir's Tesla package สำหรับการโต้ตอบกับ HTTP endpoints ของบริการเป็นเรื่องง่าย และในท้ายที่สุดก็ชอบการทำงานในลักษณะนี้มากกว่าการใช้ pre-packaged gems เนื่องจากมันเบากว่า และช่วยให้คุณเข้าใจสิ่งที่กำลังเกิดขึ้น
Database Abstraction - Ecto และ ActiveRecord
Ecto ไม่ครบครัน (feature-complete) เหมือน ActiveRecord
มันไม่ได้ตั้งใจที่จะเป็นเช่นนั้น
Ecto เป็น simple database wrapper ที่แมป database queries ไปยัง Elixir objects
ในตอนแรก ฉันพบว่ามันน่ารำคาญที่มันไม่ทำงานเหมือน ActiveRecord
อย่างไรก็ตาม Ecto ช่วยให้คุณโต้ตอบกับ database ด้วยวิธีที่ตรงไปตรงมามาก และจริง ๆ แล้วทำให้การเขียนโปรแกรมเว็บแอปพลิเคชันง่ายขึ้นมาก
ด้วย ActiveRecord เมื่อคุณเริ่มสร้าง complex queries มันใช้เวลานาน ในการหาวิธี ActiveRecord มากกว่าการเขียน query เป็น SQL
หลังจากใช้ทั้งสองอย่าง ข้อสรุปของฉันคือการใช้ lightweight database wrapper เช่น Ecto นั้นง่ายกว่าการใช้ heavyweight abstraction เช่น ActiveRecord
มันให้ความปลอดภัยของการใช้ database wrapper โดยไม่มีปวดหัวและน้ำหนักของ abstraction ที่ 'too clever'
ทั้งสองมี migration และ rollback functionality
Database เริ่มต้นสำหรับโปรเจกต์ Phoenix คือ Postgres
สำหรับผู้ที่ใช้ NoSQL databases Ecto ทำงานกับ Mongo
ยิ่งไปกว่านั้น Ecto ทำงานกับ Postgres' NoSQL features ช่วยให้คุณสามารถบันทึก (save) และ query JSON โดยไม่ต้อง Mongo
User Authentication
นี่คือที่ที่ Elixir Phoenix ขาดความสามารถ
Rails มี Devise module Phoenix มี Coherence อย่างไรก็ตามปัจจุบันมันไม่ได้รับการดูแล
หากคุณต้องการใช้ basic username & password login คุณจะต้องสร้างทุกขั้นตอน ซึ่งรวมถึงการแฮช (hash) รหัสผ่าน password reset logic 'remember-me' settings ฯลฯ
นี่เป็นเรื่องน่าเบื่อและมีความเสี่ยงด้านความปลอดภัยอย่างมาก
ฉันเลือกใช้ Auth0 ซึ่งทำงานกับ Phoenix ได้ดี บางทีนี่อาจเป็นวิธีแก้ปัญหาที่ดีกว่า แต่มันคงดีถ้ามีตัวเลือก
การ Deploy และ Hosting
โฮสต์หลักของแอป Phoenix คือ Gigalixir บริษัท American ขนาดเล็กที่ดำเนินการโดย Elixir enthusiasts
Gigalixir ใช้ Google Cloud ดังนั้นโครงสร้างพื้นฐานที่อยู่ด้านล่างจึงมีความสมบูรณ์
Gigalixir's buildpack ทำให้การ deploy เป็นเรื่องง่าย และสนับสนุน Elixir's clever deployment strategies ทั้งหมด (distillery, mix)
มันมีราคาแพงกว่า 'roll-your-own' แต่ต้นทุนส่วนใหญ่ถูกห่อหุ้มไว้ในการโฮสต์ Postgres database
Elixir Phoenix นั้นเบาจนสามารถรันได้บน small docker pods และยังสามารถจัดการขอ (requests) ได้จำนวนมากมายเหลือเฟือ
แม้จะมีการเพิ่มราคา แต่มันคุ้มค่าอย่างแน่นอนที่จะแก้ปัญหาความวุ่นวาย
ฉันจะเพิ่มเติมว่า บริการสนับสนุนของพวกเขานั้นยอดเยี่ยม
ความพร้อมใช้งานของโปรแกรมเมอร์
มี Elixir programmers น้อยกว่ามากออกไป
Elixir คือ "programmer's language" - ภาษาที่คนมาเรียนรู้หลังจากที่เรียนรู้อย่างอื่น
พูดอีกอย่างหนึ่ง ผู้ที่ทำ Elixir นั้นโดยทั่วไปแล้วเป็นโปรแกรมเมอร์ที่ดีกว่า บางทีอาจเป็นเพราะการเลือกที่สำนึกสติของการหยิบเอาภาษาที่ดีกว่า
มันทำให้ฉันนึกถึง early days ของ Rails ซึ่งดูเหมือนว่าเฉพาะ "rockstars" เท่านั้นที่จะใช้มัน (เทียบกับ PHP)
โปรแกรมเมอร์ Rails ที่ดีหลาย ๆ คนจะไม่มีปัญหาในการหยิบ Elixir Phoenix และจะได้รับการรันได้ภายในไม่กี่วัน
ฉันจะใช้ Elixir Phoenix อีกครั้งหรือไม่
อย่างแน่นอน
ฉันได้ทำงานกับภาษาต่าง ๆ มากมาย และ Elixir เป็นภาษาที่ง่ายที่สุดและมีประสิทธิภาพที่สุดที่ฉันเคยทำงานด้วย
ฉันหวังว่าจะได้เขียน Elixir
รับลิงก์สั้น 100 รายการและติดตามจำนวนคลิก 500 ครั้งต่อเดือนได้ฟรี