架構師之路--怎樣聊技術天,限流技術和各種編程語言

  如今市面上的編程語言以面向對象爲主流。面向對象先要從一些最基本的作起。好比我24歲就結婚了,否則怎麼面向對象編程。而後剛結婚就生娃了,否則對象跑了咋辦?new一個?建立銷燬開銷很大的,仍是生個娃持續持有對象的引用的好。java

  爲啥有些人開口說話能說好久,有些人說話有一搭沒一搭的?據我觀察發現,動手幹活差很少的兩我的,會說的未來發展的會更好。緣由從具體實例來感覺一下。python

  和朋友聊天,真的,好幾年前人人網出來的總有點技術極客精神,聊天咱們聊技術。人家問我大家視頻是怎麼存儲怎麼播放的。我說我就是作內容,meta的,其餘和我無關。天兒就聊死了,本身的格局就下來了。若是說我作的有開發平臺的東西,裏面有上傳視頻的。先調用雲存儲的接口進行一個初始化,他們返回給咱們一個視頻介質上傳url。JS端將介質分片的方式上傳到url上。若是網絡中斷或者瀏覽器關閉啥的,能夠調用續傳接口用新返回的url繼續傳。續傳接口帶着總文件大小和目前已經收到的文件的大小,JS能夠依據這個判斷從哪一個分片繼續傳。雲存儲在另外一個部門,他們負責和雲轉碼部門進行通訊,雲轉碼將介質轉成各類格式,至於從原始高清文件轉成各類碼率,怎樣取樣的,DRM數字版權管理又是怎麼作的,由雲轉碼部門負責。他們內部是用什麼策略分發到各個DNS節點上的。調度部門又是怎樣調度來節約視頻網站最寶貴的帶寬的,具體細節我不是很清楚。雲轉碼部門將轉換好的各類碼率和視頻url經過MQ的形式傳給咱們,咱們存到數據庫裏。nginx

  那人家就又問了,MQ大家用的啥呀?我說apache的qpidd。額~~,人家不知道,聊天就聊死了。因此得說MQ都差很少的,和rabbit mq同樣都是基於AMQP高級消息隊列協議的。這是公司統一的集羣,說是安裝部署挺方便的。主流的編程語言也都支持,因此就用了。由於主要是跨部門的通訊,主要以方便,節約溝通成本爲主,因此咱們的消息體也就是json先壓縮再base64。也沒用protobuf那些二進制的,由於萬一遇到問題,二進制可讀性差,缺少自描述,不容易排查。面試

  高併發服務必須有一些緊急方案,好比服務熔斷,降級,隔離,限流,異步RPC等。服務熔斷,降級,隔離你們比較傾向於用netflix開源的分佈式服務彈性框架Hystrix。Hystrix也能夠限流。可是咱們服務用的guava的RateLimiter這種成熟的令牌桶算法來實現。算法

  服務限流是個很簡單的事情。咱們的代碼也就幾百行,可是裏面有一套比較完整的設計思想,目的是根據必定的策略(如:url, 平臺來源,url+平臺來源)來作一個業務細粒度的限流。數據庫

  

  全部的請求都要走這個攔截器,這個攔截器裏定義了一個單例的限流持有者,這個限流持有者按照配置的策略和配置的每一個或者每種請求的限額來構成的map來返回給攔截器請求對應的key和RateLimiter。攔截器裏判斷超限則直接返回錯誤不交給控制器處理。一個請求類型,如url一個RateLimiter細粒度限流。apache

  固然,除了這種應用級別的限流,在nginx層面也能夠作一些對IP的session空間,請求頻率,併發量的限制。若是遇到網絡攻擊,儘可能先從運維層面去解決問題,由於越往上層,對服務的影響能降到最低。編程

  一個好的軟件架構可以知足系統的品質,使受益人達成一致的目標,可以支持計劃編制過程,對系統開發的指導性,可以有效的管理複雜性,爲複用奠基了基礎,可以下降維護費用,可以支持衝突分析。json

  絕大多數架構或者編程語言的產生都是來源於項目。好比C++的發明者Stroustrup設計這個語言的初衷是看到C語言因爲不合理的初始化參數致使相當重要的編程問題,這種bug很難發現。這種問題在清理的時候一樣出現。作了堅持了,確實就成功了。然而任何一個東西都有一個造成和發展的階段。java在老一些的版本中一直被吐槽性能問題,而它的每個版本都要伴隨着性能的提高,因此升級JVM就能帶來免費的性能福利。細節處想到final關鍵字,在早期的版本中,final關鍵字的部分會內聯調用,直接將函數展開,而不用不斷的參數入棧出棧而引發性能開銷。可是這個在函數體大的時候會有空間上比較大的開銷。JVM在1.5開始進行了優化,final關鍵字性能上的做用就再也不那麼大了。原來公司有個同事,人很好,也頗有想法。他說:「我老是會將本身的一些想法記錄在一個本子上,而後過一段時間再看就會發現,我那篇只堅持了當時的其中一個想法,去作了,都成功了。」我認爲他離成功比本身想象的要遠不少。由於他有的只是想法,並無去作。就好像只有JDK1.0的想法,可是路程離成功至少有離jdk1.5的距離。瀏覽器

  Python以代碼量小,維護成本低,編程效率高著稱。可是哪有幾個編程語言不是以維護成本低,編程效率高做爲優化點的呢?因此人家問我搜索引擎已經是一片火海,你未來真的能打造出本身的優點嗎?我只能說不試怎麼知道。「人生苦短,我用python」。Python的這些特色能夠騰出更多的時間去把妹了,可不就人生苦短了嘛。Python做者的廣告詞給了Python生命力。實際上Python的簡單性從它的內存回收就可見一斑,它用的是引用計數法,可見不存在循環引用問題。我在人人的時候作過一個python的項目。有段時間咱們領導說我一我的作了8我的的活兒。除了整個網站全部的維護工做以外,各類新活兒我都接。就是這個性格,別人實在沒辦法來找我了,我只爲難本身,不爲難別人。那時候工做不到四年,編程時間不到兩年,我說過工做頭兩年是當日語翻譯的。之因此能去人人。話說一日我剛來北京,和學長正在逛頤和園,忽然接到人人網面試電話,電話那頭問我各類技術問題,個人回答都是不會。結果那頭很是nice的說不要緊。最後電話那頭換了一個面試官,用日語給我講話,問我作了啥,她對個人回答很是滿意,滿意主要是發現我日語很是好。結果我就成了人人網的橋樑工程師。記得我前面寫的文章裏我的簡介裏寫憑藉本身的語言天賦被網友吐槽了,可是我在東軟的時候人人都說我有語言天賦,我本身也就習慣這麼認爲了,我只是理所固然的認爲本身在陳述一件事情,並無標榜的意思。我也不會python,我也根本不知道啥是開放平臺。可是我一我的接手負責整個開放平臺的維護,由於開放平臺的老大跳槽去美團了。話說這個老大真是個牛人,清華的,創過業,來了人人,又去美團作到了P4,如今又本身創業去了。有一天我家男神拿着一個清華校友會的照片問我:「這我的好像是你原來同事吧」。我說:「嗯呢」。他說:「他旁邊坐的是咱們老闆」。好吧,看來我家男神可進步的空間不是通常的大。

  我硬着頭皮維護這個開放平臺。而後泡泡魚遊戲要接入一個日本平臺。這個遊戲是python寫的。那時候這款遊戲很是火,這個遊戲公司超級忙,沒時間給接入,給錢找咱們幫忙。咱們只能本身把代碼拿過來接入。那時候人人網喜歡搞內部創業,咱們是海外事業部,原本就是不賺錢的。我作了那個接入,遊戲方給了咱們10萬接入費,剩下的就是遊戲分紅,收入我就不知道有多少了。可是這是咱們那時候惟一賺錢的一個項目了。Python真是很是好學,我白天維護網站,全部的人都來找我,晚上作接入,研究python和接入文檔,1周時間把支付接入部分搞定了。測試環境能夠充錢了。可是上線有問題,運維MM搭建的正式環境跑的時候有一塊怎麼都不對。晚上全部人都回家了,我本身在那裏弄線上環境。後來終於發現安裝的一個部分一個工具的版本不對,具體怎樣不記得了。6年前的事情了。因此我作過python,可是不會python。

  Java與C++之間有一堵由內存動態分配和垃圾收集技術所圍成的高牆,牆外面的人想進入,牆裏面的人卻想出來。Java上不能那麼隨意,也就是優化一下內存分配參數,提及JVM參數優化,其實最經常使用以爲人人都知道不當回事的就是堆的初始最大值和最小值設置成相同的值,這樣避免堆自動擴展,調整新生代和年老代的大小的full gc形成的吞吐量下降和延遲。話說JVM的幾乎全部gc操做,包括minor gc都要stop the world.

  最後給你們推薦一個國外的網站http://blog.takipi.com/。常常會介紹一些實用工具和調優技巧,注重分析。表明做有http://blog.takipi.com/7-new-tools-java-developers-should-know/和http://blog.takipi.com/how-to-instantly-improve-your-java-logging-with-7-logback-tweaks/

相關文章
相關標籤/搜索