Geyser gRPC - 모범 사례
이 가이드는 견고한, 생산-ready 응용 프로그램을 구축하기위한 필수 패턴을 다룹니다. Geyser gRPC. Solana Stream SDK 지원 Geyser gRPC.
시작하기
- 간단한 시작: 슬롯 구독을 사용하여 복잡한 필터를 추가하기 전에 스트리밍에 익숙해지기 시작합니다.
- 필터를 현명하게 사용하십시오: 대역폭/을 줄이기 위한 필요만 구독하십시오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()
}연결 관리
- 자동 연결: 네트워크 문제를 기대; exponential 백 오프와 다시 연결.
- Ping/pong 취급: Yellowstone gRPC 서버는 ping을 보냅니다. 항상 pong 또는 서버와 응답은 연결 (일반적인 원인의 ~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?;
}- Gap 회복: 사용
from_slot데이터 손실 (duplicates 허용)을 방지하기 위해 다시 연결 후.
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
};건축 패턴
- 채널과 분리된 진입 및 처리는 사업 논리에서 네트워크 IO를 분리하고 backpressure를 추가합니다.
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- 결합된 채널을 사용: 처리 속도와 자료 손실 포용력 (smaller = 더 적은 기억, 더 하락에 근거를 둔 수용량을 선택하십시오; 더 큰 = 더 많은 기억, 더 적은 하락).
성과 및 탄력
- 임계값이 초과될 때 모니터 처리 대기시간 및 로그.
- 배치 DB 쓰기; 배치 크기 또는 간격에 플러시.
- 외부 통화에 대한 async IO를 사용합니다. worker 작업/threads에 대한 의거한 compute를 해제하십시오.
- 할당을 줄이기 위해 구독 요청을 재사용합니다.
오류 처리
- Distinguish 오류 유형 (대 채널 처리 대 스트림).
- 재연결에 노출된 백오프 (최초, 적당한 최대 모자).
- Log/metric는 느린 소비자 조건을 추적하는 업데이트가 떨어졌습니다.
Data Management(데이터 관리)
- 사용시 핸들 중복
from_slot(시간 반동 캐시 또는 DB 제약). - 사용 케이스 당 약속을 선택하십시오:
- 처리: 빠른 대쉬보드, 뒤를 구출지도 모릅니다
- 확인: 대부분의 apps/indexers를 위한 좋은 과태
- 최종화: 절대 특정이 필요한 경우
동적 구독
런타임(hot-swap filter, expand apply)에서 구독을 업데이트하는 양방향 스트림을 사용합니다.
회사 소개
- ✅ 자동차 연결은 폭발성 백오프로
- ✅ Gap 복구 사용
from_slot - ✅ Ping/pong 처리 (아보이드 30s 차단)
- ✅ 분리된 진입 및 처리와 경계 채널/backpressure
- ✅ 오류 로그 및 메트릭 / 알러지
- ✅ 처리 대기 시간 추적
- ✅ 중복 처리 및 필터 최적화
- ✅ 일괄 쓰기 ( persisting 경우)
- ✅ Graceful 폐쇄 및 건강 검사
추가 리소스
- Solana Stream SDK (스트림 SDK)Geyser gRPC 지원): https://github.com/ValidatorsDAO/solana-stream