โปรโตคอลการเรียกขั้นตอนระยะไกล (RPC) ในระบบแบบกระจาย

⚡ สรุปอย่างชาญฉลาด

การเรียกใช้ฟังก์ชันระยะไกล (Remote Procedure Call หรือ RPC) เป็นโปรโตคอลการสื่อสารระหว่างกระบวนการที่ช่วยให้โปรแกรมสามารถเรียกใช้ฟังก์ชันในพื้นที่หน่วยความจำหรือเครื่องอื่นได้ โดยซ่อนรายละเอียดเครือข่ายไว้เบื้องหลังการเรียกใช้ฟังก์ชันภายในเครื่องตามปกติในระบบไคลเอ็นต์-เซิร์ฟเวอร์แบบกระจาย

  • 📞 ความหมาย: RPC ช่วยให้ไคลเอ็นต์สามารถเรียกใช้กระบวนการบนเซิร์ฟเวอร์ระยะไกลได้ราวกับเป็นการเรียกใช้จากเครื่องโลคอล
  • 🗂️ ประเภท: RPC แบบ Callback, Broadcast และ Batch-mode มีความแตกต่างกันในวิธีการกำหนดเส้นทางและจัดคิวคำขอ
  • 🏗️ Archiเทคเจอร์: ห้าส่วนจะทำงานร่วมกันในการเรียกใช้แต่ละครั้ง ได้แก่ ไคลเอนต์, ไคลเอนต์สตับ, รันไทม์ RPC, เซิร์ฟเวอร์สตับ และเซิร์ฟเวอร์
  • 🔄 วิธีการทำงาน: Stubs ทำหน้าที่แปลงพารามิเตอร์ให้เป็นข้อความ และแปลงผลลัพธ์ที่ส่งกลับไปยังผู้เรียกใช้
  • 🇧🇷 การแลกเปลี่ยน: RPC ช่วยลดความซับซ้อนของโค้ดแบบกระจาย แต่เพิ่มภาระด้านเครือข่ายและจุดที่อาจเกิดความล้มเหลวเมื่อเทียบกับการเรียกใช้แบบโลคอล
  • 🤖 มุมมองของ AI: gRPC ทำหน้าที่ให้บริการโมเดลแมชชีนเลิร์นนิงระหว่างไมโครเซอร์วิส และ Copilot ช่วยเร่งความเร็วในการเขียน RPC stub

การเรียกใช้ฟังก์ชันระยะไกล (RPC) ในระบบกระจาย

RPC คืออะไร?

การเรียกกระบวนการระยะไกล (RPC) เป็น การสื่อสารระหว่างกระบวนการ เทคนิคที่ใช้สำหรับแอปพลิเคชันแบบไคลเอ็นต์-เซิร์ฟเวอร์ RPC ย่อมาจาก Remote Procedure Call กลไก RPC ใช้เมื่อโปรแกรมคอมพิวเตอร์สั่งให้โปรแกรมย่อยหรือโปรแกรมย่อยทำงานในพื้นที่หน่วยความจำที่แตกต่างกัน โดยเขียนโค้ดเหมือนกับการเรียกใช้โปรแกรมปกติ โดยที่โปรแกรมเมอร์ไม่ต้องเขียนรายละเอียดสำหรับการโต้ตอบระยะไกลอย่างชัดเจน

การเรียกใช้ฟังก์ชันนี้ยังจัดการโปรโตคอลการขนส่งระดับต่ำ เช่น UDP และ TCP/IP เพื่อส่งข้อมูลข้อความระหว่างโปรแกรมต่างๆ ด้วย

ประเภทของ RPC

RPC สามประเภทคือ:

  • RPC โทรกลับ
  • ออกอากาศ RPC
  • RPC โหมดแบตช์

RPC โทรกลับ

RPC ประเภทนี้ช่วยให้เกิดรูปแบบการสื่อสารแบบ Peer-to-Peer (P2P) ระหว่างกระบวนการที่เข้าร่วม ช่วยให้กระบวนการหนึ่งสามารถทำหน้าที่ได้ทั้งเป็นไคลเอ็นต์และเซิร์ฟเวอร์

ฟังก์ชั่นของการโทรกลับ RPC:

  • จัดการปัญหาแอปพลิเคชันแบบโต้ตอบที่ประมวลผลจากระยะไกล
  • ส่งข้อมูลแฮนเดิลของไคลเอ็นต์ไปยังเซิร์ฟเวอร์
  • ฟังก์ชัน Callback ทำให้กระบวนการฝั่งไคลเอ็นต์ต้องรอ
  • จัดการภาวะการติดตายของฟังก์ชันเรียกกลับ (callback deadlocks)
  • มันช่วยส่งเสริมรูปแบบการแลกเปลี่ยนข้อมูลระหว่างกระบวนการที่เข้าร่วม

ออกอากาศ RPC

Broadcast RPC คือคำขอของไคลเอ็นต์ที่ถูกส่งกระจายไปทั่วเครือข่าย และถูกประมวลผลโดยเซิร์ฟเวอร์ทั้งหมดที่มีเมธอดสำหรับประมวลผลคำขอนั้น

ฟังก์ชั่นของการออกอากาศ RPC:

  • อนุญาตให้คุณระบุว่าข้อความร้องขอของไคลเอ็นต์จะต้องถูกส่งแบบกระจาย (broadcast)
  • คุณสามารถประกาศพอร์ตการออกอากาศได้
  • ช่วยลดภาระของเครือข่ายทางกายภาพได้

RPC โหมดแบตช์

RPC ในโหมดแบตช์ช่วยจัดคิวคำขอ RPC แยกต่างหากไว้ในบัฟเฟอร์การส่งข้อมูลทางฝั่งไคลเอ็นต์ จากนั้นจึงส่งคำขอเหล่านั้นผ่านเครือข่ายไปยังเซิร์ฟเวอร์ในคราวเดียว

หน้าที่ของ RPC ในโหมดแบตช์:

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

RPC Archiเทคเจอร์

สถาปัตยกรรม RPC ประกอบด้วยส่วนประกอบหลักของโปรแกรมห้าประการ:

  1. ไคลเอนต์
  2. ต้นขั้วลูกค้า
  3. รันไทม์ RPC
  4. เซิร์ฟเวอร์สตับ
  5. เซิร์ฟเวอร์

RPC Archiเทคเจอร์

RPC Archiเทคเจอร์

RPC ทำงานอย่างไร?

ขั้นตอนต่อไปนี้เกิดขึ้นระหว่างกระบวนการ RPC:

ขั้นตอน 1) ไคลเอนต์, ไคลเอนต์สตับ และอินสแตนซ์หนึ่งของรันไทม์ RPC จะทำงานบนเครื่องไคลเอนต์

ขั้นตอน 2) ไคลเอนต์เริ่มต้นกระบวนการจำลองไคลเอนต์โดยการส่งพารามิเตอร์ในลักษณะปกติ กระบวนการจำลองไคลเอนต์จะถูกจัดเก็บไว้ในพื้นที่หน่วยความจำของไคลเอนต์เอง นอกจากนี้ยังขอให้ RPC Runtime ในเครื่องส่งคำขอไปยังกระบวนการจำลองเซิร์ฟเวอร์ด้วย

ขั้นตอน 3) ในขั้นตอนนี้ ผู้ใช้เข้าถึง RPC โดยการเรียกใช้ฟังก์ชันภายในเครื่องตามปกติ RPC Runtime จะจัดการการส่งข้อความระหว่างไคลเอนต์และเซิร์ฟเวอร์ผ่านเครือข่าย รวมถึงการดำเนินการส่งต่อ การยืนยัน การกำหนดเส้นทาง และการเข้ารหัสด้วย

ขั้นตอน 4) หลังจากเสร็จสิ้นขั้นตอนของเซิร์ฟเวอร์ การทำงานจะส่งกลับไปยังส่วนประมวลผลของเซิร์ฟเวอร์ (server stub) ซึ่งจะทำการบรรจุ (จัดเรียง) ค่าที่ส่งกลับมาลงในข้อความ จากนั้นส่วนประมวลผลของเซิร์ฟเวอร์จะส่งข้อความนั้นกลับไปยังเลเยอร์การขนส่ง (transport layer)

ขั้นตอน 5) ในขั้นตอนนี้ เลเยอร์การขนส่งจะส่งข้อความผลลัพธ์กลับไปยังเลเยอร์การขนส่งฝั่งไคลเอ็นต์ ซึ่งจะส่งข้อความนั้นกลับไปยังไคลเอ็นต์สตับ

ขั้นตอน 6) ในขั้นตอนนี้ ตัวประมวลผลแบบสับของไคลเอ็นต์จะแยกข้อมูล (แกะข้อมูล) พารามิเตอร์ที่ส่งคืนในแพ็กเก็ตที่ได้ และการประมวลผลจะส่งกลับไปยังผู้เรียกใช้

ลักษณะของอาร์พีซี

นี่คือลักษณะสำคัญของ RPC:

  • โปรแกรมย่อยที่ถูกเรียกใช้นั้นอยู่ในกระบวนการอื่น ซึ่งอาจอยู่บนเครื่องอื่น
  • กระบวนการไม่แชร์พื้นที่ที่อยู่
  • พารามิเตอร์ถูกส่งผ่านโดยค่าเท่านั้น
  • RPC ดำเนินการภายในสภาพแวดล้อมของกระบวนการเซิร์ฟเวอร์
  • ฟังก์ชันนี้ไม่สามารถเข้าถึงสภาพแวดล้อมของขั้นตอนการเรียกใช้ได้

คุณสมบัติของ RPC

นี่คือคุณสมบัติที่สำคัญของ RPC:

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

ข้อดีของ RPC

ต่อไปนี้คือข้อดี/ประโยชน์ของ RPC:

  • RPC ช่วยให้ไคลเอ็นต์สื่อสารกับเซิร์ฟเวอร์โดยใช้การเรียกใช้ฟังก์ชันแบบดั้งเดิมในภาษาโปรแกรมระดับสูง
  • RPC มีรูปแบบการทำงานคล้ายกับการเรียกใช้โปรแกรมย่อยในเครื่อง แต่โปรแกรมย่อยที่ถูกเรียกนั้นมักจะถูกประมวลผลในกระบวนการที่แตกต่างกัน และโดยปกติแล้วจะอยู่บนคอมพิวเตอร์ที่แตกต่างกัน
  • RPC รองรับทั้งโมเดลที่เน้นกระบวนการและโมเดลที่เน้นเธรด
  • RPC ซ่อนกลไกการส่งข้อความภายในจากผู้ใช้
  • ต้องใช้ชั้นโปรโตคอลหลายชั้นเพื่อปรับปรุงประสิทธิภาพ
  • RPC ให้บริการ abstracตัวอย่างเช่น ลักษณะการส่งต่อข้อความของการสื่อสารผ่านเครือข่ายยังคงถูกซ่อนไว้จากผู้ใช้
  • RPC สามารถใช้งานได้ทั้งในสภาพแวดล้อมแบบกระจายและแบบภายในองค์กร
  • ความพยายามที่จำเป็นในการเขียนโค้ดใหม่และพัฒนาโค้ดใหม่นั้นมีน้อยมาก

ข้อเสียของ RPC

ข้อเสีย/ข้อเสียของการใช้ RPC มีดังนี้

  • การเรียกใช้ฟังก์ชันระยะไกล (Remote Procedure Call) จะส่งผ่านพารามิเตอร์โดยใช้ค่าเท่านั้น ไม่อนุญาตให้ใช้ค่าตัวชี้ (อ้างอิง)
  • เวลาในการเรียกใช้ (และส่งกลับ) กระบวนการระยะไกล ซึ่งเป็นค่าใช้จ่ายเพิ่มเติมนั้น สูงกว่ากระบวนการภายในเครื่องอย่างมาก
  • กลไกนี้มีความเสี่ยงสูงต่อความล้มเหลว เนื่องจากเกี่ยวข้องกับระบบสื่อสาร เครื่องจักรอีกเครื่อง และกระบวนการอื่น
  • แนวคิด RPC สามารถนำไปใช้ได้หลายวิธี ดังนั้นจึงไม่มีมาตรฐานเดียว
  • มันไม่มีความยืดหยุ่นสำหรับสถาปัตยกรรมฮาร์ดแวร์ เนื่องจากส่วนใหญ่เน้นการใช้งานแบบโต้ตอบ
  • ต้นทุนของกระบวนการเพิ่มขึ้นเนื่องจากการเรียกใช้ฟังก์ชันระยะไกล

คำถามที่พบบ่อย

RPC แสดงการกระทำในรูปแบบของกระบวนการระยะไกล ในขณะที่ REST แสดงข้อมูลในรูปแบบของทรัพยากรที่เข้าถึงได้ผ่านทางคำสั่ง HTTP RPC ให้ความรู้สึกเหมือนกับการเรียกใช้ฟังก์ชันภายในเครื่อง ในขณะที่ REST เน้นที่ทรัพยากรและสถานะเป็นหลัก

gRPC คือ Googleเฟรมเวิร์ก RPC ที่ทันสมัยและมีประสิทธิภาพสูง ใช้ HTTP/2 และ Protocol Bufferและรองรับการสตรีมแบบสองทิศทาง ทำให้เป็นที่นิยมสำหรับการสื่อสารระหว่างไมโครเซอร์วิส

RPC สามารถเป็นได้ทั้งสองแบบ การเรียกแบบซิงโครนัสจะบล็อกจนกว่าเซิร์ฟเวอร์จะส่งผลลัพธ์กลับมา ในขณะที่การเรียกแบบอะซิงโครนัสจะส่งผลลัพธ์กลับมาทันทีและจัดการกับคำตอบในภายหลัง เฟรมเวิร์กอย่าง gRPC รองรับทั้งสองรูปแบบ

RPC เป็นรูปแบบหนึ่งของ IPC ที่ทำงานข้ามเครื่องคอมพิวเตอร์ที่แยกจากกัน ในขณะที่วิธีการ IPC หลายวิธีใช้หน่วยความจำร่วมกันบนโฮสต์เดียว แต่ RPC แลกเปลี่ยนข้อความผ่านเครือข่าย ทำให้กระบวนการบนคอมพิวเตอร์ต่าง ๆ สามารถทำงานร่วมกันได้

การใช้งาน RPC ทั่วไป ได้แก่ gRPC, Apache Thrift, XML-RPC, JSON-RPC และอื่นๆ Java RMI (Remote Media Environment) นั้นแตกต่างกันในรูปแบบข้อมูลและวิธีการส่งข้อมูล แต่ทั้งหมดล้วนอนุญาตให้ไคลเอ็นต์เรียกใช้กระบวนการบนเซิร์ฟเวอร์ระยะไกลได้

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

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

ใช่แล้ว GitHub Copilot สามารถสร้างโครงสร้างพื้นฐานของไฟล์ .proto สำหรับการกำหนดบริการ, ส่วนของไคลเอ็นต์ และตัวจัดการเซิร์ฟเวอร์สำหรับ gRPC ได้ นักพัฒนาควรตรวจสอบอินเทอร์เฟซที่สร้างขึ้น การจัดการข้อผิดพลาด และการกำหนดเวอร์ชันก่อนที่จะนำไปใช้งานจริง

สรุปโพสต์นี้ด้วย: