การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์
การสตรีมสองทิศทางและการควบคุมแรงดันย้อนกลับ
การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดการสตรีมของ gRPC
gRPC รองรับโหมดการสตรีมสามแบบนอกเหนือจากแบบเอกภาค ได้แก่ การสตรีมจากเซิร์ฟเวอร์ (เซิร์ฟเวอร์ส่งหลายรายการ) การสตรีมจากไคลเอนต์ (ไคลเอนต์ส่งหลายรายการ) และแบบสองทิศทาง (ทั้งสองฝ่ายสตรีมข้อมูล)
การสตรีมจากเซิร์ฟเวอร์ใน .proto
ใช้คีย์เวิร์ด stream ก่อนชนิดข้อมูลการตอบกลับ:
service EventService {
rpc ListEvents (ListEventsRequest) returns (stream Event);
}การนำการสตรีมจากเซิร์ฟเวอร์ไปใช้งาน
เซิร์ฟเวอร์ส่งข้อความหลายรายการได้โดยเรียก stream.Send() และส่งคืน nil เมื่อเสร็จสิ้น:
func (s *server) ListEvents(req *pb.ListEventsRequest, stream pb.EventService_ListEventsServer) error {
for _, event := range s.events {
if err := stream.Send(event); err != nil { return err }
}
return nil
}ไคลเอนต์รับสตรีมจากเซิร์ฟเวอร์
ไคลเอนต์เรียก Recv() ในลูปจนกว่าจะถึง io.EOF:
stream, err := client.ListEvents(ctx, &pb.ListEventsRequest{})
for {
event, err := stream.Recv()
if err == io.EOF { break }
if err != nil { log.Fatal(err) }
fmt.Println(event)
}การสตรีมจากไคลเอนต์ใน .proto
ใช้ stream ก่อนชนิดข้อมูลคำขอ:
service UploadService {
rpc Upload (stream Chunk) returns (UploadResponse);
}การนำการสตรีมจากไคลเอนต์ไปใช้งาน
ไคลเอนต์ส่งข้อความหลายรายการ จากนั้นปิดสตรีมด้วย CloseAndRecv:
stream, _ := client.Upload(ctx)
for _, chunk := range chunks {
stream.Send(chunk)
}
resp, err := stream.CloseAndRecv()เซิร์ฟเวอร์รับสตรีมจากไคลเอนต์
เรียก stream.Recv() ในลูปจนกว่าจะถึง io.EOF จากนั้นส่งคืนการตอบกลับสุดท้าย:
func (s *server) Upload(stream pb.UploadService_UploadServer) error {
for {
chunk, err := stream.Recv()
if err == io.EOF {
return stream.SendAndClose(&pb.UploadResponse{Received: total})
}
if err != nil { return err }
total += len(chunk.Data)
}
}การสตรีมสองทิศทาง
ทั้งไคลเอนต์และเซิร์ฟเวอร์สามารถส่งและรับข้อมูลได้อย่างอิสระ ประกาศด้วย stream ทั้งสองฝั่งใน .proto
service ChatService {
rpc Chat (stream Message) returns (stream Message);
}การนำเซิร์ฟเวอร์แบบสองทิศทางไปใช้งาน
เซิร์ฟเวอร์รับข้อมูลในโกรูทีนหนึ่งและส่งข้อมูลอย่างอิสระ:
func (s *server) Chat(stream pb.ChatService_ChatServer) error {
for {
msg, err := stream.Recv()
if err == io.EOF { return nil }
if err != nil { return err }
stream.Send(&pb.Message{Text: "echo: " + msg.Text})
}
}การควบคุมการไหล
gRPC ใช้การควบคุมการไหลของ HTTP/2 เพื่อป้องกันไม่ให้ผู้ส่งที่เร็วทำให้ผู้รับที่ช้ารับข้อมูลมากเกินไป การเรียก Recv() จะใช้แรงดันย้อนกลับโดยอัตโนมัติ — การส่งข้อมูลจะหยุดรอเมื่อผู้รับยังไม่ได้อ่าน
การยกเลิกบริบท
ส่งบริบทที่มีกำหนดเวลาหรือการยกเลิกไปกับการเรียกแบบสตรีมทั้งหมด สตรีมจะถูกยกเลิกเมื่อบริบทเสร็จสิ้น ซึ่งทำให้ Recv/Send ส่งคืนข้อผิดพลาด
ตรวจสอบความเข้าใจอย่างรวดเร็ว
เซิร์ฟเวอร์ของ RPC แบบสตรีมจากเซิร์ฟเวอร์แจ้งอย่างไรว่าได้ส่งข้อมูลเสร็จแล้ว
สรุป: การสตรีม gRPC
ประเด็นสำคัญ:
- สตรีมจากเซิร์ฟเวอร์: ใช้คีย์เวิร์ด stream กับการตอบกลับ เซิร์ฟเวอร์เรียก Send()
- สตรีมจากไคลเอนต์: ใช้คีย์เวิร์ด stream กับคำขอ ไคลเอนต์เรียก Send() แล้วจึงเรียก CloseAndRecv()
- สองทิศทาง: ใช้ stream ทั้งสองฝั่ง ใช้โกรูทีน Send และ Recv แยกกัน
- การยกเลิกบริบทมีผลกับการเรียกแบบสตรีมทั้งหมด
คำถามที่พบบ่อย
บทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์”
การสตรีมสองทิศทางและการควบคุมแรงดันย้อนกลับ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Protocol Buffers และไฟล์ .proto
- การใช้งานบริการ gRPC แบบเอกภาคี
- การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์
- อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC