Postman Engineering이 백만 개의 동시 연결을 처리하는 방법

Postman의 Server Foundation 팀은 Bifrost 웹 소켓 게이트웨이의 기원 이야기를 공유합니다.

(2020 년 12 월 22 일)

Marvel Cinematic Universe에서 Bifrost는 여러 영역 사이를 순식간에 이동할 수있는 무지개 다리의 이름입니다. 신과 인류. 마찬가지로 마술처럼 Bifrost 웹 소켓 게이트웨이를 사용하면 Postman 클라이언트가 Postman 서비스에 즉시 연결할 수 있습니다.

Unsplash

Toni Reed 의 사진

이전에 (Postman Engineering에서 Microservices를 수행하는 방법)에서 공유했듯이 모든 소프트웨어 아키텍처는 지속적인 작업 과정입니다. 현실 세계에서 운영한다는 것은 때때로 새로운 상황에 적응하기 위해 오래된 사고 방식을 재평가하는 것을 의미합니다. 이것이 바로 소프트웨어 디자인의 자연스러운 진화입니다.

다음은 Postman 엔지니어가 너무 커진 서비스를 제공하여 Bifrost 웹 소켓 게이트웨이를 개발 한 방법입니다.

개발팀은 Postman

Postman의 대부분의 개발 팀은 문서 또는 버전 제어 와 같은 단일 핵심 도메인에 초점을 맞춘 다기능 팀에서 작업합니다. 도메인 기반 설계 원칙에 따라 각 팀은 Postman 사용자를위한 내부 마이크로 서비스 및 Postman 기능을 개발합니다.

대부분의 엔지니어가 작업하는 동안 팀, 일부는 전체 엔지니어링 조직에서 공유되는 구성 요소를 구축하는 기능 팀에서 일합니다. Server Foundation 팀은 Postman의 기능 팀의 한 예입니다. 이 엔지니어는 다른 분대가 자신의 기능을 구축, 배송 및 관찰하는 데 사용하는 유틸리티를 만듭니다. 또한이 팀은 상주하는 AWS 및 인프라 전문가가 상주하는 곳입니다.

서버 재단 team은 전체 엔지니어링 조직에서 사용되는 항목을 만들고 관리하는 Postman의 기능 팀의 한 예입니다.

Postman의 대부분의 마이크로 서비스는 느슨합니다. 결합되어 다른 팀과 독립적으로 발전 할 수 있습니다. 안타깝게도 서비스는 때때로 너무 커져서 겉보기에 관련이없는 광범위한 서비스를 제공 할 수 있습니다. 이러한 서비스를 통해 팀은 빠르게 반복 할 수 있지만 부풀어 오른 돌기둥, 큰 진흙 덩어리 또는 다루기 힘든 생물체라고 부르고 싶은 것처럼 행동하기 시작할 수 있습니다.

이런 일이 Postman에서 발생하면 많은 엔지니어가 서로 다른 팀에서 코드에 기여하게되므로 각 업데이트에 대해 모든 팀에서 신중한 조정이 필요합니다.

모 놀리 식 동기화 서비스

너무 커진 Postman 서비스 중 하나 효율적으로 관리되는 것을 동기화라고합니다. 로컬 컴퓨터의 Postman 클라이언트의 모든 활동을 Postman 서버와 동기화하는 어려운 작업이 있습니다. Postman의 모든 사용자 작업은 publish-subscribe 패턴 에 따라 websocket 연결을 통해 처리되는 일련의 API 호출을 발생시켜 사용자와 사용자간에 정보가 실시간으로 흐르도록합니다.

예를 들어 Postman에 로그인하여 컬렉션을 업데이트하면 다음과 같은 일이 발생합니다.

  1. Postman 컬렉션에 매개 변수를 추가합니다.
  2. Postman은 프로필과 함께 저장된 버전 관리에 업데이트 기록을 보관합니다.
  3. Postman은 컬렉션 뷰어에게 실시간으로 최신 정보를 표시합니다.

동기화는 원래 컬렉션 업데이트와 같은 데이터베이스 트랜잭션을 처리하기위한 것입니다. 그러나 작년 이번에 Sync는 컬렉션을 구독하는 모든 사람에게 최신 버전을 알리고 표시하는 등의 추가 활동도 관리했습니다.

압박시 동기화

자동차를 만들 때 프레임은 다른 모든 구성 요소가 첨부됩니다. 프레임의 작은 균열은 큰 문제처럼 보이지 않을 수 있습니다. 저속에서는 눈에 띄지 않게 주행 할 수 있습니다. 그러나 더 빠른 속도에서는 정렬 불량을 증가시키는 파급 효과가 있습니다. 겉보기에 사소 해 보이는 균열로 인해 차량이 불타는 잔해로 확대 될 때까지 차량의 나머지 부분에서 진동이 증폭됩니다.

” 더 작은 시스템에서는 눈에 띄지 않게됩니다. 더 복잡한 시스템에서는 피할 수 없습니다.”
Kunal Nagpal , Postman의 엔지니어링 관리자

Sync는 Postman의 가장 초기 서비스 중 하나였으며 모 놀리 식 아키텍처를 통해 팀은 Postman 기능을 빠르게 제공 할 수있었습니다. 시간이 지남에 따라 점점 더 많은 책임을 처리하기 시작했습니다. 오늘날까지도 Sync 서비스는 엔지니어링 조직 전체에 광범위하게 영향을 미치고 있으며, 많은 엔지니어가 Sync가 예기치 않게 작동하거나 예정된 다운 타임이있을 때 고통을 느끼고 있습니다.

2019 년 Sync는 웹 소켓 연결과 데이터베이스를 모두 처리했습니다. 업무. 당시 1,100 만 명의 사용자들 사이에서 점점 더 많은 공동 작업이 이루어지면서 Postman은 최대로드시 백만 개의 동시 연결에 접근하고있었습니다.

Postman의 거의 모든 마이크로 서비스의 기반으로서 Sync에 대한 부담이 커지고있었습니다.

  • 백 프레셔로 인한 캐스 케이 딩 실패 : Sync에 대한 모든 배포는 연결된 Postman 클라이언트의 연결을 끊습니다. 웹 소켓을 통해. 백만 개의 소켓이 다시 연결되면 서버 리소스가 저하되어 더 많은 연결이 끊어져 예측 가능하지만 피할 수없는 급증이 발생하여 복구하는 데 6 ~ 8 시간이 걸릴 수 있습니다.
  • 사용자 경험에 미치는 영향 : 자주 발생하지는 않았지만 연결이 끊어지면 팀 작업 영역에서 최신 업데이트 및 활동을 보는 데 때때로 지연이 발생했습니다.
  • 높은 유지 관리 비용 : 모든 분대가 Sync에 의존했기 때문에 Postman의 거의 모든 엔지니어가 방법을 배워야했습니다. 끊어진 연결을 처리하고 새 연결을 시작한 다음 데이터 충돌을 조정합니다.

Server Foundation 팀은 웹 소켓 연결의 효율성을 높이고 자하는 동시에 연결을 동기화 서비스. 목적지는 분명했지만 도달 할 수있는 경로는 없었습니다.

“이것은 소프트웨어 디자인의 자연스러운 진화입니다. 마이크로 서비스는 민첩하게 시작하지만 구축되고 다시 분해되어야합니다. 더 많은 기능을 도입하려고했기 때문에 소켓 처리를 Sync와 분리하고 싶었습니다.”
Yashish Dua , 소프트웨어 엔지니어 Postman

일부 내부 서비스가 너무 커져 팀간에 신중한 조정이 필요합니다.

상황은 다음과 같습니다.

1 단계 : 조직의 동의를 얻었습니다.

해결해야 할 첫 번째 과제는 기술적 문제가 아니 었습니다. 이것은 Postman의 첫 번째 야심 찬 출시가 아닙니다. 엔지니어링은 사람들과 함께 시작하기 위해 과거의 이동에서 배웠습니다. 2019 년 10 월부터 Server Foundation 엔지니어는 목표를 더 광범위한 조직에 전달하고 모든 종속 서비스의 이점을 설명하기위한 일련의 검토를 진행했습니다.

이 새로운 시스템이 성공하면 끊어진 연결을 처리합니다. 그리고 그 여파를 다루는 것은 더 이상 평범하지 않을 것입니다. 이는 다른 엔지니어링 팀이 새로운 시스템을 지원하고 마이그레이션 할 수있는 실질적인 인센티브였습니다. 이 열린 의사 소통과 조정은이 프로젝트가 진행되는 동안 계속 될 것입니다.

2 단계 : 알려지지 않은 미지의 요소를 확인했습니다.

엔지니어링은 그들이 향하고있는 방향을 알고있었습니다. 그럼에도 불구하고 그들은 모든 시나리오를 검토하고 기본 개념을 더 잘 이해하는 데 시간이 걸립니다. 엔지니어들은 알려지지 않은 알려지지 않은 것보다 더 큰 위험을 초래할 수있는 예측할 수없는 조건을 식별하기 위해 다른 이해 관계자와의 탐색 세션을 예약했습니다.

Postman 조직은 연구 및 계획에 익숙하지만이 부분은 프로세스입니다. 이 변경의 중요한 특성으로 인해 평소보다 훨씬 오래 걸렸습니다. 그들은 다양한 옵션을 조사하고 보조 요구 사항을 고려하여 두 달 동안 계획을 세웠습니다.

3 단계 : Bifrost 웹 소켓 게이트웨이 구축

Bifrost는 다음과 같이 구성됩니다. 두 부분 :

  • 퍼블릭 게이트웨이 : 게이트웨이는 Fastify 웹 프레임 워크와 Amazon AWS를 사용합니다. 모든 웹 소켓 연결을 관리하는 중앙 메시지 브로커 역할을하는 Redis 용 ElastiCache.
  • 비공개 API : API 또한 Fastify를 낮은 오버 헤드 웹 프레임 워크로 사용하여 트래픽을 다른 내부 Postman 서비스로 프록시합니다.
Bifrost는 공용 게이트웨이와 Private API

4 단계 : 새 게이트웨이를 테스트했습니다.

Postman 엔지니어가 기능을 제공 할 준비가되면 관련 기능과 함께 기능을 테스트해야합니다. 거의 모든 Postman 기능이 웹 소켓에 의존하기 때문에이 릴리스에서는 모든 단일 기능을 테스트해야했습니다. 또한 웹 소켓의 자동 테스트 프레임 워크가 Postman에 아직 설정되지 않았으므로 모든 테스트는 Bifrost 이전에 수동으로 완료되었습니다. 생산에 사용할 수 있습니다.

고된 여정 이었지만 2020 년 1 월 말까지 엔지니어링에 개념 증명이 작동했습니다.

5 단계 : 새로운 제품으로 마이그레이션했습니다. gateway

Electron 앱이나 웹과 같은 모든 Postman 클라이언트는 Godserver라는 다른 핵심 서비스에 대한 초기 부트 스트랩 호출에 의존합니다. 이 서버는 클라이언트의 액세스 및 구성을 결정하고 엔지니어링이 증분 제품 출시를 제어하는 ​​방법입니다. 이것은 모두 Godserver에 의해 미리 결정되고 제어 되었기 때문에 Bifrost 게이트웨이로의 마이그레이션에는 단일 Postman 클라이언트 코드 업데이트가 필요하지 않습니다.

서버 재단 팀은 분대의 마이그레이션 단계, 필요한 코드 변경 및 구성을 설명했습니다. 적용합니다. 몇 주 동안 종속 서비스는 Sync에서 Bifrost 기반 웹 소켓 연결 처리로 전환되기 시작했습니다. Godserver는 Bifrost가 부하를 처리하고 엣지 케이스에 어떻게 대응했는지 확인하기 위해 점점 더 많은 트래픽을 새로운 웹 소켓 게이트웨이로 전환했습니다.

“중반에 항공기의 엔진을 교체하는 것과 같습니다. Flight.”
Numaan Ashraf , Postman의 엔지니어링 이사

6 단계 : 서비스를 확장했습니다.

Bifrost 게이트웨이가 작동하고있었습니다!

그러나 Postman은 게이트웨이가 계획 및 개발중인 동안 추가로 백만 명의 사용자를 확보했습니다. 그리고 다른 엔지니어링 팀은이 기간 동안 자체 작업을 일시 중지하지 않았습니다. 신뢰할 수있는 버전 제어 역할 기반 액세스 제어 (RBAC) 와 같은 새로운 공동 작업 기능 정보를 실시간으로 업데이트하기 위해 웹 소켓에 크게 의존합니다. 새로운 게이트웨이를 실제로 테스트 할 예정된 제품 릴리스가 넘쳐났습니다.

Bifrost는 증가하는 수요를 지원하고 웹 소켓 처리를 확장 할 준비가되었습니다.

  • 수평 확장 : 대부분의 경우 Postman 서비스는 더 높은 용량 인스턴스로 확장하거나 집합에 컴퓨팅 인스턴스를 추가하여 증가 된 사용량을 처리합니다. 따라서 Postman의 엔지니어는 일반적으로 AWS EC2의 크기와 컴퓨팅 성능을 늘려 서비스를 확장 합니다. 예를 들어 AWS Elastic Beanstalk를 사용합니다. 그러나 Bifrost의 경우 축소 / div> 기타 머신. 더 작은 크기의 인스턴스를 많이 사용할 때 최적의 효율성을 얻을 수 있습니다. 이러한 유형의 하이퍼 수평 확장은 클라이언트가 높은 네트워크 처리량을 필요로하지 않고 각 시스템을 더 적은 수의 연결로 제한하면 오류의 폭발 반경이 제한되기 때문에 Bifrost에서 잘 작동합니다.
  • CPU 및 메모리의 새로운 부하 계수 : 대부분의 Postman 서비스는 CPU, 메모리 또는 지연 시간과 같은 단일 차원의 확장 측정 항목으로 효과적으로 확장 할 수 있습니다. 그러나 Bifrost의 경우 메모리와 CPU 사용량이 다양한 수준의 처리량에서 작업에 서로 다른 영향을 미치기 때문에 상황이 조금 더 미묘 해집니다. 이를 설명하기 위해 Bifrost는 부하 계수를 기반으로하는 사용자 지정 확장 메트릭을 사용합니다. 부하 계수는 사용자 지정 비선형 확장 프로필을 제공하는 다차원 계산입니다.

Postman 엔지니어링이 내린 아키텍처 및 기술 결정을 자세히 살펴 보겠습니다.

Bifrost 아키텍처 및 기술 스택

Bifrost 시스템 두 가지 주요 구성 요소 인 게이트웨이와 API가 있습니다. 이 두 부분으로 구성된 아키텍처는 시스템의 안정성과 확장성에 대한 비밀 소스입니다.

게이트웨이는 모든 웹 소켓 연결의 종료 지점 역할을합니다. 상용 게이트웨이를 구매할 수 있지만 수년간의 최적화를 통해 축적 된 레거시 비즈니스 로직을 보존하는 것이 중요했습니다. Postman 엔지니어는 또한 프로토콜 핸드 셰이크를 활용하려는 경우 웹 소켓 처리 방식을 완전히 제어하기를 원했습니다. Bifrost 게이트웨이의 경우 Redis 용 Amazon ElastiCache를 사용하여 리더 및 라이터 노드를 사용하여 Redis 캐시를 쿼리 할 수있었습니다.읽기 및 쓰기 작업을 위해 트래픽을 두 개의 노드로 분할하면 팀이 성능을 더욱 최적화 할 수 있습니다.

“Bifrost는 모든 웹 소켓 연결을위한 게이트웨이입니다. 모든 Postman 클라이언트에 대한 프록시이며 내부 Postman 서비스에 대한 하위 수준 소켓 작업을 처리합니다.”
Mudit Mehta , Postman의 소프트웨어 엔지니어

Postman의 다른 대부분의 서비스는 Node.js 용 실시간 MVC 프레임 워크로 Sails 를 사용합니다. . 그러나 Bifrost 게이트웨이의 경우 엔지니어는 속도와 최적화 된 메모리 사용으로 대용량을 처리 할 수있는 고성능 백엔드 프레임 워크가 필요했습니다. 다시 한번, 그들은 Sails가 제공하는 더 높은 수준의 추상화 아래 소켓 레이어로 더 깊이 들어가고 싶어했습니다. 그래서 그들은 Fastify 로 눈을 돌리고 socketio-adapter 미들웨어를 포크하여 자신의 용도에 맞게 최적화했습니다.

Bifrost 게이트웨이는 AWS, Redis 및 Fastify를 사용하여 웹 소켓을 처리했습니다.

게이트웨이 외에도 Bifrost의 다른 구성 요소는 트래픽을 다른 Postman 서비스로 프록시하는 비공개 API입니다. 유연한 비즈니스 규칙을 기반으로하므로 인바운드 트래픽을 전달하는 방법과 위치를 지속적으로 재평가합니다.

“단순한 구성 요소. 복잡한 논리.”
Kunal Nagpal , Postman의 엔지니어링 관리자

두 구성 요소 모두 엔지니어링 팀은 자체적으로 롤링하기로 결정했습니다. Bifrost의 게이트웨이 부분은 자주 업데이트되지 않지만 팀은 웹 소켓 처리의 더 깊은 계층에서 일어나는 일을 완전히 제어 할 수 있습니다. Bifrost의 API 부분은 작업의 두뇌이며 수신되는 실시간 메시지를 표준 HTTP 호출로 변환합니다. 또한 Sync 및 Bifrost 게이트웨이의 독립 구성 요소로 더 빠르게 업데이트 할 수 있습니다.

비밀 소스를 기억하십니까? Bifrost를이 두 개의 개별 시스템으로 분리하면 두 부품이 각자의 목표에 맞게 최적화 할 수 있습니다.

여정은 끝나지 않았습니다.

모든 흥미 진진한 엔지니어링 이야기와 마찬가지로 이것이 끝이 아닙니다. . Postman 엔지니어링의 다음 작업에 대해 몇 가지 간단한 설명을 드리겠습니다.

  • 추가 중복성 구축 : Redis 캐시는 중앙 메시지 브로커입니다. . Websocket 처리는 여전히 단일 실패 지점에 의존하므로 캐시가 다운되면 어떻게됩니까?
  • 대역폭 및 처리량 증가 : 게이트웨이는 현재 10 배의 동시성을 처리 할 수 ​​있지만 Postman 커뮤니티는 빠르게 성장하고 있으며 엔지니어링은 더 많은 협업 기능을 구축하고 있습니다. 더 많은 웹 소켓 트래픽을 처리해야 할 필요성이 빠르게 증가하고 있습니다.
  • 모놀리스 분석을 계속하십시오. 동기화 서비스에는 코드베이스 내에 얽힌 다른 서비스가 뒤섞여 있습니다. Sync에서 소켓 처리를 분리하면 다른 서비스에 대한 영향력이 느슨해 지므로 이제 다른 서비스를 더 쉽게 제거 할 수 있습니다.

이것은 Postman 엔지니어링이 어떻게 작동하는지에 대한 또 다른 비하인드 스토리입니다. 참호의 더 많은 이야기를 기대해주세요.

🙏🏼 Kunal Nagpal, Yashish Dua, Mudit Mehta 및 Shamasis Bhattacharya의 기술 검토.

원래 게시 위치 https://blog.postman.com 2020 년 12 월 22 일

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다