【編者按】從表面上看,Bitly是一家主打URL縮短和分享的公司,然而究其根本,Bitly卻是一家真正的大數據公司,每月60億的點擊量、6億的縮短服務、1億網頁的爬取,Bitly可以說從事著典型的大數據BI業務。在HighScalability近日的一篇文章中,其創始人Tod Hoff分享了來自Bitly的分布式系統打造理念。
免費訂閱“CSDN云計算”微信公眾號,實時掌握第一手云中消息!
CSDN作為國內最專業的云計算服務平臺,提供云計算、大數據、虛擬化、數據中心、OpenStack、CloudStack、Hadoop、Spark、機器學習、智能算法等相關云計算觀點,云計算技術,云計算平臺,云計算實踐,云計算產業資訊等服務。
以下為譯文
你是不是曾經很好奇bitly如何實現營利了?一個URL縮短工具怎么可能那么難寫?Sean O'Connor,作為Bitly首席應用開發人員,在Bacon討論會的一次發言中給出了關于bilty如何營利的答案。
Sean解釋到,寫一個可用的網址縮短工具是很容易,但是要寫一個大規模的并且高可用的則并不如想象那么容易。Bitly并不是通過將URL縮短作為一個服務來實現營利的,它的贏利來自一款數據分析產品,這個數據分析工具將URL點擊數據和他們從網絡上爬取的數據做對比,幫助他們的客戶找出什么類型用戶關注了那些網頁。
數據分析產品開始是作為一個爬取web服務器日志的后端服務,這些日志包含了來自注解鏈接的數據和cookie數據,這些數據包括用戶從哪里點擊了鏈接,哪個用戶點擊了這個鏈接,鏈接的內容是什么等等信息。但是所有的鏈接都回到了網站的域名。這樣的話,如果讓鏈接轉向你另一個域名,那么第三方可以分析這些數據,這個主意聽起來很可怕,但是它也是一種天才的想法。
這個話題并不是針對Bitly的架構,這是一個關于分布式系統和如何使用分布式系統去解決一系列問題的本質探索。或許從他的發言中我最喜歡的是這句:
SOA+隊列+異步消息真的非常強大。這種方式分離了組件,使工作并發進行,使故障獨立發生,同時,使組件很容易解釋這些行為。
我同樣非常喜歡他的“為什么事件式消息比命令式消息好”的解釋,我之前從未聽過類似的說法。Sean從實踐出發,如果你嘗試從單主機擴展到集群模式,這個演講值得觀看。這里讓我們看看Sean如何解釋分布式系統。
關于BITLY構建分布式系統的經驗總結
注意,以下這些只是在發言中被提及的一些技術,并不是一個全面的列表。
1. 高可用的應該就是分布式的,為了獲得一定的可用性,就必須實現地理位置多元性。按照定義,如果你在不同的地區有獨立的操作系統,它們就必須是分布式的。
2. 創建分布式系統的老方法。建立抽象讓你以為事情不是分布式的。
3. 新方法通過接受分布式系統固有的特性來處理問題,將這些抽象為工具提供。重大轉變在于你如何看待事情,因為抽象更接近于你構建的現實,你可以做更多有力的權衡取舍并因此更高效的去完成某些事情。
4. 帶有一個存儲器的4個機器總是比帶有4個存儲器的1個機器要便宜,這就意味著分布式系統是通往大規模和獲取高可用的有效方式。
5. 因為我們從一臺機器轉向了N臺機器,分布式系統的問題就出現了。
6. 有些問題,比如分析數據太大而不能用一臺機器來處理,或者至少這么一臺機器不在預算內。
這兒沒有一個龐大的Bitly應用,只有很多通過網絡通信的小服務。
1. 如果只有一兩臺服務器想知道哪臺壞掉了并不難,但是如果有數百臺的主機你就需要幫助了。
2. 使用類似Nagios的工具來檢查主機狀況,檢查狀態比如“機器是否還在運轉”?
3. 運行完整性檢查。例如,服務是響應了但是返回的數據被破壞了。
4. 集中化的日志。這個非常重要因為你可以檢測跨不同主機之間的故障。如果一個用戶造成了所有的錯誤,那么從一臺又一臺的機器中檢測到錯誤信息將會非常困難。集中化日志式使檢測整體的錯誤變得更容易,就像所有的錯誤都來自同一個IP地址。
5. 時間到達正確的人,你如何顯示來自工具的信息。
1. 知識就是力量。你知道的關于事情的屬性越多,就越容易做出更好的決定使工作變得更高效,效率意味著你可以以更低的成本使系統更大更快。
2. 為抽象漏洞建立解決方案。如果你使用抽象的一層來隱藏分布式的特性,最終必將失敗,代碼必須發現并處理任何漏洞。
3. 盡可能的放在一個機器里,如果你不需要一個分布式系統那么就不要創建了,要創建它們很復雜并且昂貴。
4. 在面向服務架構中,故障意味著功能受限而不是停機。
5. SOA+隊列+異步消息真的非常強大。這種方式分離了組件,使工作并發進行,使故障獨立發生,同時,使組件很容易解釋這些行為。
6. 當速度和一致性是至關重要的時,使用同步請求。返回給用戶錯誤信息而不是很慢或者錯誤的答案。
7. 事件式的消息比命令式的消息要更好些。它們使得系統間更好的隔離開,更自然的支持多個消費者。 助保持服務的專注性,而不用擔心服務功能之外的事情。
8. 注解而不是過濾。在生產等級適用過濾將疲于應對下游服務關注的鏈接例子是公共和私有的鏈接,過濾私有鏈接意味著對這些私有鏈接感興趣的服務無法獲得這些它們需要的鏈接。注解私有或者公共的鏈接讓服務只處理它們關心的事件。
9. 使服務更好的運行,使用back pressure防止服務過載并繞過故障的服務。
10. 如果沒有Nagios來檢查,就算幾乎可以確定損壞了,你都不能知曉。
11. 工具應該對向人們展示信息,使正確的信息在正確的時間到達正確的人。
原文鏈接: Bitly: Lessons Learned Building A Distributed System That Handles 6 Billion Clicks A Month(翻譯/海霞、仲浩 責編/仲浩)