https://nodejs.org/api/stream.html#buffering 글을 참고했습니다.
Writable Readable 모두 buffer를 사용하여 buffer 안에 데이터를 저장한다.
데이터 양은 highWaterMark 설정에 따른다.
highWaterMark 기본값은 16Kib (커스텀 시기본단위는 bytes)이고 objectMode일 때는 16개 이다.
Readable stream일 때 stream.push를 호출하면 데이터가 버퍼 안에 저장이 된다. consumer가 stream.read를 호출하지 않는 다면 해당 데이터는 내부 큐에 계속 남아 있게 된다.
highWaterMark에 의하여 설정된 threshold 만큼 버퍼에 데이터가 차면, 스트림은 일시적으로 데이터를 읽는 것을 멈춘다.
const Stream = require('stream')
// 문자 길이가 5인데도 6으로 하는 이유는 문자열이 끝났음을 확인시켜주는 쓰레기 값이 있기 때문이다.
// c개발할 때 메모리 까보면 알 수 있다.
const readable = new Stream.Readable({ highWaterMark: 6 })
for (let i = 0 ; i < 10; i ++) {
console.log(i, readable.push('hello'))
}
0 true
1 false
2 false
3 false
4 false
5 false
6 false
7 false
8 false
9 false
Writable stream일 때는 writable.write() 호출을 반복적으로 하면 버퍼에 데이터가 쌓인다. Readable과 마찬가지로 highWaterMark에 의해 버퍼가 기준치에 차면, writable.write()은 false를 반환한다. 그렇지 않으면 true를 반환한다.
const readable = new Stream.Writable({ highWaterMark: 6 }) //1kb = 1024 bytes
for (let i = 0 ; i < 10; i ++) {
console.log(i, readable.write('hello'))
}
0 true
1 false
2 false
...
stream API의 주요 목표, 대표적으로 stream.pip() 메소드는 사용 가능한 메모리를 잘 활용할 수 있게 데이터를 보내고 받는 속도를 다르게 설정하는 것이다.
highWaterWark은 limit이 아니고 threshold다. 그러니까 엄격히 제안하겠다는 것이 아니라, 데이터 추가 요청을 멈추기 전에 이미 threshold 기준 만큼 데이터를 버퍼에 저장될 수 있다. 설정을 통해 엄격하게 제안 할 수 있다. (의역을 조금했습니다. 다르게 해석되었다면 댓글 부탁드립니다.)
threshold를 6bytes로 설정했다. 11개 문자를 가진 문자열을 10번 추가 시도했다.
strict limit이라면 첫번째부터 실패해야하지만, 결과로써 그렇지 않는다는걸 보여준다.
const Stream = require('stream')
const readable = new Stream.Writable({ highWaterMark: 6 }) //1kb = 1024 bytes
for (let i = 0 ; i < 10; i ++) {
console.log(i, readable.write('hello world'))
}
0 true
1 false
...
Duplex와 Transform은 Readable과 Writable 모두 가능하기 때문에, 효율적인 데이터 흐름을 위해 서로 다룬 두개의 내부 버퍼를 독립적으로 관리된다. 예를들면 net.Socket는 Duplex stream의 객체이므로 Readable side에서는 소켓으로부터 데이터를 읽고, Writable에서는 소켓에 데이터를 작성한다. 데이터를 받는것보다 쓰는것이 느릴 수도 있고 빠를 수도 있기 때문에 각 영역에 독립적인 버퍼를 두어야 한다.
내부 버퍼링 구조는 언제든지 구현이 변경될 수 있다. 하지만 몇몇 최근에 만들어진 구현채들이 있는데 문서화되어있지 않는 것들은 사용하지 않길 권한다. ex) writable.writableBuffer, readable.readableBuffer
'IT > node.js' 카테고리의 다른 글
[node.js] stream - three states (5) (0) | 2024.05.05 |
---|---|
[node.js] readable stream - two modes (4) (0) | 2024.05.05 |
[node.js] stream - object mode (2) (0) | 2024.05.03 |
[node.js] stream api - sample code (1) (0) | 2024.05.03 |
node.js, single thread 아닌가요? (1) | 2024.05.03 |