ไลบรารีเครือข่ายเล็ก ๆ C ++
| ส่วนⅰ | ส่วนⅱ | ส่วนⅲ | ส่วนⅳ | ส่วนที่ V | ส่วนⅵ | ส่วนⅶ |
|---|
| การแนะนำโครงการ | คุณสมบัติโครงการ | สภาพแวดล้อมการพัฒนา | แบบจำลองการเกิดขึ้นพร้อมกัน | สร้างโครงการ | เคสที่กำลังดำเนินการ | คำอธิบายโมดูล |
การแนะนำโครงการ
โครงการนี้เป็นไลบรารีเครือข่ายแบบมัลติเธรดที่ใช้โมเดลเครื่องปฏิกรณ์ที่ใช้โดย Muduo การใช้ C ++ 11 เพื่อเขียนเพื่อลบการพึ่งพาของ Muduo ใน Boost เซิร์ฟเวอร์ HTTP ขนาดเล็กจะถูกนำไปใช้ภายในซึ่งสามารถรองรับได้รับคำขอและการเข้าถึงทรัพยากรคงที่และมาพร้อมกับบันทึกแบบอะซิงโครนัสเพื่อตรวจสอบสถานการณ์เซิร์ฟเวอร์
โครงการได้ใช้โมดูลช่องโมดูล Poller โมดูลลูปเหตุการณ์โมดูล HTTP โมดูลตัวจับเวลาโมดูลบันทึกแบบอะซิงโครนัสโมดูลหน่วยความจำโมดูลหน่วยความจำและโมดูลการเชื่อมต่อฐานข้อมูล
คุณสมบัติโครงการ
- เลเยอร์พื้นฐานใช้แบบจำลองมัลติเพล็กซิ่ง I/O ของโหมด Epoll + LT และใช้โมเดลเครื่องปฏิกรณ์แบบสลาฟมาสเตอร์ร่วมกับ I/O ที่ไม่ปิดกั้น
- ใช้โมเดลด้าย "One Loop ต่อเธรด" และห่อหุ้มพูลเธรดขึ้นเพื่อหลีกเลี่ยงค่าใช้จ่ายด้านประสิทธิภาพที่เกิดจากการสร้างเธรดและการทำลาย
- EventFD ใช้เป็นตัวบ่งชี้การแจ้งเตือนเหตุการณ์เพื่ออำนวยความสะดวกในการส่งเหตุการณ์ที่มีประสิทธิภาพไปยังเธรดอื่น ๆ เพื่อดำเนินการแบบอะซิงโครนัส
- บันทึกแบบอะซิงโครนัสจะถูกนำไปใช้ตามบัฟเฟอร์คู่ที่ใช้ตนเองและเธรดแบ็กเอนด์มีหน้าที่ในการเขียนข้อมูลบันทึกส่วนหน้าลงบนดิสก์อย่างสม่ำเสมอเพื่อหลีกเลี่ยงการปิดกั้นบริการเครือข่ายเมื่อข้อมูลหลุดออกจากดิสก์
- โครงสร้างการจัดการตัวจับเวลาถูกนำมาใช้ตามต้นไม้สีแดงและสีดำและตัวจับเวลาของ Linux ถูกนำมาใช้ภายในเพื่อแจ้งงานหมดอายุและงานที่กำหนดเวลาได้รับการจัดการอย่างมีประสิทธิภาพ
- ติดตามเทคนิค RAII เพื่อจัดการหน่วยความจำโดยใช้ตัวชี้อัจฉริยะเพื่อลดความเสี่ยงของการรั่วไหลของหน่วยความจำ
- ใช้เครื่องจักรสถานะ จำกัด เพื่อแยกแพ็คเก็ตคำขอ HTTP
- อ้างอิงถึง Nginx โมดูลหน่วยความจำพูลถูกนำมาใช้เพื่อจัดการพื้นที่หน่วยความจำขนาดเล็กที่ดีขึ้นและลดการกระจายตัวของหน่วยความจำ
- พูลการเชื่อมต่อฐานข้อมูลสามารถจัดการจำนวนการเชื่อมต่อแบบไดนามิกสร้างหรือทำลายการเชื่อมต่อในเวลาที่เหมาะสมและตรวจสอบประสิทธิภาพของพูลการเชื่อมต่อ
สภาพแวดล้อมการพัฒนา
- ระบบปฏิบัติการ:
Ubuntu 18.04.6 LTS - คอมไพเลอร์:
g++ 7.5.0 - บรรณาธิการ:
vscode - การควบคุมเวอร์ชัน:
git - การก่อสร้างโครงการ:
cmake 3.10.2
แบบจำลองการเกิดขึ้นพร้อมกัน
โครงการใช้โมเดลเครื่องปฏิกรณ์หลัก
หลังจากเรียกฟังก์ชันเริ่มต้นของ TCPSERVER แล้วพูลเธรดจะถูกสร้างขึ้นภายใน แต่ละเธรดจะมีการวนซ้ำเหตุการณ์อย่างอิสระคือ subreactor MainReactor โพลเครื่องปฏิกรณ์ย่อยจากพูลเธรดและส่งไปยังการเชื่อมต่อใหม่ มีข้อดีมากมายในการใช้รุ่นเครื่องปฏิกรณ์แบบสแลฟหลัก:
- การตอบสนองที่รวดเร็วและไม่จำเป็นต้องถูกบล็อกโดยเหตุการณ์การซิงโครไนซ์ครั้งเดียวแม้ว่าเครื่องปฏิกรณ์เองยังคงเป็นซิงโครนัส
- มันสามารถหลีกเลี่ยงปัญหามัลติเธรดที่ซับซ้อนและการซิงโครไนซ์ในระดับที่ยิ่งใหญ่ที่สุดและหลีกเลี่ยงการสลับแบบมัลติเธรด/กระบวนการ
- มันมีความยืดหยุ่นที่ดีซึ่งสามารถอำนวยความสะดวกในการใช้ทรัพยากร CPU อย่างเต็มที่โดยการเพิ่มจำนวนอินสแตนซ์ของเครื่องปฏิกรณ์
- ความสามารถในการนำกลับมาใช้ใหม่ได้ดีและโมเดลเครื่องปฏิกรณ์เองก็ไม่มีส่วนเกี่ยวข้องกับตรรกะการประมวลผลเหตุการณ์ที่เฉพาะเจาะจงและมีความสามารถในการนำกลับมาใช้ใหม่ได้สูง
สร้างโครงการ
ติดตั้ง cmake
sudo apt-get update
sudo apt-get install cmake
ดาวน์โหลดโครงการ
ดำเนินโครงการสร้างสคริปต์
cd ./tiny-network && bash build.sh
เคสที่กำลังดำเนินการ
ที่นี่เราใช้เซิร์ฟเวอร์ Echo อย่างง่ายเป็นกรณีและพอร์ตการฟังเริ่มต้นของ EchoServer คือ 8080
cd ./example
./EchoServer
สถานะการใช้งาน:
โมดูล http มีเคสเซิร์ฟเวอร์ HTTP ขนาดเล็กที่สามารถดำเนินการได้ การฟังเริ่มต้น 8080 :
cd ./src/http && ./HttpServer
คำอธิบายโมดูล
โมดูลบางอย่างที่นี่จะกำหนดค่าซอร์สโค้ด Muduo เพื่ออธิบายและบางส่วนใช้ซอร์สโค้ดของโครงการนี้ แต่แนวคิดการใช้งานมีความสอดคล้องกัน
โมดูลช่อง
โมดูล Poller
EventLoop Module
โมดูลบัฟเฟอร์
โมดูลตัวจับเวลา
โมดูล http
โมดูลบันทึกแบบอะซิงโครนัส
โมดูลพูลหน่วยความจำ
โมดูลพูลการเชื่อมต่อฐานข้อมูล
แผนการเพิ่มประสิทธิภาพ
- วางแผนที่จะใช้การประทับเวลาพื้นฐานโดยใช้ std :: chrono
- จัดการโครงสร้างตัวจับเวลาโดยใช้คิวลำดับความสำคัญ
- ครอบคลุมการทดสอบหน่วยเพิ่มเติม
ปลื้มปีติ
- "การเขียนโปรแกรมเซิร์ฟเวอร์ประสิทธิภาพสูง Linux"
- "การเขียนโปรแกรมเซิร์ฟเวอร์ Linux multithreaded: การใช้ไลบรารีเครือข่าย Muduo C ++"
- https://github.com/chenshuo/muduo