Postman如何處理龐大難以管理的網關服務

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"來自Postman的服務基礎(Server Foundation)團隊關於Bifrost websocket網關的真實故事的分享。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在漫威電影宇宙中,Bifrost是彩虹橋的名字,它可以在神界和人界之間進行瞬間旅行。類似地,我們的Bifrost websocket網關也同樣神奇地讓Postman客戶端即時連接到Postman服務。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/0c\/0cc59a8d52850c78a1b629dd3d2aaf7e.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"照片由 "},{"type":"link","attrs":{"href":"https:\/\/unsplash.com\/@trfotos?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"Toni Reed "}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"拍攝"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"正如我之前在"},{"type":"link","attrs":{"href":"https:\/\/medium.com\/better-practices\/how-postman-engineering-does-microservices-aa026a3d682d","title":null,"type":null},"content":[{"type":"text","text":"Postman如何"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"link","attrs":{"href":"https:\/\/medium.com\/better-practices\/how-postman-engineering-does-microservices-aa026a3d682d","title":null,"type":null},"content":[{"type":"text","text":"實現"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"link","attrs":{"href":"https:\/\/medium.com\/better-practices\/how-postman-engineering-does-microservices-aa026a3d682d","title":null,"type":null},"content":[{"type":"text","text":"微服務"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"中所分享的那樣,所有的軟件架構都是一個持續進行的工作。在實際執行中意味着需要偶爾重新評估舊的思維方式以適應新的情形,這是軟件設計的自然演化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"下面是一個關於Postman的工程師們如何通過精簡一個增長過大的服務來開發Bifrost websocket網關的故事。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"Postman公司的開發團隊"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Postman公司的大多數開發團隊都在跨職能部門工作,專注於單一的核心領域,比如文檔或"},{"type":"link","attrs":{"href":"https:\/\/learning.postman.com\/docs\/collaborating-in-postman\/version-control-for-collections\/","title":null,"type":null},"content":[{"type":"text","text":"版本控制"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"。每個小隊都遵循"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Domain-driven_design","title":null,"type":null},"content":[{"type":"text","text":"領域驅動設計"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"的原則,爲Postman用戶開發內部微服務和產品功能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"雖然大多數工程師都是以小組形式工作,但有些工程師以功能團隊形式工作,這些功能團隊構建用於整個工程組織共享的組件。服務基礎團隊就是一個Postman功能團隊的例子。這些工程師創造了工具,其他小組用這些工具來構建、交付和觀察自己的特性。這個團隊也是AWS專家和基礎設施專家們的集中地。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/6a\/6a94c7d71a9168a7df6a3e7e9f4b9f55.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"服務基礎團隊是一個Postman功能團隊的例子,他們創建和管理供整個工程組織使用的東西"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Postman的大多數微服務都是松耦合的,因此它們可以獨立於其他團隊進行發展。不幸的是,服務有時候可能會變得太大,提供一些看似毫不相關的服務。這些服務讓團隊能夠快速迭代,但可能開始表現得更像一個臃腫的龐然大物、一個大泥團或是某種笨重的生物。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"當這種情況在Postman出現時,來自不同團隊的很多工程師們都會貢獻代碼,針對每個修改都需要非常仔細的跨團隊協作。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"單體Sync服務"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"其中一個Postman服務變得過於龐大而難以有效管理,這個服務叫做Sync。它具有令人生畏的任務,與Postman服務器同步您本地計算機上的Postman客戶端的所有活動。Postman中的每個用戶操作,都會通過websocket連接來觸發一系列的API調用,並遵循"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern","title":null,"type":null},"content":[{"type":"text","text":"發佈-訂閱模式"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",使得這些信息可以在用戶及團隊之間實時流動。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"例如,當你登錄到Postman並更新一個集合時會發生以下情況:"}]},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"你向Postman集合添加一個參數"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"Postman將這條更新的記錄和Profile信息保存在版本控制中"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"實時地在集合視圖展示最新信息"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Sync服務最初希望用於處理數據庫事務,比如更新集合。然而,去年的這個時候Sync還管理了一些額外的活動,比如給所有集合訂閱者通知和顯示最新版本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/74\/74582380866c82b6252495abe2f54dc2.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"承壓的Sync"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"當你在製造汽車時,車架是所有其他模塊依附的主要支撐結構。車架上的一個小裂縫可能看起來不是什麼大問題。在低速行駛時,它很可能不被注意到。然而在速度比較高時,會產生連鎖反應導致不協調升級。這個看似不起眼的裂縫將使得振動在車輛的其它部分放大,直到把它燒成殘骸。"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“較小系統中被忽視的東西到了複雜系統將變得難以承受。”—— Postman公司的工程經理Kunal Nagpal"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Sync是Postman公司最早的服務之一,它的單體架構使得團隊可以快速發佈Postman功能。隨着時間的推移,它開始承擔越來越多的責任。時至今日,Sync服務仍然對整個工程團隊有着廣泛的影響,許多工程師在Sync出現非預期行爲或者定期性地宕機時都會感到異常痛苦。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"2019年,Sync同時處理websocket連接和數據庫事務。隨着我們的1100萬用戶之間產生的協作越來越多,Postman在高峯期有接近一百萬併發連接。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"作爲Postman實際上所有微型服務的基礎,Sync的壓力越來越大。"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"反向壓力帶來的級聯故障:"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"Sync的每次部署都會導致通過websockets連接的 Postman客戶端斷開。當百萬個套接字重新連接時,服務器資源就會被消耗從而導致更多的連接斷開,造成可預見但無法避免的浪湧,需要6到8個小時才能恢復。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"影響用戶體驗:"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"雖然這種情況不經常發生,斷開連接意味着在查看團隊工作區最新更新和活動時會有偶爾的延遲。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"更高的維護成本:"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"由於每個小組都依賴於Sync,實際上每個Postman的工程師都必須學習如何處理連接掉線,啓動新連接,然後解決數據中的所有衝突。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"基礎服務團隊知道他們需要提高websocket連接的效率,並且還需要將它們與Sync服務分離。雖然目標明確,但達成目標的路徑卻不清晰。"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“這是軟件設計的自然演化過程。微服務開始很靈活,但會逐漸長大,它們需要被打破。爲了能夠引入更多功能,我們希望將套接字處理與Sync分離開來。” —— "},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/yashishdua\/","title":null,"type":null},"content":[{"type":"text","text":"Yashish Dua"}]},{"type":"text","text":",Postman公司的軟件工程師"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/2c\/2c67380ca0ed438203675cc371bd6e41.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"有些內部服務過於龐大,需要團隊之間仔細協作"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"事情經過"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第一步: 我們得到組織的支持"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"第一個需要解決的挑戰不是技術問題。這在Postman不是首次。工程師們已經從過去的嘗試中學會了如何從人開始。從2019年10月開始,服務基礎團隊的工程師們進行了一系列評審,旨在向更廣泛的組織傳達這一目標,並解釋對所有依賴的服務帶來的好處。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果這個新系統成功了,處理掉線和後續影響就不再是經常的事情了。這是其他工程團隊支持和遷移到新系統的真正動機。這種公開的溝通和協調將在整個項目期間持續下去。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第二步:我們識別未知的盲區"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"儘管工程部門知道他們的前進方向,他們還是花了一些時間來梳理所有的場景並更好的理解基本概念。工程師們安排了與其他利益相關方的研究會議以確定未知的盲區,這些不可預見的情況可能暴露更大的風險。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"即便Postman團隊擅於進行研究和規劃,但由於這些改變的關鍵性,這個過程花費的時間比正常情況要久得多。他們研究了不同的選擇,考慮了輔助需求,在兩個月的時間裏作出了一個計劃。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第三步:我們構建了Bifrost websocket網關"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost由兩部分組成:"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"公共網關"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":":網關使用Fastify web框架和Amazon AWS ElastiCache for Redis作爲中央消息代理來管理所有的websocket連接。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"私有API"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":":API還使用Fastify作爲一個低開銷的web框架來代理其他內部Postman服務。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/da\/da45352976e90e2cdb4c3c9b77949e38.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost由兩部分組成: 一個公共網關和一個私有API"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第四步: 我們測試了新網關"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"當Postman工程師準備交付一個特性時,他們需要測試它以及所有相關特性。由於幾乎每個Postman特性都依賴於websocket,這意味着每個特性都必須爲這個發佈進行測試。此外,由於Postman尚未設立websockets的"},{"type":"link","attrs":{"href":"https:\/\/www.postman.com\/automated-testing\/","title":null,"type":null},"content":[{"type":"text","text":"自動"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"link","attrs":{"href":"https:\/\/www.postman.com\/automated-testing\/","title":null,"type":null},"content":[{"type":"text","text":"化測試"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"框架,因此所有測試工作在Bifrost 投入生產前都是由人工完成的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這是一段艱苦的旅程,但到2020年1月底,工程部已經有了一個可行的概念驗證。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第五步: 我們遷移到新網關"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"所有Postman客戶端,比如Electron應用或 Web,都依賴於對另一個名爲Godserver的核心服務進行初始化引導調用。這個服務負責確定客戶端的訪問和配置,以及如何控制進行增量產品展示。因爲所有這些都是由Godserver預先決定和控制的,所以遷移到Bifrost網關不需要Postman客戶端代碼單獨更新。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"基礎服務團隊總結了所有小組的遷移步驟、所需的代碼更改和應用配置。在短短几個星期的過程中,依賴服務開始從依賴Sync轉變爲基於Bifrost的websocket連接進行處理。Godserver將越來越多的流量轉移到新的websocket網關,以便觀察Bifrost如何處理負載和響應邊界情況。"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“這就像在空中更換飛機的引擎。”—— Postman公司的工程總監 "},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/numaanashraf\/","title":null,"type":null},"content":[{"type":"text","text":"Numaan"}]},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/numaanashraf\/","title":null,"type":null}},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/numaanashraf\/","title":null,"type":null},"content":[{"type":"text","text":"Ashraf"}]},{"type":"text","text":" 說"}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"第六步: 我們對服務進行了擴展"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost正在工作!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但在新網關規劃和開發過程中,Postman又獲得了大約一百萬用戶。其他的工程團隊在這段時間並沒有停止他們自己的工作,新添加的協作特性,如"},{"type":"link","attrs":{"href":"https:\/\/learning.postman.com\/docs\/collaborating-in-postman\/version-control-for-collections\/","title":null,"type":null},"content":[{"type":"text","text":"版本控制"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"和"},{"type":"link","attrs":{"href":"https:\/\/learning.postman.com\/docs\/collaborating-in-postman\/roles-and-permissions\/#roles-in-postman","title":null,"type":null},"content":[{"type":"text","text":"基於角色的存取控制(RBAC)"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",都嚴重依賴websockets來實時更新信息。大量即將發佈的產品將真正考驗這個新網關。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost已經準備好支持不斷增長的需求和擴展的websocket處理。"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"水平擴展"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":": 大多數時候,Postman服務通過擴展到更大容量的實例或者向集羣添加更多計算實例,來應對使用量的增加。因此,Postman公司的工程師通常升級AWS EC2實例的規格和計算能力來"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"垂直"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"擴展服務,例如使用AWS Elastic Beanstalk。但是對於Bifrost來說,websocket通過使用"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"更多"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"的機器來進行"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"水平"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":"擴展。當大量使用較小規模的實例時,整體可以達到最佳效率。這種類型的超級水平擴展適用於 Bifrost,因爲客戶端不需要高網絡吞吐並可以限制每臺機器的連接數量,從而控制了故障的影響範圍。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"CPU和內存的新負載因子"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":": 大多數Postman服務可以有效地使用單一維度的縮放指標進行擴展,比如CPU、內存或延遲。然而,對於Bifrost來說,情況會稍微有些微妙,因爲內存和CPU的使用對不同吞吐量級的操作有不同的影響。爲了解決這個問題,Bifrost使用了一個基於負載因子的自定義比例指標。這個負載因子是一種多維計算結果,它提供了自定義的非線性的縮放概述。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/69\/69b72a0fc0f4a445def5cf37dfda49f8.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"讓我們深入研究一下Postman工程團隊所做的架構和技術決策。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"Bifrost的架構和技術棧"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost系統有兩個主要組成部分——網關和API。這兩部分架構是系統穩定性和可擴展性的祕密武器。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"網關服務充當所有websocket連接的末端節點。儘管可以購買商業網關,但保留多年來優化積累下來的已有業務邏輯非常重要。Postman工程師也想完全控制websockets的處理方式,例如他們想深入干預握手協議。對於Bifrost網關,他們使用了Amazon ElastiCache For Redis,可以同時通過讀節點和寫節點來查詢Redis緩存。由於將流量分割爲兩個節點進行讀寫操作,團隊可以進一步優化性能。"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“Bifrost是我們所有websocket連接的入口。它是所有Postman客戶端的代理,並負責處理Postman內部服務的底層套接字操作。”—— "},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/mudit-mehta-6920a2113\/","title":null,"type":null},"content":[{"type":"text","text":"Mudit Mehta"}]},{"type":"text","text":",Postman公司的軟件工程師"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Postman的大多數其他服務都使用"},{"type":"link","attrs":{"href":"https:\/\/sailsjs.com\/","title":null,"type":null},"content":[{"type":"text","text":"Sails"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"作爲 Node.js的實時MVC框架。然而對於Bifrost 網關,工程師們需要一個更高性能的後端框架,能夠快速處理大容量並能優化內存使用率。另外,他們還希望深入到套接字層,而不是停留在Sails上層的抽象和封裝。因此,他們轉向"},{"type":"link","attrs":{"href":"https:\/\/www.fastify.io\/","title":null,"type":null},"content":[{"type":"text","text":"Fastify"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",並基於"},{"type":"link","attrs":{"href":"https:\/\/github.com\/socketio\/socket.io-adapter","title":null,"type":null},"content":[{"type":"text","text":"socketio-adapter"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"中間件,針對自己的場景進行了優化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/cf\/cf6fef9cb032e3f0c7c6b9ca1945afe4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Bifrost使用AWS、Redis和Fastify來處理websockets"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"除了網關服務,Bifrost的另一個組件是用來代理上行流量到其他Postman服務的私有API。它基於靈活的業務規則,因此可以不斷調整流量轉發規則。"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“簡單的組件。複雜的邏輯。”—— "},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/kunagpal\/","title":null,"type":null},"content":[{"type":"text","text":"Kunal Nagpal"}]},{"type":"text","text":",Postman公司的工程經理"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"對於這兩個組件,工程團隊決定使用他們自己的組件。儘管Bifrost的網關部分並不經常更新,但是團隊可以完全控制websocket的底層處理過程。Bifrost的API部分是操作的核心,它將傳入的實時消息轉換爲標準的HTTP調用。它也可以作爲Sync和Bifrost網關之外的獨立組件,以便進行更快的更新迭代。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"還記得那個祕密武器嗎?通過將Bifrost解耦成兩個分離的系統,使得兩部分都能按自己的目標進行優化。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"旅程遠未結束"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"就像所有有趣的工程學故事一樣,這遠遠還不是終點。關於Postman工程團隊接下來會做什麼,這裏我給你們留下一些懸念。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"構建附加冗餘"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":":Redis緩存是一箇中央消息代理。Websocket處理仍然依賴於有故障的單點,因此如果緩存服務器掛了,會發生什麼情況呢?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"增加帶寬和吞吐"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":":網關目前能夠處理額外10倍的併發量,但Postman社區正在快速增長,工程師正在構建更多的協作特性,隨之而來的是處理更多websocket流量的工程需求。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}},{"type":"strong"}],"text":"繼續打破單體服務"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#292929","name":"user"}}],"text":":Sync服務的代碼庫裏雜糅了一堆其他服務。從Sync服務解耦套接字處理過程,解除了和其他服務的耦合,所以現在剝離這些服務變得更加容易。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這是Postman工程團隊如何運作的幕後觀察。請關注我們以獲取更多來自實戰的故事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"原文鏈接: "},{"type":"link","attrs":{"href":"https:\/\/medium.com\/better-practices\/how-postman-engineering-handles-a-million-concurrent-connections-15c8807f6393","title":null,"type":null},"content":[{"type":"text","text":"How Postman Engineering handles a million concurrent connections"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章