現(xiàn)在市面上的編程語言以面向?qū)ο鬄橹髁?。面向?qū)ο笙纫獜囊恍┳罨镜淖銎?。比如?4歲就結(jié)婚了,不然怎么面向?qū)ο缶幊?。然后剛結(jié)婚就生娃了,不然對象跑了咋辦?new一個?創(chuàng)建銷毀開銷很大的,還是生個娃持續(xù)持有對象的引用的好。

  為啥有些人開口說話能說很久,有些人說話有一搭沒一搭的?據(jù)我觀察發(fā)現(xiàn),動手干活差不多的兩個人,會說的將來發(fā)展的會更好。原因從具體實例來感受一下。

  和朋友聊天,真的,好幾年前人人網(wǎng)出來的總有點技術(shù)極客精神,聊天我們聊技術(shù)。人家問我你們視頻是怎么存儲怎么播放的。我說我就是做內(nèi)容,meta的,其他和我無關(guān)。天兒就聊死了,自己的格局就下來了。如果說我做的有開發(fā)平臺的東西,里面有上傳視頻的。先調(diào)用云存儲的接口進行一個初始化,他們返回給我們一個視頻介質(zhì)上傳url。JS端將介質(zhì)分片的方式上傳到url上。如果網(wǎng)絡(luò)中斷或者瀏覽器關(guān)閉啥的,可以調(diào)用續(xù)傳接口用新返回的url繼續(xù)傳。續(xù)傳接口帶著總文件大小和目前已經(jīng)收到的文件的大小,JS可以依據(jù)這個判斷從哪個分片繼續(xù)傳。云存儲在另一個部門,他們負責(zé)和云轉(zhuǎn)碼部門進行通信,云轉(zhuǎn)碼將介質(zhì)轉(zhuǎn)成各種格式,至于從原始高清文件轉(zhuǎn)成各種碼率,怎樣取樣的,DRM數(shù)字版權(quán)管理又是怎么做的,由云轉(zhuǎn)碼部門負責(zé)。他們內(nèi)部是用什么策略分發(fā)到各個DNS節(jié)點上的。調(diào)度部門又是怎樣調(diào)度來節(jié)約視頻網(wǎng)站最寶貴的帶寬的,具體細節(jié)我不是很清楚。云轉(zhuǎn)碼部門將轉(zhuǎn)換好的各種碼率和視頻url通過MQ的形式傳給我們,我們存到數(shù)據(jù)庫里。

  那人家就又問了,MQ你們用的啥呀?我說apache的qpidd。額~~,人家不知道,聊天就聊死了。所以得說MQ都差不多的,和rabbit mq一樣都是基于AMQP高級消息隊列協(xié)議的。這是公司統(tǒng)一的集群,說是安裝部署挺方便的。主流的編程語言也都支持,所以就用了。因為主要是跨部門的通信,主要以方便,節(jié)約溝通成本為主,所以我們的消息體也就是json先壓縮再base64。也沒用protobuf那些二進制的,因為萬一遇到問題,二進制可讀性差,缺乏自描述,不容易排查。

  高并發(fā)服務(wù)必須有一些緊急方案,比如服務(wù)熔斷,降級,隔離,限流,異步RPC等。服務(wù)熔斷,降級,隔離大家比較傾向于用netflix開源的分布式服務(wù)彈性框架Hystrix。Hystrix也可以限流。但是我們服務(wù)用的guava的RateLimiter這種成熟的令牌桶算法來實現(xiàn)。

  服務(wù)限流是個很簡單的事情。我們的代碼也就幾百行,但是里面有一套比較完整的設(shè)計思想,目的是根據(jù)一定的策略(如:url, 平臺來源,url+平臺來源)來做一個業(yè)務(wù)細粒度的限流。

  iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

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

  當然,除了這種應(yīng)用級別的限流,在nginx層面也可以做一些對IP的session空間,請求頻率,并發(fā)量的限制。如果遇到網(wǎng)絡(luò)攻擊,盡量先從運維層面去解決問題,因為越往上層,對服務(wù)的影響能降到最低。

  一個好的軟件架構(gòu)能夠滿足系統(tǒng)的品質(zhì),使受益人達成一致的目標,能夠支持計劃編制過程,對系統(tǒng)開發(fā)的指導(dǎo)性,能夠有效的管理復(fù)雜性,為復(fù)用奠定了基礎(chǔ),能夠降低維護費用,能夠支持沖突分析。

  絕大多數(shù)架構(gòu)或者編程語言的產(chǎn)生都是來源于項目。比如C++的發(fā)明者Stroustrup設(shè)計這個語言的初衷是看到C語言由于不合理的初始化參數(shù)導(dǎo)致至關(guān)重要的編程問題,這種bug很難發(fā)現(xiàn)。這種問題在清理的時候同樣出現(xiàn)。做了堅持了,確實就成功了。然而任何一個東西都有一個形成和發(fā)展的階段。java在老一些的版本中一直被吐槽性能問題,而它的每一個版本都要伴隨著性能的提升,所以升級JVM就能帶來免費的性能福利。細節(jié)處想到final關(guān)鍵字,在早期的版本中,final關(guān)鍵字的部分會內(nèi)聯(lián)調(diào)用,直接將函數(shù)展開,而不用不斷的參數(shù)入棧出棧而引起性能開銷。但是這個在函數(shù)體大的時候會有空間上比較大的開銷。JVM在1.5開始進行了優(yōu)化,final關(guān)鍵字性能上的作用就不再那么大了。原來公司有個同事,人很好,也很有想法。他說:“我總是會將自己的一些想法記錄在一個本子上,然后過一段時間再看就會發(fā)現(xiàn),我那篇只堅持了當時的其中一個想法,去做了,都成功了?!蔽艺J為他離成功比自己想象的要遠很多。因為他有的只是想法,并沒有去做。就好像只有JDK1.0的想法,但是路程離成功至少有離jdk1.5的距離。

  Python以代碼量小,維護成本低,編程效率高著稱。但是哪有幾個編程語言不是以維護成本低,編程效率高作為優(yōu)化點的呢?所以人家問我搜索引擎已是一片火海,你將來真的能打造出自己的優(yōu)勢嗎?我只能說不試怎么知道?!叭松喽?,我用python”。Python的這些特點可以騰出更多的時間去把妹了,可不就人生苦短了嘛。Python作者的廣告詞給了Python生命力。實際上Python的簡單性從它的內(nèi)存回收就可見一斑,它用的是引用計數(shù)法,可見不存在循環(huán)引用問題。我在人人的時候做過一個python的項目。有段時間我們領(lǐng)導(dǎo)說我一個人做了8個人的活兒。除了整個網(wǎng)站所有的維護工作之外,各種新活兒我都接。就是這個性格,別人實在沒辦法來找我了,我只為難自己,不為難別人。那時候工作不到四年,編程時間不到兩年,我說過工作頭兩年是當日語翻譯的。之所以能去人人。話說一日我剛來北京,和學(xué)長正在逛頤和園,突然接到人人網(wǎng)面試電話,電話那頭問我各種技術(shù)問題,我的回答都是不會。結(jié)果那頭非常nice的說沒關(guān)系。最后電話那頭換了一個面試官,用日語給我講話,問我做了啥,她對我的回答非常滿意,滿意主要是發(fā)現(xiàn)我日語非常好。結(jié)果我就成了人人網(wǎng)的橋梁工程師。記得我前面寫的文章里個人簡介里寫憑借自己的語言天賦被網(wǎng)友吐槽了,但是我在東軟的時候人人都說我有語言天賦,我自己也就習(xí)慣這么認為了,我只是理所當然的認為自己在陳述一件事情,并沒有標榜的意思。我也不會python,我也根本不知道啥是開放平臺。但是我一個人接手負責(zé)整個開放平臺的維護,因為開放平臺的老大跳槽去美團了。話說這個老大真是個牛人,清華的,創(chuàng)過業(yè),來了人人,又去美團做到了P4,現(xiàn)在又自己創(chuàng)業(yè)去了。有一天我家男神拿著一個清華校友會的照片問我:“這個人好像是你原來同事吧”。我說:“嗯呢”。他說:“他旁邊坐的是我們老板”。好吧,看來我家男神可進步的空間不是一般的大。

  我硬著頭皮維護這個開放平臺。然后泡泡魚游戲要接入一個日本平臺。這個游戲是python寫的。那時候這款游戲非?;穑@個游戲公司超級忙,沒時間給接入,給錢找我們幫忙。我們只能自己把代碼拿過來接入。那時候人人網(wǎng)喜歡搞內(nèi)部創(chuàng)業(yè),我們是海外事業(yè)部,本來就是不賺錢的。我做了那個接入,游戲方給了我們10萬接入費,剩下的就是游戲分成,收入我就不知道有多少了。但是這是我們那時候唯一賺錢的一個項目了。Python真是非常好學(xué),我白天維護網(wǎng)站,所有的人都來找我,晚上做接入,研究python和接入文檔,1周時間把支付接入部分搞定了。測試環(huán)境可以充錢了。但是上線有問題,運維MM搭建的正式環(huán)境跑的時候有一塊怎么都不對。晚上所有人都回家了,我自己在那里弄線上環(huán)境。后來終于發(fā)現(xiàn)安裝的一個部分一個工具的版本不對,具體怎樣不記得了。6年前的事情了。所以我做過python,但是不會python。

  Java與C++之間有一堵由內(nèi)存動態(tài)分配和垃圾收集技術(shù)所圍成的高墻,墻外面的人想進入,墻里面的人卻想出來。Java上不能那么隨意,也就是優(yōu)化一下內(nèi)存分配參數(shù),說起JVM參數(shù)優(yōu)化,其實最常用覺得人人都知道不當回事的就是堆的初始最大值和最小值設(shè)置成相同的值,這樣避免堆自動擴展,調(diào)整新生代和年老戴的大小的full gc造成的吞吐量降低和延遲。話說JVM的幾乎所有g(shù)c操作,包括minor gc都要stop the world.

  最后給大家推薦一個國外的網(wǎng)站http://blog.takipi.com/。經(jīng)常會介紹一些實用工具和調(diào)優(yōu)技巧,注重分析。代表作有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/

http://www.cnblogs.com/xiexj/p/7045041.html