Firebase Pro Series: Debugging Realtime Database Performance

TYLER ROCKWOOD : 저는 로봇이 아닙니다 약속드립니다

프로파일 러 그게 더 좋은가요? 프로파일 러? [LAUGHS] [음악 재생] 안녕 모두들 Firebase Pro 시리즈에 오신 것을 환영합니다 이 강의는 고급 주제를 가르치는 시리즈입니다 Firebase를 만드는 데 도움을주는 사람들이 제 이름은 Tyler Rockwood입니다

저는 사이트 신뢰성 엔지니어입니다 실시간 데이터베이스 그것은 내가 말하는 멋진 방법 일뿐입니다 데이터베이스에 전력을 공급하는 서버를 유지하는 작업 달리기 실시간 데이터베이스는 트래픽이 많은 앱, 그러나 데이터 레이아웃을 적절하게 설계하지 않은 경우, 느린 쿼리, 높은 데이터베이스 등의 문제가 발생할 수 있습니다

로드 및 값 비싼 대역폭 사용 다행히도 저는 도구가 있습니다 무슨 일이 벌어지고 있는지 이해하도록 돕기 위해 만들어졌습니다 귀하의 실시간 데이터베이스 이를 실시간 데이터베이스 프로파일 러라고 부릅니다

오늘, 우리는 프로파일 러에 대해 깊이있는 다이빙을 할 것입니다 우리는 몇 가지를 다루기 위해 그것을 사용할 것입니다 Google에서 제공하는 측정 항목에 대해 알아 보겠습니다 그게 무슨 뜻인지, 우리는 가고있어 이러한 측정 항목을 사용하여 두 가지 예를 식별하는 방법을 배우십시오

문제 이러한 측정 항목의 의미를 이해하려면 새로운 빈 데이터베이스를 프로파일 링하는 것으로 시작하겠습니다 프로파일 러를 실행하려면 Firebase CLI를 설치해야합니다 프로파일 러는 Firebase CLI의 일부로 번들로 제공됩니다 설치하려면 npm install을 실행합니다

– 글로벌 firebase-tools CLI를 설치하면 로그인합니다 프로젝트를 초기화하십시오 나는 이미이 모든 단계를 완료했습니다 그래서 프로파일 링으로 곧바로 건너 뛸 것입니다

그래서 우리는 데이터베이스를 프로파일 링하려고합니다 어떻게해야합니까? firebase database : profile 명령을 실행하고 싶습니다 일단 우리가이 명령을 실행하면, 어떻게 될 것인가? 프로파일 러가 작업을 요청하기 시작할 것입니다 귀하의 실시간 데이터베이스에서 실시간 데이터베이스는 작업이 진행됨에 따라, 각 작업에서 일어나는 일을 스트리밍 할 것입니다 그것은 CLI로 진행됩니다

그리고 거기에서 일단 Enter를 누르면, Firebase CLI가 집계됩니다 모든 작업을 보고서로 작성하여 간편하게 수행 할 수 있습니다 이해하다 지금 당장 우리는 진행 중이므로 시뮬레이션 할 것입니다 진짜 빨리로드하고, 그러면 우리는 이 작업들이 들어오는 것을보십시오 보시다시피, 우리는 104 가지 작업을 수집했습니다

프로파일 러에서 그리고 우리가 충분한 작업을 수집 한 것처럼 느껴질 때마다, Enter 키를 누르면 프로파일 러가 보고서를 생성합니다 그래서 우리는 Enter를 누르고 보고서가 생성됩니다 보고서는 세 부분으로 나뉩니다 속도 보고서, 대역폭, 그리고 나서 인덱싱되지 않은 쿼리

속도 보고서가 첫 번째 섹션입니다 그리고 당신이 볼 수 있듯이, 그것은 읽기, 쓰기, 및 방송 따라서 읽기 속도에는이 표에 네 가지 열이 있습니다 경로, 개수, 평균 및 사용 권한이 거부되었습니다 따라서 경로, 개수 및 평균 당신이 기대할 수있는 것이 전부입니다

데이터베이스의 속도와 빈도입니다 읽습니다 허가가 거부 된 칼럼도 있습니다 귀하의 보안 규칙이 잘못 구성되었거나 요청하는 앱이있는 경우 그들은해서는 안된다 보통, 그것은 필요한 기호입니다

보안 규정을 파헤 치고, 앱이 작동하는지 살펴보고 확인합니다 그것이 없어야한다고 읽는다 쓰기 속도는 비슷합니다 설정, 업데이트 및 삭제 작업에만 사용됩니다 네가하는 일이야

마지막 섹션은 브로드 캐스트 속도입니다 방송 속도 란 무엇입니까? 초기 쿼리 이후에 소요되는 시간입니다 데이터가 특정 위치에서 업데이트되면, 서버가 해당 업데이트를 처리하고 발송합니다 여기에서 볼 수 있습니다 글을 쓰면 모두 처리됩니다

밀리 세컨드 이하 대역폭 보고서는 다음 섹션입니다 그리고 그것은 두 가지 범주로 나뉘어집니다 서버에서 다운로드 한 바이트와 바이트 서버에 업로드되었습니다 다운로드 된 바이트는 읽기에 해당합니다

및 서버로부터 전송 된 업데이트들, 업로드 된 바이트는 클라이언트가 서버 만들기 그래서 우리가 여기서 측정하고있는 바이트들, 캡처 한, 유효한 법안이 아닙니다 대역폭 청구서의 대역폭 청구서에는 SSL과 같은 기타 오버 헤드가 포함됩니다 오버 헤드 및 HTTP 헤더 이것은 직렬화 된 원시 JSON 데이터입니다

앞뒤로 보낸 이것들이 매우 유사한 방식으로 분리되어 있음을 볼 수 있습니다 속도 보고서 대신, 속도 대신에, 이것들은 보내지는 데이터의 크기에 불과합니다 그래서 / test / data / $ 와일드 카드에서, 우리는 50 킬로를 넘는 12 킬로바이트를 보냈습니다 평균적으로 220 바이트의 데이터가 전송되었습니다

보고서의 다음 섹션과 마지막 섹션은 인덱싱되지 않은 쿼리입니다 보통 이것은 빈 섹션이됩니다 그러나 그것이 비어 있지 않다면 그것은 정말로 당신이 주의를 끌 필요가있다 인덱싱되지 않은 쿼리는 클라이언트 SDK, 이 데이터를 쿼리하는 인덱스 대신에, 서버는 그 위치에있는 모든 데이터를 전송합니다 그런 다음 쿼리가 수행됩니다

클라이언트에서 장치에 이것들은 당신에게 매우 비싼 작업으로 이어질 것입니다 여기에 경고를 추가하면 색인을 추가해야합니다 현재 시간 필드에 대한 at / testdata, 네가있을 때이 두 가지 질문이 일어 났어 프로파일 링

그래서 이것은 당신에게 얼마나 많은 시간이 일어나고 있는지 측정합니다 우리 SDK는 또한 콘솔에서이 경고를 제공합니다 그러나 당신이 그것을 개발에서 놓친 경우에 대비하여, 프로파일 러에서 여기에 잡을 수 있습니다 이제 이러한 측정 항목의 의미를 알았으므로 프로 파일러를 사용하여 프로덕션에서 데이터베이스를 봅니다 우리가 어떤 문제를 찾을 수 있는지보십시오

그러나 잠깐, 당신은 궁금해 할지도 모른다 프로덕션 환경에서 Profiler를 실행하는 이유는 무엇입니까? 속도 저하 및 기타 성능 문제가 발생하지 않아야합니까? 하지만 그렇지 않습니다 우리는 그것을 생각했다 프로파일 러는 프로덕션 환경에서 실행되도록 설계되었습니다 오버 헤드없이

모든 상황에서 사용하는 것이 안전합니다 프로필러를 시작하고 살펴 봅시다 이 데이터베이스에서 다시 한번 프로파일 링 명령을 실행합니다 firebase database : profile입니다

이 인스턴스 플래그가 무엇인지 직접 묻고있을 수 있습니다 내가주는거야? 이는 다중 DB 기능의 일부이며, 동일한 프로젝트에서 여러 데이터베이스를 보유 할 수있는 방법입니다 나는이 데모 방법을 쓰기 쉽도록 만들었습니다 입력을 누르면 프로파일 링을 시작합니다 여기에서 볼 수 있듯이 약 3,000 건의 작업을 캡처했습니다

그런 다음 Enter 키를 눌러 보고서를 생성합니다 그래서 나는이 보고서를보고 모든 이슈를 찾고 있습니다 내가 속력 보고서를 들여다 보면, 나는 나에게 튀어 나오는 것을 보지 못한다 모든 것이 매우 빠르게 진행되는 것처럼 보입니다 모든 작업은 밀리 초 미만입니다

매우 신속하게 처리 할 수 ​​있습니다 대역폭 보고서로 이동하십시오 그리고 무슨 일이 일어나고 있는지보십시오 대역폭 보고서를 보면 모든 것이 정상적으로 보입니다 / chatrooms / $ 와일드 카드

모든 작업이 다운로드되는 것처럼 보입니다 1 메가 바이트 이상의 데이터 우리가 간파 한 짧은 프로필에서 볼 수 있듯이, 우리는 해당 위치에서 200 메가 바이트 이상의 데이터를 다운로드했습니다 그것은 매우 비싼 대역폭까지 합칠 것입니다 장기적으로 청구서를 살펴보고이 위치에서 무슨 일이 일어나고 있는지 확인하십시오

그래서 당신은 볼 수 있습니다, 우리는 콘솔에 있습니다, 우리 데이터베이스를 보았습니다 Firebase Console이 실행되었습니다 읽기 전용 및 비 실시간 모드 이 모드가 아닌 경우 브라우저 전송되는 모든 데이터로 압도 될 것입니다 그래서 우리는 우리의 구조를보고 있습니다

우리는 대화방과 하나의 대화방을 가지고 있습니다 그리고 각 채팅룸마다 회원, 메시지, 그리고 그 이름 그리고 여기서 일어나는 일은 언제입니까? 사용자가 앱을 열고 찾고 있습니다 그들의 모든 대화방에서, 그리고 그들은 또한 모든 메시지를 다운로드하고 모두 그 chatroom에 대한 회원의 보시다시피 여기에 많은 메시지가있을 수 있습니다

이것이 바로이 높은 대역폭으로 인한 결과입니다 용법 키를 공유하면 섹션을 다운로드 할 수 있습니다 우리가 필요로하는 데이터베이스의 예를 들어 메시지 만 또는 구성원 만 – 모든 것을 다운로드해야하는 것과는 대조적으로 매번 그 결과로 엄청난 대역폭 사용량이 발생합니다 프로파일 러에서 보았던 프로파일 러를 사용하여 하나의 데이터베이스에서 문제를 해결했습니다

이제 다른 데이터베이스를 살펴 보겠습니다 거기에 문제가 있는지 찾아 봐 다시 한번 우리는 firebase 데이터베이스를 할 것입니다 : profile 이번에는 다른 인스턴스를 선택하겠습니다 우리는 우리의 프로파일을 조금 수집 할 것입니다 속도 보고서를 다시 살펴 보겠습니다

시작되는 점은 메트릭의 읽기 속도입니다 매 초마다 1 초 이상 걸립니다 다른 프로필 보고서보다 길어요 우리가 아직 보았다 지금까지 그들은 모두 1 밀리 초 미만이었습니다

그리고 이것은 1 초 걸립니다 분명히 여기에 문제가 있습니다 대역폭 보고서를 계속 살펴 보겠습니다 더 이상의 문제가 있는지 확인하십시오 대역폭 보고서를 보면 모든 것이 정상적으로 보입니다

이제 이동하여 데이터 구조를 살펴 보겠습니다 읽기 속도로 어떤 일이 진행되고 있는지 확인하십시오 그래서 우리는이 데이터베이스가 기본적으로 하나, 길고 평평한 목록 이 메트릭 노드 아래에 모두 있습니다 Firebase 푸시 ID가 여러 개 있습니다

각 푸시 ID 아래에는 사용자가 취한 조치가 있으며, 시간 및 사용자 실제로 여기서 수행하는 작업은 모두 쿼리를 수행하는 것입니다 매번 마지막으로 몇 가지 조치를 취하십시오 이 데이터를 재구성하여 예방할 수 있는지 알아 봅시다 쿼리를 전혀하지 않아도됩니다

따라서 조치, 시간 및 사용자를 필드로 갖는 대신, 우리는 그것들을 열쇠의 일부로 옮기고 싶다 우리는이를 색인으로 사용할 수 있습니다 그럼, 우리는 단지 메트릭스, 액션, 특정 시간대에 승리하면 질의를 할 필요없이 모든 정보를 얻으십시오 그리고 우리는 시간과 사용자를 위해 똑같은 일을 할 수 있습니다 실시간 데이터베이스 프로파일 러에 대한 모든 것이 오늘입니다

더 배우고 싶다면 코멘트를 남기고 우리는 당신이 우리가 원하는 것을 알고 있습니다 이 비디오가 마음에 들면, 꼭 맞춰주세요 그 엄지 손가락 업 버튼과 구독하여 최신 상태로 유지 모든 동영상과 함께 나는 Tyler Rockwood이고, Firebase에 들러서 고마워 프로 시리즈