ในโลกของการสื่อสารระหว่างกระบวนการ (inter-process communication) ไลบรารี ซี ใหม่ที่มีชื่อว่า vali ได้ปรากฏตัวขึ้นเพื่อนำโปรโตคอล Varlink ไปใช้ ก่อให้เกิดการอภิปรายอย่างคึกคักในหมู่ผู้พัฒนาว่าความเรียบง่ายสำคัญกว่าฟังก์ชันการทำงานในระบบ RPC หรือไม่ ชุมชนกำลังถกเถียงกันอย่างแข็งขันเกี่ยวกับการออกแบบของ Varlink และการเปรียบเทียบกับทางเลือกที่มีอยู่แล้วอย่าง gRPC และ D-Bus
การอภิปรายเรื่องความเรียบง่ายเทียบกับคุณสมบัติ
ชุมชนเทคโนโลยีดูเหมือนจะแตกออกเป็นสองฝั่งในเรื่องแนวทางที่เรียบง่ายสุดขั้วของ Varlink ผู้พัฒนาบางส่วนชื่นชมการออกแบบที่ตรงไปตรงมาโดยใช้ JSON ผ่าน Unix sockets ในขณะที่บางส่วนตั้งคำถามว่ามันเรียบง่ายเกินไปสำหรับการใช้งานจริงหรือไม่ ผู้แสดงความคิดเห็นหนึ่งรายระบุว่าเมื่อเทียบกับระบบที่ซับซ้อนมากขึ้นเช่น gRPC หรือ Cap'n'Proto แล้ว Varlink สละคุณสมบัติบางอย่างเพื่อความเรียบง่าย การที่โปรโตคอลนี้ไม่มีประเภทข้อมูลจำนวนเต็มแบบไม่มีเครื่องหมาย (unsigned) หรือแบบระบุขนาด (sized) ก่อให้เกิดความกังวลในหมู่ผู้พัฒนาที่ทำงานกับประเภทข้อมูลตัวเลขที่ต้องการความแม่นยำ
มันคือ JSON ที่เพิ่มแนวคิดง่ายๆ เกี่ยวกับ RPC เข้าไป โดยแนวคิดหลักดูเหมือนจะเป็นการที่มนุษย์อ่านเข้าใจได้ แต่เมื่อเทียบกับ gRPC หรือ CapnProto แล้ว คุณเสียการตรวจสอบประเภทในเวลาคอมไพล์ (compile-time type checking) ไป
ความรู้สึกนี้สะท้อนถึงความกังวลทั่วไปที่ว่าหากไม่มีเครื่องมือที่เหมาะสม ผู้พัฒนาอาจพบข้อผิดพลาดในขณะรันไทม์ (runtime errors) ซึ่งควรจะถูกตรวจจับได้ในช่วงการคอมไพล์ในระบบที่ซับซ้อนกว่า
ข้อจำกัดที่ชุมชนสังเกต:
- ไม่มีชนิดข้อมูลจำนวนเต็มแบบไม่มีเครื่องหมาย
- ไม่มีชนิดข้อมูลจำนวนเต็มที่กำหนดขนาด
- เข้ากันไม่ได้กับ JSON-RPC แม้จะมีโครงสร้างคล้ายกัน
- อาจเกิดข้อผิดพลาดเกี่ยวกับชนิดข้อมูลขณะรันไทม์หากไม่มีการสร้างโค้ด
การสร้างรหัส (Code Generation) เป็นโซลูชันความปลอดภัยของประเภท
ไลบรารี vali แก้ไขปัญหาความกังวลเรื่องความปลอดภัยของประเภทผ่านการสร้างรหัสอย่างครอบคลุมจากไฟล์นิยามอินเทอร์เฟซ (interface definition files) แนวทางนี้จะสร้างรหัสไคลเอ็นต์และเซิร์ฟเวอร์ที่จัดการการเข้ารหัสและถอดรหัส JSON โดยอัตโนมัติ ซึ่งให้การตรวจสอบประเภทในเวลาคอมไพล์ที่สมาชิกในชุมชนบางส่วนรู้สึกว่ามันขาดหายไป รหัสที่สร้างขึ้นจะรวมโครงสร้างแยกสำหรับพารามิเตอร์อินพุตและเอาต์พุต เพื่อให้แน่ใจว่ามีการแยกข้อมูลระหว่างคำขอและการตอบกลับอย่างชัดเจน การออกแบบนี้ยังคงความเข้ากันได้ย้อนหลัง (backward compatibility) เมื่ออินเทอร์เฟซมีการพัฒนาตลอดเวลา เนื่องจากสามารถเพิ่มฟิลด์ใหม่ที่เป็นตัวเลือกได้โดยไม่ทำลายการนำไปใช้ที่มีอยู่
โฟกัสที่การสื่อสารระหว่างกระบวนการในเครื่อง (Local IPC)
แตกต่างจากระบบ RPC ที่มุ่งเน้นเครือข่าย Varlink มุ่งเป้าไปที่การสื่อสารระหว่างกระบวนการในเครื่องโดยเฉพาะ โดยวางตำแหน่งตัวเองเป็นทางเลือกที่เรียบง่ายกว่าสำหรับ D-Bus แทนที่จะแข่งขันโดยตรงกับโซลูชันที่ทำงานในระดับอินเทอร์เน็ต โฟกัสนี้ช่วยอธิบายการตัดสินใจออกแบบที่อาจดูเหมือนมีข้อจำกัดสำหรับแอปพลิเคชันบนเครือข่าย แต่ทำงานได้ดีสำหรับบริการในเครื่อง การอภิปรายในชุมชนเปิดเผยว่าผู้พัฒนาหลายรายได้นำแนวคิดที่คล้ายกันไปใช้ในภาษาอื่นแล้ว รวมถึง C++/Qt และ C++ พร้อม asio ซึ่งบ่งชี้ถึงความสนใจในวงกว้างต่อแนวทางของ Varlink ในการทำ RPC ในเครื่อง
ลักษณะสำคัญของโปรโตคอล Varlink:
- ใช้ JSON ผ่าน Unix sockets สำหรับ IPC ภายในเครื่อง
- โมเดลแบบ request-response ที่เรียบง่าย พร้อมตัวเลือกการตอบกลับหลายครั้ง
- ภาษาสำหรับกำหนดอินเทอร์เฟซเพื่อใช้ในการสร้างโค้ด
- เน้นที่บริการภายในเครื่องมากกว่าแอปพลิเคชันที่ทำงานผ่านเครือข่าย
การจัดการแบบอะซิงโครนัสและการจัดการหน่วยความจำ
การออกแบบแบบอะซิงโครนัสของ Vali ได้รับทั้งคำชมและคำวิจารณ์ ไลบรารีอนุญาตให้บริการจัดการกับไคลเอ็นต์หลายรายพร้อมกันโดยการตอบสนองแบบเลื่อนออกไป (deferring responses) ซึ่งป้องกันการบล็อกระหว่างการดำเนินการที่ใช้เวลานาน อย่างไรก็ตาม โมเดลความเป็นเจ้าของหน่วยความจำ (memory ownership) สำหรับโครงสร้างการตอบกลับได้ก่อให้เกิดคำถาม ผู้พัฒนาหนึ่งรายแสดงความกังวลเกี่ยวกับวิธีการที่หน่วยความจำสำหรับการตอบกลับได้รับการจัดสรรโดยไลบรารีผู้เรียก (caller library) ส่งต่อความเป็นเจ้าของอย่างสมบูรณ์ให้กับฟังก์ชัน จากนั้นจึงถูก consumed โดยฟังก์ชันการตอบกลับ แนวทางนี้แตกต่างจากแพตเทิร์นทั่วไปในภาษาเช่น Haskell และ Rust ที่มีความหมายของการเป็นเจ้าของ (ownership semantics) ที่ชัดเจนกว่า
การใช้งานทางเลือกที่ถูกกล่าวถึง:
- varlink-cpp (C++ พร้อม asio และ nl-json)
- QtVarlink (การใช้งานแบบ C++/Qt โดยนักพัฒนา KDE)
คำถามเกี่ยวกับความเข้ากันได้ของ JSON-RPC
สมาชิกในชุมชนบางส่วนตั้งคำถามว่าทำไม Varlink ซึ่งมีโครงสร้างคล้ายคลึงกับ JSON-RPC ถึงเลือกที่จะไม่เข้ากันกับมัน การตัดสินใจออกแบบนี้หมายความว่าเครื่องมือและไลบรารี JSON-RPC ที่มีอยู่ไม่สามารถใช้กับบริการ Varlink ได้ ซึ่งอาจจำกัดการยอมรับนำไปใช้ รูปแบบ JSON ที่มนุษย์อ่านได้ แม้ในทางทฤษฎีจะมีประโยชน์ในการดีบัก ดูเหมือนจะให้ข้อได้เปรียบในทางปฏิบัติเพียงเล็กน้อยตามที่ผู้พัฒนาที่เคยใช้โปรโตคอลนี้ในโครงการจริงระบุ
การอภิปรายที่ยังคงดำเนินอยู่เน้นย้ำถึงความตึงเครียดตลอดกาลในการออกแบบเทคโนโลยีระหว่างความเรียบง่ายและขีดความสามารถ ในขณะที่ vali นำการสร้างรหัสซึ่งเป็นสิ่งที่ระบบนิเวศ Varlink ต้องการอย่างมากมาสู่ การสนทนาในวงกว้างชี้ให้เห็นว่าโปรโตคอลเองอาจจำเป็นต้องแก้ไขข้อจำกัดบางประการเพื่อให้ได้รับการยอมรับในวงกว้างมากขึ้นในหมู่ผู้พัฒนาที่ทำงานกับโซลูชัน IPC ในเครื่อง