Geyser gRPC - ฝึกได้ดีที่สุด
มัคคุเทศก์นี้ครอบคลุมรูปแบบที่จําเป็นสําหรับการก่อสร้างอย่างรัดกุม, โปรแกรมที่พร้อมการผลิตด้วย Geyser gRPC. Solana รองรับระบบ SDK Geyser gRPC.
เริ่ม
- เริ่มที่: เริ่มจากการบอกจํานวนช่อง เพื่อให้คุ้นเคยกับการไหลกระเพื่อม ก่อนการเพิ่มตัวกรองที่ซับซ้อน
- ใช้ตัวกรองอย่างฉลาด: การบอกรับเฉพาะสิ่งที่คุณต้องการ เพื่อลด bandwidth/CPUการซื้อขายแบบโวตมี ~70% ของการจราจร -- ทิ้งมันหากคุณไม่ต้องการมัน
rust
SubscribeRequestFilterTransactions {
vote: Some(false), // Exclude ~70% vote txs
failed: Some(false), // Exclude failed txs
..Default::default()
}SubscribeRequestFilterTransactions {
vote: Some(false), // Exclude ~70% vote txs
failed: Some(false), // Exclude failed txs
..Default::default()
}การจัดการการเชื่อมต่อ
- การกลับมาเชื่อมต่ออัตโนมัติ: คาดว่าจะเกิดปัญหาเครือข่าย การติดต่อกับเอกซ์โปเนนเชียล รีเอกซ์โปเนนเชียล
- การจัดการปิง/พ็อง: Yellowstone gRPC เซิร์ฟเวอร์ส่งเสียงping. ตอบสนองด้วยเสียงป้อบอัพ หรือเซิร์ฟเวอร์สามารถปิดการเชื่อมต่อได้ (สาเหตุของ ~30s ถูกตัดการเชื่อมต่อ)
rust
if matches!(update.update_oneof, Some(UpdateOneof::Ping(_))) {
subscribe_tx.send(SubscribeRequest {
ping: Some(SubscribeRequestPing { id: 1 }),
..Default::default()
}).await?;
}if matches!(update.update_oneof, Some(UpdateOneof::Ping(_))) {
subscribe_tx.send(SubscribeRequest {
ping: Some(SubscribeRequestPing { id: 1 }),
..Default::default()
}).await?;
}- การกู้คืนช่อง: ใช้
from_slotหลัง จาก กลับ มา อยู่ ร่วม กัน อีก เพื่อ หลีก เลี่ยง การ สูญ เสีย ข้อมูล (ความ ยุ่งเหยิง เป็น ที่ ยอม รับ).
rust
subscribe_request.from_slot = if tracked_slot > 0 {
Some(tracked_slot) // Optionally subtract a small buffer to dodge reorgs
} else {
None
};subscribe_request.from_slot = if tracked_slot > 0 {
Some(tracked_slot) // Optionally subtract a small buffer to dodge reorgs
} else {
None
};รูปแบบสถาปัตยกรรม
- แยกทางรุกและดําเนินการด้วยช่องทางในการแยกเครือข่ายที่ขาดลอยจากตรรกะทางธุรกิจ และเพิ่มการกดทับ
rust
let (tx, rx) = mpsc::channel::<SubscribeUpdate>(10_000);
// ingress task reads stream and tx.send(...)
// processing task consumes rx and does business logiclet (tx, rx) = mpsc::channel::<SubscribeUpdate>(10_000);
// ingress task reads stream and tx.send(...)
// processing task consumes rx and does business logic- ใช้ช่องเสียงแบบมีขอบเขต: เลือกความจุที่อิงมาจากความเร็วในการประมวลผล และความอดทนข้อมูลสูญหาย (ค่าหน่วยความจําน้อย= ค่ามาก, ค่าหยดมากกว่า = ค่าหน่วยความจํามากขึ้น, ค่าหยดน้อยลง)
ประสิทธิภาพ และ ความ ยืดหยุ่น
- การประมวลผลความล่าช้าและล็อกเมื่อ ขีดจํากัดเกินขีด
- Batch DB เขียนไว้ว่า; กดเมื่อมีขนาดหรือช่วงเวลาต่าง ๆ
- ใช้ข้อมูล async IO สําหรับเรียกภายนอก; ไม่ให้โหลดการคํานวณหนักในการงาน/theads
- ใช้การขอสมัครสมาชิกใหม่เพื่อลดการจองที่
การจัดการข้อผิดพลาด
- แยกแยะรายการข้อผิดพลาด (Tream vs clate vs V transl)
- การ ต่อ คู่ (เริ่ม ด้วย การ ทํา ซ้ํา กัน เล็ก ๆ, ทํา ให้ ถึง ขีด ที่ สม เหตุ สม ผล).
- ปูมบันทึก/ สมมาตร ลดลง เข้าสู่สถานะการประมวลผลที่ช้า
การจัดการข้อมูล
- จัดการกับการซ้ําเมื่อใช้งาน
from_slot(ข้อจํากัดการส่งข้อมูลแบบเวลา หรือ DB) - เลือกข้อผูกมัดต่อตัวพิมพ์ตัวพิมพ์เล็ก:
- ประมวลผล: แผงหน้าปัดที่เร็วที่สุด อาจม้วนกลับได้
- ยืนยัน: ค่าปริยายที่ดีสําหรับโปรแกรม/ indexer ส่วนมาก
- เสร็จสิ้นเมื่อจําเป็นความแน่นอนที่แน่นอน
การบอกรับข้อมูลแบบไม่ตายตัว
ใช้สายข้อมูล b ทางเดียว เพื่อปรับปรุงข้อมูลบอกรับเมื่อทํางาน (ตัวกรองที่อยู่ด้านบน, ครอบคลุมการส่งภาพ) โดยไม่เชื่อมต่อ
ตรวจหาการเพิ่มประสิทธิภาพ
- ○ การ กลับ มา ใช้ เครื่อง บิน อัตโนมัติ อีก ครั้ง หนึ่ง
- ○ ฟื้น ตัว จาก การ เป็น โรค กามโรค โดย ใช้
from_slot - ○ การ จัด การ แบบ พิง/ ป็อง (ตัด ขาด 30 ช่วง)
- ○ แยก ตัว อยู่ ต่าง หาก ใน สภาพ ก้าวร้าว และ การ ดําเนิน งาน ด้วย การ กระชับ ช่อง/ หด ตัว
- ○ เกิด ความ ผิด พลาด ใน การ ทํา ไม้ และ การ วัด ความ จํา
- ○ กําลังประมวลผลการติดตามความล่าช้า
- ○ การ จับ และ การ ปรับ ตั้ง ตัว เอง ให้ เหมาะ กับ เครื่อง กรอง แบบ ต่าง ๆ
- ○ เขียน แบบ บัค (หาก ไม่ ทํา ตาม)
- ○ การ หยุด งาน อย่าง ดี และ การ ตรวจ สุขภาพ
ทรัพยากรเพิ่มเติม
- Solana เครือข่าย SDK (SDK) (SDK) สืบค้นเมื่อ ค.ศ.Geyser gRPC รองรับ: https://github.com/ValidatorsDAO/solana-stream