ขณะนี้เรากำลังทำงานเกี่ยวกับผลิตภัณฑ์ / โครงการใหม่ของเรามันเป็นแอปพลิเคชันไคลเอนต์ - เซิร์ฟเวอร์ที่มุ่งไปยังผู้ประกอบการอุตสาหกรรม / บริการเฉพาะ เรากำลังสร้างเซิร์ฟเวอร์ (ภาษา C และ Linux เท่านั้น) ที่ใช้โปรโตคอลที่กำหนดเองบน TCP ด้วย Java front-end เรามีงานเขียนโค้ดประมาณ 20% และต้องเผชิญกับสถานการณ์ที่ต้องเลือกระหว่างสถาปัตยกรรมเคอร์เนลแบบไมโครหรือเสาหิน
ฉันรู้ว่า Micro กับเสาหินมักจะเกี่ยวข้องกับสถาปัตยกรรมเคอร์เนล แต่เรากำลังพูดถึงเซิร์ฟเวอร์โดยเฉพาะ
ทำไมเซิร์ฟเวอร์ที่กำหนดเองและไม่ใช่สิ่งที่มีอยู่?
- ความต้องการ UI ของเรานั้นมีความสำคัญและมีพลวัตมากดังนั้นโซลูชันบนเว็บ / เว็บเบราว์เซอร์จึงไม่เหมาะสม
- การประมวลผลเชิงสถิติมีความสำคัญในตอนท้ายของไคลเอ็นต์ดังนั้นเบราว์เซอร์ก็มีความช่วยเหลือเล็กน้อย (แน่นอนว่าเราสามารถทำการประมวลผลที่จุดสิ้นสุดของเซิร์ฟเวอร์และส่งผ่านข้อมูลที่ประมวลผลไปยังไคลเอนต์ แต่นั่นก็หมายถึงโหลดจำนวนมากบนเซิร์ฟเวอร์และการสูญเสียทรัพยากรของลูกค้า)
- ยิ่งไปกว่านั้นด้วยเทคโนโลยีอย่างน้อยสามอย่าง (JS / HTML / CSS) เพื่อจัดการแม้กระทั่งเหตุการณ์เดียวทำให้ประสบการณ์ทั้งหมดเหมือนการกวาดบ้านท่ามกลางพายุทะเลทราย - คุณกวาดมันเป็นครั้ง n ครั้งฝุ่นสะสม n + 1 ครั้ง
แล้ว Micro และ Monolithic Server ล่ะ คุณกำลังพูดอะไร?
พิจารณาคำขอของลูกค้า (สมมุติ) ต่อไปนี้:
request-id: 123
request-service: HistoricDataSets
request-message: Fetch all records upto the year 2010
ในการรับคำขอดังกล่าวเซิร์ฟเวอร์มักจะทำ (เราไม่สนใจเทคนิคการทำงานพร้อมกันเช่น thread และ forks เพื่อความเรียบง่าย):
- แยกสตริงคำขอ
- ระบุการกระทำ (ดึงข้อมูล
HistoricDataSets LIMIT Year (2010)
ในกรณีของเรา) - โต้ตอบกับเลเยอร์แบบต่อเนื่อง (Oracle ในตัวอย่างของเรา) และดึงข้อมูล
จัดรูปแบบข้อมูลตามโปรโตคอล Ex:
response-id: 123
สำเร็จ: true
response-text: DataSetsตอบสนองต่อลูกค้าด้วยข้อมูลที่จัดรูปแบบดังนั้น
นี่คือสิ่งที่เรากำลังเรียกเซิร์ฟเวอร์เสาหิน (คล้ายกับเคอร์เนลเสาหินที่การทำงานของระบบปฏิบัติการทั้งหมดจะทำในพื้นที่เคอร์เนล)
พิจารณาคำขอเดิมอีกครั้งเมื่อได้รับในครั้งนี้เซิร์ฟเวอร์ (เราได้สมมติว่าหน่วยความจำที่แชร์เป็น IPC เท่านั้นเพื่อความเรียบง่าย):
- ทำให้การร้องขอลงในหน่วยความจำที่ใช้ร่วมกันสำหรับ
Parser
กระบวนการ Parser
แยกวิเคราะห์สตริงระบุงานและนำExecutioner
กระบวนการในการดำเนินการงานExecutioner
แล้วผ่านข้อมูลไปยังFomatter
กระบวนการซึ่งหลังจากการจัดรูปแบบข้อมูลลงในสตริงโปรโตคอลผลตอบแทนไปยังเซิร์ฟเวอร์- เซิร์ฟเวอร์ส่งไปยังลูกค้า (ตอบกลับ)
แน่นอนแทนParser
, Executioner
และFormatter
มันจะได้รับขั้นตอนเดียว แต่แยกต่างหาก นี่คือสิ่งที่เรากำลังเรียกไมโครเซิร์ฟเวอร์ (คล้ายกับไมโครเคอร์เนลที่ทำขั้นต่ำสุดที่จำเป็น) เซิร์ฟเวอร์จะรับฟังและตอบกลับอย่างมีประสิทธิภาพในขณะที่ทุกขั้นตอนได้รับการดูแลโดยกระบวนการที่แตกต่างกัน
เลือกอันไหนดี? เรากำลังสับสน! ในขณะที่เซิร์ฟเวอร์เสาหินถูกทดลองและทดสอบ (HTTP-Web Servers ส่วนใหญ่?) และโปรแกรมได้ง่ายขึ้นและสามารถจัดการการทำงานพร้อมกันได้ค่อนข้างดี เซิร์ฟเวอร์ขนาดเล็กซึ่งดูเหมือนว่ารวดเร็วและสอดคล้องกับหลักการ UNIX ของโปรแกรมเดียวที่จะทำภารกิจเดียว แต่ก็มีความซับซ้อนในการพัฒนาเช่นกัน การรักษาภาวะพร้อมกันในใจ
คำถาม
- ข้อดีและข้อเสียของแต่ละวิธีคืออะไร?
- ควรใช้เมื่อใด (อาจตีความได้ว่าเป็นคำถามทั่วไป: จะใช้ IPC เมื่อใด)
- หากเลือกเคอร์เนล Micro แล้วฟังก์ชั่นใดที่จำเป็นต้องเป็นส่วนหนึ่งของคอร์ - เซิร์ฟเวอร์
คำถามที่คล้ายกัน / ที่เกี่ยวข้อง
- อันตรายจากการใช้เสาหินขนาดใหญ่
- เบราว์เซอร์ Vs ภายนอกฝัง (Tangential)
- คำแนะนำสำหรับการแปลงแอปเสาหินเป็นมัลติเธรด (Tangential)
ข้อมูลบางอย่างที่อาจเป็นประโยชน์:
- ลูกค้าที่คาดหวังของเราสามารถแบ่งออกเป็นสองประเภท:
- ใหญ่: ประมาณ 1,700 - 2,000 คำขอต่อนาที
- เล็ก: ประมาณ 650 - 700 คำขอต่อนาที
- ปริมาณข้อมูลต่อรอบการร้องขอ (การร้องขอและการตอบสนองต่อมา) สามารถสันนิษฐานได้ว่าโดยปกติแล้วจะกระจายด้วยค่าเฉลี่ยประมาณ 1.20 MB และกรณีที่แย่กว่านั้นคือประมาณ 250-300 MB
- แนวคิดผลิตภัณฑ์ค่อนข้างใหม่ แต่มีความสามารถในการส่งผลกระทบต่อการดำเนินงานหลักดังนั้นเราคาดว่างบประมาณของลูกค้าจะมีความยืดหยุ่นเพียงโพสต์การติดตั้งล่าช้า (9-12 เดือน) หลังการติดตั้งซึ่ง จำกัด จำนวนฮาร์ดแวร์ที่ลูกค้าจะเต็มใจ ที่จะกระทำ esp คนตัวเล็ก
- ลูกค้าแต่ละรายจะมีสแต็กไคลเอ็นต์ - เซิร์ฟเวอร์ของตัวเอง เซิร์ฟเวอร์จะทำงานบนฮาร์ดแวร์ของลูกค้าที่จัดการโดยทีมงานของลูกค้าในขณะที่ลูกค้าจะได้รับการปรับใช้บนเครื่องของพนักงานที่ใช้งานได้
- การอัปเดตระยะไกลสำหรับไคลเอ็นต์และเซิร์ฟเวอร์แอปพลิเคชันเป็นสิ่งที่จำเป็น
PUSH
บริการแบบเรียลไทม์โดยเซิร์ฟเวอร์อาจเป็นที่ต้องการอย่างมากหากมีการคลิกผลิตภัณฑ์!