แนวปฏิบัติที่ดีในการส่งคืนข้อมูลจำนวนมากในโหนด

ฉันเขียนโค้ดเว็บเซิร์ฟเวอร์โดยใช้ Koa (nodeJs) แล้ว ฉันต้องส่งคืนข้อมูลจำนวนมากจากฐานข้อมูล mongo Large หมายถึงอาร์เรย์ที่มีข้อมูล json ประมาณ 750,000 รายการ แต่ละองค์ประกอบ json มีหลายสตริง

วิธีที่ดีในการเขียนโค้ดเซิร์ฟเวอร์ดังกล่าวเพื่อหลีกเลี่ยงไม่ให้เซิร์ฟเวอร์เสียหายคืออะไร ฉันเปิดรับทุกเคล็ดลับ :)

ป.ล. ลูกค้าของฉันจะเป็น Unity (c# หรือ js)


person MrFlo    schedule 24.04.2017    source แหล่งที่มา
comment
ทำไมคุณต้องคืนทั้งหมดในครั้งเดียว? สิ่งแรกที่นึกถึงคือ gzip หากมันยังเล็กไม่พอ ให้ใช้การบีบอัดแบบอื่นเพื่อช่วยดึงมันลง แต่จริงๆ แล้ว ฉันจะพยายามดูว่าเหตุใดลูกค้าจึงต้องการข้อมูลเหล่านั้นทั้งหมดในคราวเดียว   -  person Tuan Anh Tran    schedule 24.04.2017
comment
ฉันสร้างภาพข้อมูล และฉันต้องการแสดงข้อมูลทั้งหมดเป็นภาพในช็อตเดียว อย่างไรก็ตาม ฉันสามารถโหลดเป็นแพ็คได้   -  person MrFlo    schedule 24.04.2017
comment
หากเป็นกรณีนี้ คุณอาจต้องการประมวลผล/รวบรวมข้อมูลทางฝั่งเซิร์ฟเวอร์ด้วยเพื่อที่จะส่งข้อมูลน้อยลง   -  person Gabriel Littman    schedule 27.04.2017
comment
ในกรณีส่วนใหญ่ คุณคงพูดถูก แต่ในกรณีของฉัน ฉันต้องการชุดข้อมูลทั้งหมด   -  person MrFlo    schedule 27.04.2017


คำตอบ (2)


โหนดใช้การเข้ารหัสการถ่ายโอนแบบก้อนสำหรับ HTTP ตามค่าเริ่มต้น และการใช้สตรีมคุณสามารถส่งคืนข้อมูลหลายเพตะไบต์ในคำขอเดียวโดยไม่มีปัญหาใด ๆ อย่างน้อยก็ไม่มีปัญหากับเซิร์ฟเวอร์ การที่ไคลเอ็นต์แยกวิเคราะห์ข้อมูลนั้นเป็นอีกเรื่องหนึ่ง

ปัญหาอยู่ที่การทำให้ข้อมูลขนาดใหญ่เป็นอนุกรมไปยัง JSON ซึ่งโดยปกติจะเป็นการดำเนินการบล็อกที่ต้องการข้อมูลทั้งหมดในหน่วยความจำ แต่มีตัวเข้ารหัส JSON แบบสตรีมให้เลือก

ตัวอย่างเช่น โปรดดู Big-Friendly JSON - ฟังก์ชันการสตรีมแบบอะซิงโครนัสสำหรับชุดข้อมูล JSON ขนาดใหญ่:

ดูโมดูลอื่นๆ เพิ่มเติม:

นอกจากนี้ คุณไม่จำเป็นต้องส่ง JSON ขนาดใหญ่เพียงตัวเดียว คุณสามารถแยกออกเป็นหลายๆ ออบเจ็กต์ได้ และคุณไม่จำเป็นต้องใช้ JSON เพื่อทำให้ข้อมูลเป็นอนุกรม คุณสามารถใช้ CSV, TSV หรือสิ่งอื่นใดที่ข้อมูลของคุณเหมาะสม คุณไม่ได้บอกเราเกี่ยวกับข้อมูลของคุณ ดังนั้นจึงเป็นการยากที่จะให้คำแนะนำเฉพาะเจาะจงแก่คุณ

person rsp    schedule 24.04.2017
comment
ขอบคุณสำหรับคำแนะนำของคุณ ฉันใช้ mongodb ดังนั้นจึงเก็บข้อมูลเป็น json ไม่ใช่เหตุผลที่เจาะจงยกเว้นว่ามันง่ายกว่าที่จะจัดการสำหรับฉัน (ซึ่งเป็นเหตุผลที่ไม่ดี) ฉันจะตรวจสอบโมดูลของคุณ ขอบคุณอีกครั้ง - person MrFlo; 24.04.2017

เนื่องจากข้อมูลมีขนาดใหญ่มาก คุณต้องการให้ข้อมูลทั้งหมดอยู่บนไคลเอนต์ในคราวเดียวจริงหรือ? หากไม่ใช่ตัวเลือกง่ายๆ อีกวิธีหนึ่งก็คือการแบ่งหน้าข้อมูลผ่านคำขอหลายรายการ

แบบสอบถาม mongo สามารถโยนได้อย่างง่ายดายด้วยข้อ จำกัด และข้ามตัวเลือกไปยังคำขอค้นหา

คุณสามารถส่งผ่านได้โดยใช้พารามิเตอร์การสืบค้น http://example.com/large_data?skip=5000&limit=1000.

person Gabriel Littman    schedule 27.04.2017
comment
คำแนะนำที่ดี ! นั่นคือไวยากรณ์ที่ฉันกำลังมองหา! ขอบคุณมาก ! - person MrFlo; 27.04.2017