• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

배압 전략 중에서 DROP 전략과 관련해서 질문 있습니다.

22.05.02 11:10 작성 조회수 204

0

안녕하세요, 강의 진짜 재밌게 보고 있는 수강생입니다 ^^.

Observable과 Flowable에 대한 이해

강의를 보다 조금 애매한 부분이 생겨서 질문드릴게 있습니다.

 

질문1.

제가 처음에 인지했던 DROP전략은 27:54 에 나오는 대로

"버퍼가 비워지는 시점에 Drop 되지 않은 데이터"가 버퍼에 담긴다는 걸로 인식 했습니다.

그런데 강의 32:56 쯤에 "소비자 쪽에서 데이터의 처리가 끝나지 않으면 생산자 쪽에서 통지한 데이터는 DROP이 된다"라고 알려주십니다.

처음에는  "버퍼가 비워지기 전까지"가 DROP의 조건이였는데, 그 이후에 들은 건 "소비자가 데이터 처리를 계속 하고 있는 상태일 때"가 DROP 조건으로 바뀌는 거 같은데... 정확히 어떤게 맞는 건가요?

 

질문2.

29:04 의 배압전략(DROP 전략) 그림에서는 버퍼의 크기가 그림으로 보였는데, 그 이후 코드를 보여주실 때(29:14)는 그런 버퍼의 크기를 지정하는 부분이 보이지 않습니다.

버퍼의 크기가 어떻게 지정된 건가요? 그리고 현재 코드 상에서는 버퍼의 크기가 어떻게 되나요?

 

답변 1

답변을 작성해보세요.

1

안녕하세요? ^^

좋은 포인트를 지적해주셔서 너무 감사드립니다.

먼저 질문하신 부분 답변부터 먼저 드리자면,

 

질문1.

제가 처음에 인지했던 DROP전략은 27:54 에 나오는 대로

"버퍼가 비워지는 시점에 Drop 되지 않은 데이터"가 버퍼에 담긴다는 걸로 인식 했습니다.

...
...
처음에는  "버퍼가 비워지기 전까지"가 DROP의 조건이였는데, 그 이후에 들은 건 "소비자가 데이터 처리를 계속 하고 있는 상태일 때"가 DROP 조건으로 바뀌는 거 같은데... 정확히 어떤게 맞는 건가요?

--> 질문자님이 생각하신대로 "버퍼가 비워지기 전까지"가 DROP의 조건이 맞습니다.
아마도 "소비자가 데이터 처리를 계속 하고 있는 상태일 때" 이 부분은 "소비자가 데이터 처리를 계속 하고 있는 상태일 때, 그로 인해 버퍼가 가득 찬 상태라면 버퍼가 비워지 전까지..." 라는 표현이 생략되었다고 보시면 되겠네요. ㅡ,.ㅡㅋ 

저도 사람이다보니 100퍼센트 완벽하게 수강생분들이 이해할 수 있도록 강의를 만들면 좋았을텐데 때때로 놓치게 되는 부분이 있네요. 아무튼 혼란을 드려서 죄송합니다 ㅡ.ㅡ

 

질문2.

29:04 의 배압전략(DROP 전략) 그림에서는 버퍼의 크기가 그림으로 보였는데, 그 이후 코드를 보여주실 때(29:14)는 그런 버퍼의 크기를 지정하는 부분이 보이지 않습니다.

버퍼의 크기가 어떻게 지정된 건가요? 그리고 현재 코드 상에서는 버퍼의 크기가 어떻게 되나요?

--> 

[그림 1-1] Flowable API Docs

[그림 1-1] Flowable API Docs를 보시면 디폴트 버퍼 사이즈가 128인것을 알 수 있습니다.

 

[그림 1-2] Scheduler를 통한 버퍼 사이즈 설정

예제 코드에서는 수강생분들의 이해를 돕기 위해 observOn() Operator를 통해 버퍼 사이즈를 1로 지정했습니다.

 

질문하신부분에 대한 답변이 되셨을까요? ^^

또 질문이나 의견 필요하시면 언제든지 편하게 남겨주세요.

감사합니다! 

식빵님의 프로필

식빵

질문자

2022.05.03

친절한 답변 감사합니다! 

질문1, 2 모두 이해가 됐습니다!

 

그런데 질문2에 대한 답변을 보고 또 다시 의문점이 들었습니다.

강의 23:40 에서 onObserveOn 메소드의 3번째 파라미터는 "버퍼 사이즈라기보다는 요청하는 데이터의 개수를 의미합니다"라고 말씀해주셨습니다.

그 이후 강의를 조금만 더 진행하면 onBackpressureBuffer 메소드의 1번째 파라미터가 버퍼의 사이즈로 설명해주시는 거 같습니다. (제가 착각하는 걸 수도 있습니다)

그런데 지금 질문2에 대한 답변에서는 다시 onObserveOn 메소드의 3번째 파라미터의 의미가 "버퍼 사이즈"로 해석됩니다.

혹시 제가 지금 뭔가 놓치고 있는걸까요?

음.. 이건 제 설명의 실수인 것 같습니다.

질문자님이 얘기하셨던,

'강의 23:40 에서 onObserveOn 메소드의 3번째 파라미터는 "버퍼 사이즈라기보다는 요청하는 데이터의 개수를 의미합니다"라고 말씀해주셨습니다.'

--> 이 부분에서 "버퍼 사이즈라기보다는 요청하는 데이터의 개수를 의미합니다"라는 이 부분의 설명이 잘못 된것 같아요. 

요청하는 데이터의 개수가 아니라 버퍼 사이즈가 맞습니다.

다만, 제가 설명에서 놓친 부분이 있는 것 같네요. onBackpressureBuffer() 예의 경우, 

onBackpressureBuffer() Operator에서 버퍼링을 한번하고 있고, observeOn()에서 버퍼링을 한번 더 하고 있다고 보시면 됩니다.

단, onBackpressureBuffer() Operator의 버퍼에는 버퍼 전략이 적용되어 있고, observeOn()의 버퍼에는 별도의 버퍼 전략이 적용되어 있지 않는다는 차이가 있습니다.

 

실제로 onBackpressureBuffer() Operator를 주석처리하고 실행해보면 observeOn()에서 버퍼 사이즈를 1로 지정했기 때문에 버퍼가 가득차서 MissingBackpressureException이 발생합니다.

 

제가 잘못 설명드린부분이 있는게 명백해서 별도의 공지나 아니면 강의 영상을 다시 편집해서 올리는 방향으로 고민해보겠습니다.

좋은 질문해주시고, 의문 주셔서 너무너무 감사드립니다!

좋은 개발자가 되시길 진심으로 기원할게요. ^^;