2017-01-12 4 views
3

프로젝트를 현재 모 놀리 식 상태에서 마이크로 서비스 아키텍처로 이동하려고합니다. 프로젝트는 Node.js에 있으므로 모듈을 사용하여 Seneca.js을 조사하기 시작했습니다. 마이크로 서비스에 이미지 조작 (자르기, 크기 조정 등)이 가장 현명한 첫 단계로 보였습니다. 이제는 응용 프로그램의 속도를 크게 떨어 뜨리기 때문입니다.마이크로 서비스 간 파일 공유

응용 프로그램이 모 놀리 식 일 때 특정 파일을 파일 조작 논리로 전달하는 데 문제가 없습니다. 단지 로컬 저장 디스크에서 파일을 읽는 것뿐입니다. 그러나 마이크로 장치를 사용하면 확장 성을 기억하면 더 어려워집니다. 물론, 이미지 조작 마이크로 서비스를 구축하고 동일한 호스트 컴퓨터 내에서 까지 확장하고 내가 필요로하는 디렉토리를 공유 할 수 있으므로 로컬 디스크에서도 읽을 수 있습니다.

내가 다른과 다른 시스템에서 실행하고 확장 할 수있는 진정한 확장 성 microservice, 원하는 경우 가 동일한 파일 시스템를 공유하지 않는 IP를-adresses 무엇

? 아마도 노드의 스트리밍 API를 활용하여 HTTP 또는 TCP 또는 소켓을 통해 이러한 파일을주고받을 수 있다고 생각했습니다.

내가 배운 한, Seneca.js는 올바른 방법으로 을 할 수 없습니다.

fs.createReadStream('/files/hello.jpg') 
    .on('data', function(data) { 
    seneca.act({ role: 'file', cmd: 'chunk', data: data }, cb); 
    }) 
    .on('end', function(err) { 
    seneca.act({ role: 'file', cmd: 'end' }); 
    }) 
    .on('error', function(err) { 
    seneca.act({ role: 'test', cmd: 'error' }); 
    }); 

을 그리고 덩어리에 나타납니다 : 물론, 난과 같이 Seneca.js를 통해 이미지 조작의 서비스에 주요 응용 프로그램에서 파일을 보낼 수

seneca.add({ role: 'file', cmd: 'chunk' }, writeToFileCb); 
seneca.add({ role: 'file', cmd: 'end' }, endFileWriteCb); 

을하지만이 방법은 추한 및 휠 보인다 - 예방.

또 다른 방법과 같이, 일부 HTTP 서버에 와서 multipart/form-data 또는 application/octet-stream로 파일을 전송하는 것입니다 :

fs.createReadStream('file.json') 
    .pipe(request.post('http://image-manipulator')) 

하지만이 microservice 통신을위한 프레임 워크를 개혁 의미한다. 전체적으로 분산 마이크로 서비스와 가능한 프레임 워크 간의 파일 공유에 대한 자문을 구합니다.

+0

멋진 형용사 - * wheel-reinventive *. 나는 그것을 기억할 것이다. –

답변

1

마이크로 서비스 아키텍처에 접근하는 경우 파일 관리를위한 마이크로 서비스가 필요합니다. 마이크로 서비스 환경에서는 파일을 스트리밍하지 마십시오. 예를 들어, CRUD 구현을 위해 공개 된 API를 사용하여 FileManagerService를 만들고 중요 데이터 ... file-url, size 등을 제공하기 위해 seneca act/add 만 사용할 수 있습니다.

+0

감사합니다. 유일한 문제는 분산 시스템이라면 부하 분산을 위해'FileManagerService' 사본을 추가로 만들 수 있습니다. 그런 다음이 모든 서비스를 정확히 동일한 데이터와 동기화해야합니다. 어떤 종류의 프록시를 만들거나'FileManagerService'의 실행중인 모든 인스턴스에 파일을 업로드해야합니다. "보너스"로서 새로 작성한 서비스의 모든 내용을 기존의 것부터 복사하는 논리를 작성해야합니다 :) 마이크로 서비스는 솔루션보다 더 많은 고통을주고 있습니다. –

1

세네카를 사용하는 경우 The Tao of Microservices, Richard Rodger에 의해 세네카 자신의 저자를 읽을 것을 권장합니다.

대역폭 문제 :

그는 귀하의 질문에 직접이 방법 (제 3 장 제 15 절)을 해결합니다.

마이크로 서비스 시스템의 네트워크 특성은 대역폭 제한에 매우 취약하다는 것을 의미합니다. 당신이 풍부한 공급으로 시작하더라도, 당신은 희소성의 정신을 채택해야합니다. 마이크로 서비스를 잘못 사용하면 내부에서 생성 된 서비스 거부 공격이 쉽게 발생할 수 있습니다. 메시지를 작고 가늘게 유지하십시오.실제 데이터를 많이 보내지 않으려면 대신 대량 데이터 저장소에 대한 참조를 보냅니다. [...]

서비스간에 이미지를 보내려면 이미지 바이너리 데이터를 보내지 말고 이미지를 가리키는 URL을 보내십시오.

특정 사례로 돌아가서 파일을 저장/검색하고 Seneca 서비스 사이의 메시지에있는 파일의 URL 만 전달할 수있는 서비스를 사용해야합니다. 그러한 시스템을 순수한 분산 방식으로 구축하는 것은 쉽지 않으므로 AWS S3 또는 동등한 것을 사용하고 싶습니다.

+0

그러면 api gateway에서 S3에 연결하고 업로드하기위한 일부가되어야하며 파일 데이터가있는 메시지를 서비스에 보내야합니다. –

+0

아니요 : - 클라이언트는 API 게이트웨이와 만 통신합니다. API 게이트웨이 만 서비스를 호출 할 수 있습니다. - 파일 메타 데이터 (이름, S3 URL 등 ... 데이터는 아니지만)를 업로드/다운로드하는 명령/쿼리는 서비스 (작은 크기의 메시지)를 사용합니다. 그러면 클라이언트가 API 게이트웨이에서 메타 데이터를 가져옵니다. - 실제 데이터는 서비스를 사용하지 않고 '대역 외'로 다운로드됩니다 (메시지에는 너무 큽니다). 상황에 따라 다른 방법 : - URL을 노출해도 클라이언트가 직접 다운로드합니다. - API 게이트웨이가 S3 파일을 다운로드하고 콘텐츠를 클라이언트에 전달합니다. –

+0

하지만 S3에 업로드하려면 파일 데이터가 필요합니다. , 그래서 파일 데이터를 업로드해야 할 파일 서비스에 전송 한 seneca 메시지가 필요합니까? –