2014-12-19 2 views
1

golang에 비디오 스트림 용 캐싱 프록시를 작성하려고합니다.골란에서 네트워크 스트림 캐싱?

제 질문은 다중 연결간에 많은 양의 데이터 스트리밍 복사본을 배포하는 방법입니까?

또는 여러 goroutines의 데이터를 저장 (캐시)하고 안전하게 (그리고 빠르게) 액세스하는 방법은 무엇입니까?

뮤텍스 및 채널과 함께 여러 옵션을 시도했지만 작동하지 않았습니다. 오류가있는 샘플은 거의 없습니다.

버전을 단순화된다 : 하나의 클라이언트가 차단되기 시작) 판독했지만 그다지 연결을 닫고 (기입하도록 호출이 중지 될 때 버전

... 
var clients []*client 
func new_client(conn net.Conn) { 
    client := &client{ 
     conn: conn, 
    } 
    clients = append(clients, client) 
} 
... 
func stream(source io.Reader) { 
    buf := make([]byte, 32*1024) 
    for { 
     n, _ := source.Read(buf) 
     for _, client := range clients { 
      wn, e := client.conn.Write(buf[0:n]) 
      // blocks here for all clients if one of clients stops reading 
     } 
    } 
} 

문제이다. goroutine (클라이언트의 뮤텍스 잠금 포함)의 Write() 호출을 사용하면 채널이 지연되는 것과 비슷하지만 (다음 예제) goroutine의 실행 순서가 보장되지 않습니다.

 for _, client := range clients { 
      client.conn.SetWriteDeadline(time.Now().Add(1 * time.Millisecond)) 
      wn, e := client.conn.Write(buf[0:n]) 
     } 

제한 시간을 증가, 그것은 차단에 도움이되지만 느린 클라이언트가 시간에 읽을 수 없습니다 - 지연 반환

나는 이런 식으로 그것을 해결하기 위해 노력했다.

나는이 같은 시도 :

... 
var clients []*client 
func new_client(conn net.Conn) { 
    client := &client{ 
     buf_chan: make(chan []byte, 100), 
    } 
    clients = append(clients, client) 
    for { 
     buf <- client.buf_chan 
     n, e := client.conn.Write(buf) 
    } 
} 
... 
func stream(source io.Reader) { 
    buf := make([]byte, 32*1024) 
    for { 
     n, _ := source.Read(buf) 
     for _, client := range clients { 
      client.buf_chan <- buf[0:n] 
     } 
    } 
} 

을 그러나이 버전 - 플레이어에서 비디오 스트림이 지연, 점점 지연을 시작하므로, 채널 및 다른 쪽 끝에서받을 수있는 전송 사이에 약간의 지연이있다.

이동 중에도 일부 패키지에 대한 조언이나 이러한 종류의 작업을위한 디자인 패턴이 있습니까?

도움 주셔서 감사합니다.

답변

0

채널 버전에서는 클라이언트가 느려질 수도 있습니다. 느린 클라이언트가 buf_chan를 가득 채울 수 있기 때문에 buf_chan에 쓰기가 차단됩니다. 그것을 피할 수있는 선택 Wrappper :

select { 
case client.buf_chan <- buf[0:n]: 
default: 
//handle slow client ...  
} 
+0

덕분에, 난, buf_chan cannel 버퍼 크기를 모니터의에 allways 1 (0) 읽기 후, 난 그냥 내가 지연 문제는 다른 곳에 생각, 테스트 버퍼링했다 – user1579228

관련 문제