PIXNET Logo登入

互聯網 - 大數據

跳到主文

本部落格為互聯網熱門頭條訊息管理中心

部落格全站分類:生活綜合

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 3月 07 週二 201721:16
  • springboot(九):定時任務


Source: http://www.cnblogs.com/ityouknow/p/6132645.html
在我們的項目開發過程中,經常需要定時任務來幫助我們來做一些內容,springboot默認已經幫我們實行了,只需要添加相應的注解就可以實現
1、pom包配置
pom包里面只需要引入springboot starter包即可
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

2、啟動類啟用定時
在啟動類上面加上@EnableScheduling即可開啟定時
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

3、創建定時任務實現類
定時任務1:
@Component
public class SchedulerTask {
private int count=0;
@Scheduled(cron="*/6 * * * * ?")
private void process(){
System.out.println("this is scheduler task runing "+(count++));
}
}

定時任務2:
@Component
public class Scheduler2Task {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 6000)
public void reportCurrentTime() {
System.out.println("現在時間:" + dateFormat.format(new Date()));
}
}

結果如下:
this is scheduler task runing 0
現在時間:09:44:17
this is scheduler task runing 1
現在時間:09:44:23
this is scheduler task runing 2
現在時間:09:44:29
this is scheduler task runing 3
現在時間:09:44:35

參數說明
@Scheduled 參數可以接受兩種定時的設置,一種是我們常用的cron="*/6 * * * * ?",一種是 fixedRate = 6000,兩種都表示每隔六秒打印一下內容。
fixedRate 說明
  • @Scheduled(fixedRate = 6000) :上一次開始執行時間點之后6秒再執行

  • @Scheduled(fixedDelay = 6000) :上一次執行完畢時間點之后6秒再執行

  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒后執行,之后按fixedRate的規則每6秒執行一次

  • 示例代碼地址


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權所有,歡迎保留原文鏈接進行轉載:)
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(6)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:16
    • 2016顛倒夢想,2017靜心前行


    Source: http://www.cnblogs.com/ityouknow/p/6241290.html

    世人都曉神仙好,惟有功名忘不了! 古今將相在何方?荒冢一堆草沒了.


    -- 出處 《好了歌--跛足道人》
    今天是2017年的第一天,早上打開朋友圈不出所料,各種歡送16,又是酒吧,又是燈火,熱鬧紛繁,貌似都在興高采烈的迎接新年;朝著窗戶向南望去,北京一片云山霧里,打開窗戶拍了一張照片(上圖),一股厚重的霧霾味迎面而來,各種酸爽嘴里一股沙子味。2016年的最后一天和2017年的第一天都只能待在家里,出去都是在探險;在這新舊年交替的時光中我的心情猶如這張圖片一樣,厚厚的迷霧,遲遲不能散去。
    我想從三個方面來回顧我的2016:環境、技術、生活
    天朝的環境
    這里的環境指兩方面,社會環境和自然環境。但兩者都和這霧霾一樣越來越濃厚。
    社會環境
    這兩天看了一部電影叫做《驢得水》,一部被噎得說不出話的片子,2016年國產電影評分最高的一部電影。看完后心里一直不是很舒服,這分明就是借古喻今,諷刺我們當下的生活,看完之后在豆瓣翻了翻影評,不知道是被和諧了還是怎么找都是不痛不癢的感覺,看了知乎的影評之后才發現,難道現在高質量的影迷都在知乎上面來發表評論了嗎?電影的細節就不在這里說了,大家自行觀看,但知乎中有一個評論讓我印象特別深刻

    每個曾經特立獨行的人,都拋棄了曾經的自己。
    每個曾經想改變中國的人,都被中國所改變。


    大家都知道我們中國有著各種的墻,在互聯網行業有著大名鼎鼎的GFW,屏蔽這谷歌、facebook如此優秀的站點,聽說有一陣子要屏蔽github,李開復等大V極力反對才作罷,我在想你怎么不把互聯網全部屏蔽了呢,就和朝鮮一樣,只有內網,我們現在都到了一個什么樣的世界,還是和老的思維一樣,以為有了GFW就可以隱瞞真相、屏蔽一切了嗎,現在的世界已經極度扁平化,愚民教育已經走向終結。驢得水的高分也不就是一種體現嗎?
    我們的電影也有類似的墻:電影審查制度。就是每部電影上映之前都需要過審,一群的大著肚子,不喑世事的官員,往那兒一坐,這個太消極了,那個太恐怖了,那個太揭露真相了!凡是有一點諷刺政府、有一點和黨有所出入的統統斃掉,那怕外國中了大獎,國內一概不許,我們是中國特色社會主義。中國之所以拍不出很多優秀、深刻的電影和這個制度息息相關,看看韓國的熔爐、恐怖直播,真是感覺中國的電影和韓國整整差了10年,我們還是如此的不自信!我一度擔心驢得水過不了審,于是導演特意設定了年代1942,特意在結尾的時候奔向了延安,中國好的電影不都是這樣才能上映嗎?電影里面校長女兒最后說的那句話:

    過去的如果都讓它就這么過去,以后只會更糟。


    自然環境
    上次坐出租車,和一位老司機聊天的時候說起霧霾,剛開始的時候大家都以為是霧,也沒啥大不了都認為不傷害身體,后來美國大使館說這是霾,然后中國極力抗議說這是干涉內政(這和內政有毛線關系呀),后來大家都知道了包不住了開始公布pm2.5,霧霾是一天比一天嚴重,而且不只是北京,回老家西安也是一個德行,坐火車南下武漢一路過去全是霧霾,大半個中國估計都是。我們真的拿霧霾沒有辦法了嗎?不是,apec藍 大家都體會了吧,這就是我朝的力量,但是為什么不能長久呢?《蒼穹之下》大家應該都看了吧,既得利益者不會這么輕易的放棄自己的籌碼。每次看到北京的霧霾,就想到之前看的特別好看的一個電影叫《迷霧》,想著如果在北京來拍攝都不需要什么特景,原地取景即可。我一直在想,中南海的食物和水是特供的,但是空氣也能特供嗎?
    在微信上面看了一篇文章《紀錄片海外奪獎背后:中國的污染,比你想象的更嚴重》,本來想給大家貼出微信原文出來,剛才看的時候已經被屏蔽了,這也是另一道墻起的作用《網絡審查》,正是這篇文章讓我認識到了王久良這樣的人物,我一直在想做什么是有意義的事情,這個絕對是!這個紀錄片的名字是《塑料王國》現在優酷上還可以看,像這種作品國外都是得各種獎,但是放到了中國,可能過兩天大家又看不了了。看完這部紀錄片之后的感覺用四個字來形容:觸目驚心!
    我們從國外高價把垃圾收回來,整理分類在做成塑料產品來用,農民為了掙錢,什么身體健康、環境污染能顧得上嗎?這是他們道德低下嗎,他們不知道這些垃圾有毒嗎?他們都知道,但是他們沒有辦法,需要活著,需要生存!我原來一直以為我們家鄉那邊就算貧窮的了,看了這個記錄片,在結合蘭州《盛世中的螻蟻》的這些事情,才知道貧窮在中國還是不少,如今北京高樓大廈,高鐵、飛機、互聯網高速發展,中國經濟飛速前進,這些光鮮靚麗的背后,誰來考慮他們的生存狀況!

    怎樣對待弱勢群體,是一個社會最柔軟的部分,恰恰也是一個社會最強大的部分。
    一個國家是不是真的強大,一定不是出了多少英明領袖,造了多少核彈,有多少外匯儲備,在奧運會拿了多少金牌,GDP增長率多高……,這些和楊改蘭們沒有毛線關系。
    一個社會的文明程度就是看怎么對待你的弱勢群體!


    雷洋事件我們也看到了結果吧!我們什么時候能夠真正的進入一個法治的國家,明文的國家!
    以前大家談起中國各種不好的時候,我深不以為然!我始終以國家為自豪,中國各種變強,反腐大塊人心,但是我們仍然還差太多!我有一腔熱血,愿意灑在這片土地上,但是這片土地缺乏土壤!

    天下興亡,匹夫有責!愛之深,恨之切!


    變幻的技術
    技術總是變化的很快,前端更是一年三個樣!
    關于博客
    終于搭建了自己的博客系統www.ityouknow.com,博客園雖然是一個很好的交流的地方,但是對于我們程序員來講,能有自己的博客系統,那感覺還是不一樣,我的博客系統是基于jekyll改造的。jekyll最大的優點是可以托管到github上面,在結合markdown的這樣書寫方式可以非常方便的寫文章,有一種用編碼的方式來寫文章的感覺,特別好,每次寫完文章直接github提交,就自動發布到博客系統中了,自己在網上找了一個 jekyll的主題 Yummy-Jekyll搭配最后搞定。現在寫文章的過程就是:首先在sublime上以markdown的方式寫好文章,然后提交到GitHub上面,最后同步到博客園里面。
    2016年也算是我寫博客的元年,很早以前就注冊了博客園大都是看看文章和新聞很少自己寫,一方面覺得自己水平太差,另一方面嫌麻煩。2015年開始零零星星的寫了幾個,2016才慢慢的找到了感覺,文章的質量不敢說怎么好,但是16年也算是認認真真的來對待它。技術類的文章主要有:
  • jvm系類文章

  • spring boot系類文章

  • 系統架構類文章

  • 有兩篇文章進入了博客園的最多推薦:
  • 程序員該用哪種姿勢來理財

  • 六年程序生涯

  • 其中《六年程序生涯》更是被程序猿等公共賬號所轉載是我始料未及的。
    其實通過這些文章發現,博客園里大家還是更喜歡程序員生活感悟帶來的一些共鳴,今年也計劃會多寫一些這方面的文章,我的技術文章還需要更努力。寫文章的過程也是和圓友不斷交流的過程,正是很多的園友的留言、點贊或者更進一度的溝通,讓我才更有動力一直寫下去。
    技術方面
    由于我司以前都是分布式的開發模式,隨著子系統的增多,系統直接的調用越來越復雜,如果更新一個子系統或者更新一個子系統的地址,需要更改很多配置文件重啟相關好幾個子系統,一直在尋找SOA的解決方案,就用到了DUBBO,我們首先是在后臺統一賬戶中心中做了使用,發現效果還比較好,穩定性也不錯,于是在做眾籌平臺的時候全面啟動了dubbo,開發的過程到也沒有什么說的,等到了最后投產后,出現問題了。
    首先是tomcat動不動就內存溢出直接down掉了,然后跟蹤日志也沒有什么特殊的現象,然后添加腳本在內存溢出的時候讓down出內存堆棧信息,發現有很多的對象沒有釋放,最后才發現在腳本中禁止了代碼的GC,但是dubbo框架里面都是啟動了Nio需要自己來觸發GC,因此導致溢出。去掉腳本中-XX:+DisableExplicitGC解決,解決后又出現另外的問題,反正是填了很多坑,最后穩定下來,有時間這方面也終結一個文章。
    在開發眾籌app的時候因為時間問題也采用了混合開發的模式,原生+vue+html這樣的技術桟,APP的主框架和所有的第一頁面全部采用原生代碼開發,其它二級頁面全部是vue+html,那時候vue也才剛剛火起來,對比了react和angular最后還是選擇了vue,在后來一點博客園就出現了很多VUE的文章,寫的非常好。但是我們初期找了很多Demo來參考,還是填了很多坑才最終投產上線。
    在后來就遇到了spring boot,找了幾個項目練手之后發現使用起來特別爽,明顯的簡化了開發模式,而且結合spring cloud可以非常容易,簡單的構建一套均衡負載、容錯、穩定的平臺,注冊中心、服務中心、配置中心,路由等一套體系用起了特別爽!相比較起dubbo,spring就是全家桶,微服務的需求幾乎都考慮到了,dubbo很久都不更新了,因此我們就全部的擁抱了spring boot,為了更好的學習spring boot我們還開源了一個網站 云收藏,可以收藏和查看技術文章。
    我也在github上面分享了一些關于spring boot的學習案例 spring-boot-starter,其中開源的云收藏網站的代碼最受歡迎 網站源碼,文章介紹:我們的第一款開源軟件
    關于生活
    生活總是讓你不可捉摸

    以前我們看電視劇總是感覺這他媽太狗血了吧,但隨著年齡的增大才發現生活中的劇情遠遠比電視劇更狗血。


    關于親人,不管我們身在哪里,親人永遠都是內心最柔軟的那個地方,特別是北漂程序員這個群體,遠離家鄉,一年中和父母、親人相聚的時間有一個月嗎?無論如何多給家里打打電話,多回趟家和父母聚聚,很有可能某個時候,就再也來不及了。2016年是我最沉重的一年,不堪回首。
    我總說6是我特殊的數字,16年生活中的事情太多,來不及梳理。
    今年參加了好幾個非常好的朋友婚禮,也和女友領了證。好幾個朋友生了孩子,一起來北京的很多兄弟,又離開了北京,每年都是這樣,一群人奔向北京,一群人選擇離開北京,有人為了理想,有人選擇了生活。
    今年在6月份在公交駕校報名學了車,其實朋友包括女友早都學了車,自己一直覺得反正買不起,買了也養不起一直沒有學,這次呢是因為想著以后和朋友周末可以租車去玩比較方便于是就學了,科目一沒有難度,主要是科目二的倒庫最麻煩的,我當初也算是下了功夫,記錄了倒車入庫的各種知識點,只是最后其實也沒啥用,全憑了手感,分享一小段當時記錄的:
  • 右倒車入庫:
    右倒車至后窗1/3處向右打滿方向盤,查看右后視鏡 根據后輪和右停車腳的距離選擇放輪 直到右后腳可以入庫 看左前后視鏡看到左庫腳 方向盤放正 倒車至 倒庫前沿線在左后視鏡下面位置停車

  • 右倒車出庫:
    摘倒檔掛一檔 往前開 看到左后輪出庫腳 方向盤左打滿

  • 關于身體,現在鍛煉真的是越來越少了,剛來北京的時候還和朋友打打籃球,沒事去游游泳,現在呢,16年除了游泳去過幾次,別的活動幾乎都拉下來了,做為程序員真的需要多鍛煉身體。

    親人永遠都是你內心中最柔軟的那個地方


    其它的事情也不愿意在提起了
    2017年
    生活,計劃永遠趕不上變化
    17年也么什么想計劃的,想多陪陪家人,多出去轉轉。搞好生活,處理好工作,本是平凡的生活,平凡的世界。
    如果有希望,那就希望環境能變好一點,生活能多一些樂趣,親人都健健康康一些。


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(6)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:16
    • 從零到百億互聯網金融架構發展史


    Source: http://www.cnblogs.com/ityouknow/p/6276686.html
    回想起從公司成立敲出的第一行代碼算起到現在也快三年了,平臺的技術架構,技術體系也算是經歷了四次比較重大的升級轉化(目前第四代架構體系正在進行中),臨近年底也想抽出時間來回顧一下,一個小公司從最開始的零交易到現在交易量超過百億背后的技術變遷。
    總體介紹
    在互聯網金融行業一百多億其實也算不上大平臺,也就是二級陣營吧,其實每次的架構升級都是隨著業務重大推進而伴隨的,在前一代系統架構上遇到的問題,業務開發過程中積累一些優秀的開發案例,在下一代系統開發中就會大力推進架構升級。一方面可以平滑過度,一方面公司資源可以大力支持,同時技術的小伙伴們可以使用到前沿的技術,更有開發的成就感,就這樣我們大概也就是9個月就行系統架構一次升級,就到了我們現在的這套架構中。
    很多網友經常會問,你們平臺的TPS是多少呀,最大并發是多少呀,性能怎么樣,說實話我們是一個小公司,最夸張也就上萬人同時搶標,但是做為一個中型的互聯網金融平臺要做的事情也真的不少,遠遠不只是這些參數可以說的清楚;我們也不是什么高大上的平臺,使用的技術也是目前比較主流開源產品,但在公司不斷發展的過程中也遇到了很多的問題,也盡量去使用比較主流的、開源的、適合我們的一些解決方案來構建整個系統,在這里分享平臺發展背后技術換代的變化,同時希望和大家多做一些交流,多提一些建議。
    我們進行了四次大的架構變化,每代架構都用一句話來總結:

    • 第一代架構特點:業務比較集中、功能滿足投資理財需求、快速上線

    • 第二代架構特點;分布式系統改造,平臺化初具規模,各項垂直業務系統搭建上線、產品端極大豐富用戶投資、大數據平臺研究并使用

    • 第三代架構特點;SOA治理,使用zookeeper作為注冊中心,dubbo做監控和調度中心;cas實現單點登錄,使用shiro做權限控制

    • 第四代架構特點;全面啟用微服務開發模式,springboot+springcloud技術桟做為第四代架構技術支撐


    下面做詳細介紹
    第一代系統架構
    2014年應該算是互聯網金融元年,在之前其實已經有很多互聯網公司用著各種模式在生存,一直不溫不火,但是到2014年突然火爆了起來,首先是網貸之家,網貸天眼這種第三方網站流量突然增加,接著是媒體報道不斷跟進,再后來就報出各種互聯網金融公司獲得XXX美元投資的報道越來越多,政策也慢慢明朗,于是很多大型公司(集團)也就趁著這股熱潮跟進,其中就包括我們。
    第一代系統最主要就是搶時間,公司希望用最短的時間內保證系統上線,那時候移動浪潮已經啟動,于是決定優先上線移動端,網站可以暫不考慮。公司當時有PHP和Java兩種開發語言技術儲備,因為PHP在快速開發上面有著非常大的優勢,因此決定采用前端PHP+后端Java這種模式。系統分成了三層:用戶層:安卓和IOS移動端;接口層:php提供用戶和交易接口;后端:后端有兩部分,后臺和定時系統。后臺用PHP開發和接口層公用了一個系統,另一個是定時系統,負責計息、派息、到期等定時任務等使用了java開發。
    基礎服務和中間件,mysql做了最基本的主從來支持,第一代系統只是使用了mysql的主庫,從庫只是同步備份;memcached用來處理用戶搶標的并發問題,也只用了這一塊;ActiveMQ用來使用二級市場的轉讓撮合以及其它一些異步消息通知。項目部署:php使用apache部署,定時服務使用tomcat6來做應用服務器,使用lvs來做前端apache的負載,基本上第一代也就這些技術了,下面是第一代系統的架構圖。
    第一代系統上線之后,網站和H5(手機瀏覽器或者微信端)系統建設就變的特別突出,作為一個互聯網金融公司沒有官網不能忍,于是又開始馬不停蹄的開始開發網站和H5系統,在這個期間PHP之前做的后臺這塊摘了出來,用java從新規劃了一版,至此PHP就負責了網站、APP接口、H5這三個系統,三個系統共用的一個核心交易,java這邊負責后臺管理和定時服務,我們一般給這個架構叫做1.1代架構。
    第1.1代系統架構圖,綠色部分為變動部分

    第一代系統的缺點是業務過于集中,倉促上線,后期問題較多


    第二代系統架構
    第二代系統的背景是隨著公司業務量的快速發展,很多初期所欠的技術債務統統爆發,線上出現了很多問題,最嚴重的一次是給個別用戶重復派息,各種被罵,現在記憶猶新。另一方各業務部門需求不斷,公司產品需求不斷,所以這個階段就是忙著修復各種生產問題,一邊還需要開發垂直業務系統。那段時間差點被逼瘋了,第一代系統是封閉開發,回來還沒緩過勁,這邊又趕馬上架,真是疼并快樂著。
    第一個垂直子系統上線的是:合同系統,當時用戶投標后沒有一個合同,很多用戶很不放心,就把優先級提到了前面。后來就單合同系統就改了三個版本,第一個版本只是生成pdf,第二階段上線電子簽章,第三個階段加水印,自定義動態生成pdf;緊接著開發積分系統:用戶邀請,投資等生產積分,用來兌換抵現卷等;抽離出消息系統:站內消息、短信、郵件等;上線監控系統、業務監控和服務監控,業務失敗預警;各業務部門繼續不斷提需求,上線財務系統:財務人員統計核算金額;風控系統:監控異常用戶,異常交易;給銷售開發了銷售系統;因為和很多第三方系統對接,又開發了對外接入系統。
    一代系統做的很趕,產品界面又很爛,隨即啟動規劃了網站2.0、APP2.0、H52.0,針對前端系統的需求,在后端開發了CMS系統來發布項目、公司的公告新聞等;第二代產品端普遍規劃了很多大數據分析的一些需求,會在官網展示全量數據分析后投資偏好、投資的金額都跑到哪里去,前端用地圖來展示,對于個人也會有還款日歷,代收數據分析等,因為需要跑全量數據,在規劃的時候都是設計離線來處理,將數據從mysql從庫同步到mongodb的集群中,利用mongdo的mapreduce技術來處理大量的數據,于是我們的數據庫層就變成下面的這個架構
    mysql實時同步到mongodb,我們使用的是tungsten-relicator這個工具,會在mysql服務器端啟動一個監控agent,實時監控mysql的binlog日志,同時在mongodb的服務器端也起了一個服務端,agent監控到數據變化后傳送給服務端,服務端解析后插入到mongodb集群中以達到實時同步的效果,如上圖,當初寫了一篇文章來介紹:大數據實踐-數據同步篇tungsten-relicator(mysql->mongo),其實這個工具在使用中,也不是特別的穩定,但是當初的選擇方案并不多,幸好后期慢慢的熟悉后算是穩定了下來。
    數據清洗系統我們大膽的使用了golang來開發,當時使用的golang版本是1.3吧,現在都1.8了,以前也是沒有接觸過也是鍛煉了隊伍,好在golang語言本身非常簡潔和高效,雖然踩了N多坑,但是最終我們還是按時投產了;后來又使用了golang開發了一個后臺,是在beego框架的基礎上來做的。大數據分析系統后來又升級了一代,在前端的各業務系統,UI用戶層做了很多埋點來收集用戶數據,通過activeMQ傳輸接收最后存儲到mongodb,在進行數據清洗,將清洗后的結果存入到結果庫中,供前端業務系統使用;后來利用beego+echart重新做了一版數據分析系統。
    大數據系統的架構圖
    因為后端數據庫的壓力不斷增大,后端管理系統、業務系統均作了主從分離;后臺管理系統增加緩存,啟動了redis做緩存;使用nginx搭建了獨立的圖片服務器;第二代系統開發過程中,也是公司發展最快的階段,上線了N多的活動。
    第二代系統架構圖:
    稍等總結一下:
    第二代架構上線了各業務系統,做了主從分離,搭建了大數據平臺為以后更多的數據處理提供了技術基礎
    缺點:各業務系統切分之后,各項目之間調用復雜;后臺系統繁多、各系統之間有單獨的賬戶系統,運營需要來回切換完成平臺運營監控
    第三代系統架構
    第二代系統開發完成之后,留給我們了三個問題很痛苦,第一個是隨著業務系統不斷增多,系統之間的調用關系成指數級別上漲,在第三代系統初期,我們又開發了很多基礎組件,更是加劇了這個問題;第二個問題和第一個問題相輔相成,系統之間調用關系太多,如果移動其中一個子系統,可能需要修改關聯系統的配置文件,重新啟動服務,經常因為更新一個系統,其它系統也需要被動更新,投產和出問題切換很復雜;第三個問題是我們開發了很多的后臺系統,但是賬戶沒有統一,每個子系統有各自的賬戶中心,運營和業務人員需要來回登錄才能完成日常工作,隨著業務量增大這個問題也日益突出。
    于是又開啟調研、系統選型等,解決第一個問題就是引入SOA服務治理,通過服務的注冊和發現解決系統之間的解耦,當時考察了很多,最后選型dubbo,原因無它,有大量群眾使用基礎該趟的水的趟過了。解決第二個問題就是引入配置中心,當時調研了360的Qihoo360/QConf、Spring的spring-cloud-config、淘寶 的diamond、還有百度的disconf,最后糾結半天選定了disconf,完美和spring cloud擦肩而過,但是正是從這里開始讓我們注意到了spring-cloud、Spring-boot為第四代的架構選型做了基礎,其實最后disconf也只是在少部分項目使用,也沒完全推廣開;解決第三個問題就是賬戶中心,使用了cas實現單點登錄,shiro做權限控制,dubbo來提供登錄后權限列表等服務端接口。
    改造后的架構圖
    在這個基礎上面,我們又抽離出來很多基礎組件,comomn組件處理共用的基礎類,包含字符類、日期類、加密類....,搭建了fastDFS集群來處理文件系統,做了redis集群的測試;單獨開發了定時調度系統,將所有的定時任務統一集成到調度系統,那個系統需要定時任務都可以在頁面自動添加調度策略;前端PHP做了系統改造,主從分離、靜態優化等
    在后來,公司又啟動眾籌平臺的建設,這次系統完全采用java語言開發,app端采用混合開發模式,其中APP的所有一級頁面全部采用原生開發,所有的二級頁面都是H5+vue這種模式,后端全部采用dubbo做服務化,最終的架構如下:
    圖里面系統只羅列一部分,使用其它服務來代替

    第三代系統啟動了SOA服務治理,引入統一賬戶中心、基礎組件;缺點是開發環境較復雜


    第四代系統架構
    人總是不滿足,技術呢也總是希望可以使用最好架構體系,在三代系統架構的開發中,了解到了spring cloud和spring boot,在不斷的學習之后,越發的感覺到springboot的便利性,快速開發的優點甚是喜愛,spring cloud體系也完全滿足一個大型系統需要考慮的方方面面,微服務的概念不斷的被提出來,以上為技術背景;另一方面國家開始嚴格要求P2P公司必須與銀行存管,分析了銀行的相關接口后發現如果嚴格按照規則走,我們的系統需要大改造,同時公司為了滿足監管要求,又開發出白條相關產品也是一個大項目,趁著以上的兩個背景,我們決定在進行銀行存管和白條項目的同時全面擁抱微服務。
    至于為什么我們要拋棄dubbo轉而全面擁抱spring cloud原因有三,1、dubbo多年都沒有更新了,spring cloud不斷的在更新升級;2、dubbo主要做服務治理和監控,spring cloud幾乎考慮了微服務所需要方方面面,比如統一配置中心、路由中心;3、spring cloud更是無侵并且完美和spring其它項目整合,開發效率更高。
    既然選定了使用spring boot+spring cloud來改造,微服務技術選型這邊就定了下來,那么如何開啟改造呢,畢竟在進行新一代系統改造的同時也不能影響原有業務,其中最主要的問題就是最初的系統雖然都是按照分布式的開發模式來進行,由于老系統的原因有的系統還是共用了一個數據庫,微服務要求每個獨立的子系統有自己獨立的庫操作,別的系統如果需要修改或者查詢子系統的數據,需要根據服務間接口調用來獲取。因此計劃先從新開發的項目和需要改造的項目中啟用springcloud項目,別的系統暫時先通過路由器模式來通訊,最終的系統架構圖如下:
    在架構的這條路上面沒有終點,變化就是永遠的不變,架構的升級更是為了更好的支撐業務,二者相輔相成。
    開源軟件
    在這幾年中我們也想對開源世界做一點點貢獻,總共開源了兩個軟件:
    generator-web
    在項目中大量使用了mybaits,我們對mybaits的generator做了改造,并且做了一個系統界面,方便根據相關參數自動生產相關代碼(只需要設計好表結構,系統會自動生成mappper、Entity、dao層的代碼),最后也開源了出來
    generator-web
    界面如下:
    云收藏
    為了鍛煉技術學習springboot我們開發了一個云收藏的開源軟件,使用的技術主要是springboot/Spring data jpa/redis/thymeleaf/gradle,功能主要是可以幫助用戶在云端收藏、分享和整理自己的收藏夾。
    favorites-web


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權所有,歡迎保留原文鏈接進行轉載:)
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(12)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:16
    • 發現另外一個世界


    Source: http://www.cnblogs.com/ityouknow/p/6295469.html
    據說網絡中的我們能搜索瀏覽到的信息只有4%,96%的信息都隱藏在另外的一個世界之中,又由于我國著名的GFW,那么我們所能接觸和搜索到的信息就更少了,人總是有非常大的好奇心,想去窺探另外的一個世界,作為一名IT行業的從業人員,更是有網上探索的精神。本篇就將介紹我是如何去發現另外一個世界的過程。

    想要探索另外一個世界,第一步需要突破的就是GFW


    科學上網之路
    圍城里面有這么一句話,“在墻外的想到墻內去,墻內的想到墻外來”。但是對于GFW這到墻來講,又有那些人想到墻里面來嗎?平時我們可能也習慣了不能上facebook,twitter之類的,因為國內都有類似的替代品;也習慣了各種游行示威消息被屏蔽,因為這樣避免國內民主情緒;這道墻在這里可能對生活也沒有啥影響,偶爾FQ出去了,發現也不一定就能找到你所喜歡的東西,注冊了facebook半年沒有幾個朋友,習慣了免費的網盤會使用付費的Dropbox嗎?要不通過什么xx門類似的FQ軟件全TM都是反我天朝各種偏激,對著這些新聞看看也只能呵呵了。
    好像時間長了,慢慢的都已經麻木了,不FQ就不FQ也影響不了啥;但是就是因為這道墻你會感覺到不自由,心里的那種不自由的勁兒那你就是百般的不爽,特別是對于我們這些搞IT的,實在是忍無可忍,百度一個問題的時候TMD我都不知道搜出來的是什么,對于谷歌可以精準找到我想要的東西,快速的解決問題。基于各種原因吧,慢慢的走上了探索如何FQ的各種路子,可以分幾個階段來描述。
    第一個階段(2006-2010年)
    上大學那會,啥都不會,在到處瞎溜達,類似無界、xx門的一些小軟件吧,不知道網上那塊找的這些軟件,打開就是各種反動思想什么的,好像也不能谷歌或者我那時候都不知道有谷歌,最后看看熱鬧就算了。這些小軟件都有一些共同的特征,應該是各種國外反我黨做的軟件吧,質量不咋的,就算連通之后上網可以用龜速來形容,另外打開之后全是反我黨的各種宣傳,類似 XXX的真相、XXX退黨申明、XXX內幕,反正我對這些完全不感冒,連接上之后也會嘗試這去訪問國外的網站,但都是亂看,后來就慢慢沒有興趣了。剛搜索了下現在還有這軟件,真是服了。
    第二個階段(2010-2014年)
    工作以后對互聯網了解多了一些,想去注冊什么facebook、twitter之類的網站,也想使用谷歌搜索,就繼續進行了研究,在這個階段算是嘗試的最多的了。大概可以分為三類:網站直接FQ、瀏覽器插件FQ、第三方的VPN。
    網站直接FQ,只是提供了谷歌的搜索功能,還是不能訪問國外的網站。記得有一個的香港谷歌站點可以進行搜索使用,過了一段時間后就被封了;網上又有一些人共享了一些小網站或者代理網站,背后不知道是通過代理還是什么,可以進行谷歌搜索,斷斷續續的使用了一段時間,后來又被掐斷了。
    瀏覽器插件FQ,一般是通過安裝瀏覽器插件代理來實現FQ,可以訪問國外站點。360、百度之類的瀏覽器公司都推出類似的插件來推廣,需要下載他們的瀏覽器以及特定插件,就可以進行谷歌搜索、訪問國外站點。但是使用這些插件都是有限制的,比如說限制訪問國外站點網速,或者三天之內需要打開一下hao123.com,或者做一些什么任務。后來網上也推出了藍燈等一些軟件,通過chrome插件的形式,來提供FQ的服務,斷斷續續的使用了一段時間,很不穩定最后也是放棄了。
    第三方VPN服務,很多小公司專門提供vpn包月,包年的套餐,需要按照一個獨立的客戶端,登錄賬戶之后就可以連接日本、香港或者歐美這些國家的代理服務器來FQ。通常這些vpn都會提供試用的功能,比如可以免費體驗XXXM流量的使用,或者每天簽到可以領取20M代理使用的流量類似這樣的促銷,時不時的提醒你重新登錄一下或者免費流量試用完了也挺煩人的,但只是偶爾谷歌一下還是夠用的。像稍微比較有名的有紅杏、greenvpn等大概一年就是一百多元把,繳費后的使用一般還算是比較穩定的,但有時候如果國家稍微查一下就需要關閉一段時間或者換一個IP地址之類的。
    第三個階段(2015-現在)
    做為一名IT從業人員,如果僅僅只是使用別人服務的話那就太low了,于是想著買一些國外的服務器來自己搭建代理。無意中聽說了搬瓦工,網上搜索了一下,大于每年128元就可以買一個國外的服務器,當然了配置很低,但是流量不錯呀每個月500G,也可以裝一些博客什么的,都沒有問題。于是根據網上的教程,購買機子、搭建shadowsocks服務端、客戶端,搭建過程總體比較順利,完了網上一搜什么facebook、google等嗖嗖的,各種爽呀。
    板瓦工支持支付寶付款,購買完成之后也可以將代理切換到美國不同的城市來提供代理,當然還有很多其它的國外服務器廠商,但這個應該是最便宜的,我使用的半年多除過G20時期的時候出過問題,其它時間還是比較穩定的;最主要的是我們同時用于了一個國外的服務器,可以放一些小的網站之類的,也可以幾個人共同買一個,反正我每個月500G的流量,從來都沒有使用超過10%。
    如果還嫌不夠方便還有兩種辦法:1、國內在買一臺服務器,上面搭建一個客戶端代理,我們的設備只要連接上國內的代理服務器就可以上網了,這種方式完全可以提供對外的服務了。2、使用openWrt來刷路由器然后在結合shadowsocks配置,讓這臺路由器具備了FQ的能力,接下來只要連接這臺路由器的設備都可以輕松實現FQ。
    搬瓦工的價格
    暗網
    什么是暗網
    暗網(英語:Darknet或Dark Web)通稱只能用特殊軟件、特殊授權、或對電腦做特殊設置才能連上的網絡,使用一般的瀏覽器和搜索引擎找不到暗網的內容。暗網的服務器地址和數據傳輸通常是匿名、匿蹤的。與此相對,一般常用的互聯網由于可追蹤其真實地理位置和通信進行人的身份被稱為“明網”(英語:Clearnet)。
    暗網雖然通常需要借助公開的互聯網當作線路,但它們通常使用非常規的網絡傳輸協議和端口(常規的互聯網傳輸協議是HTTP/HTTPS,分別使用端口80/443),有些使用分布式網絡架構或層層轉傳來混淆來源,使得第三人難以知悉有網絡交流正在發生,就算知悉也難以追蹤通信參與者的真實位置和身份;再搭配全程加密傳輸,使得就算第三人攔截了通信也難以解析內容。
    暗網有許多種類,所有暗網的集合組成了深網的一部分。常見的小規模暗網是朋友之間使用P2P分享文件。目前最大規模的暗網則是洋蔥網絡,只能通過tor來訪問。
    TOR
    TOR 是洋文 (The Onion Router)的縮寫,中文又稱“洋蔥網絡/洋蔥路由”。簡單而言,這是一款專門設計用于隱匿上網身份的工具。設計 TOR 的主要目的是為了上網隱匿身份。所以,跟其它的FQ工具不同——它的重點功能是"隱匿性","FQ"只是順帶的功能。 Tor最初由美國海軍研究實驗室(US Naval Research Laboratory)贊助。2004年的后期,Tor成為電子前哨基金會(Electronic Frontier Foundation,EFF)的一個項目。在2005年下半年,EFF雖然不再贊助Tor項目,但他們繼續維持Tor的官方網站 。
    Tor支持動態代理鏈(通過Tor訪問一個地址時,所經過的節點在Tor節點群中隨機挑選,動態變化,由于兼顧速度與安全性,節點數目通常為2-5個),因此難于追蹤,有效地保證了安全性。另一方面,Tor 的分布式服務器可以自動獲取,因此省卻了搜尋代理服務器的精力。Tor瀏覽器在后臺啟動Tor進程并透過其連接網絡。一旦程序斷開連接,Tor瀏覽器便會自動刪除隱私敏感數據,如cookie和瀏覽歷史記錄。
    暗網有什么
    暗網有著人性最黑暗的一面,盜版、黑客、毒品、軍火、血腥、暴力、色情、陰謀論、職業打手,甚至是恐怖分子。有人說“深網”是網絡世界的罪惡天堂,也有人說,“深網”是人性最深處的黑暗。但是國內目前通過tor瀏覽器已經不能訪問暗網了,貌似又被封閉了,需要啟動前端代理,也就是前面說的代理服務器來使用。
    暗網的網站一般都是以.onion為后綴的網站,現在如果登錄進去會有很多類似的導航網站,對于普通人來講,以我個人嘗試的幾次情況來看,大部分人登錄進去也就是看看熱鬧,里面有一部分侵入工具、黑客交流網站,一部分就是各種愛情動作片的網站、還有各種盜版的軟件、論壇等等,但國內使用起來反應巨慢,根本沒發正常使用,也許也是因為了解的不夠多。
    Resilio Sync
    最后給大家介紹大名鼎鼎的Resilio Sync, Resilio Sync的前身是BitTorrent Sync 是一款可以取代網盤的P2P共享軟件,它和BT下載一樣,都是BitTorrent公司發明的玩意兒,通過P2P協議來進行傳輸。而這個軟件最厲害的地方在于,同步時無需第三方服務器,直接點對點加密傳輸,所以安全性無敵。使用按照可以參考這篇文章Sync 完整中文版圖文教程,這個軟件最大的好處就是完全去中心化,根本就無法監控。

    使用Resilio Sync兩大用處:同步自己文件和分享自己的文件


    同步文件
    這段時間最疼恨的就是各種國內網盤關閉,剩下的幾家不是收費,就是限流用起來非常的不爽。如果你使用網盤只是為了同步數據,那么使用Resilio Sync可以完全將它替代,而且速度不受中心服務器各種影響,只和自己網絡帶寬有關。如果想同步本機文件,可以在自己的電腦上面設置一個文件夾,生成一個對應的key或者二維碼,手機或者pad掃二維碼或者輸入key就可以直接同步了。公司內部的文件也可以采取這樣的方式,在服務器上面劃分一塊區域,大家把需要共享的文件都可以放到一起來共享,也可以設置只讀或者讀寫的權限。
    分享文件
    這個目前是大家最喜歡使用的功能了吧,所有自己分享的內容都依賴于key,于是網站會有人分享各種各樣的key,IT類的電子書,最新的電影合集key、還有專門用來導航的key;以前用百度云盤來分享東西,涉及到什么最新的電影之類的應該很快就被和諧了,但是使用它來分享那是決定不會發生的事情,因為完全去中心化,沒有服務器會存儲你分享的內容,只是通過這個軟件來同步。
    因為是去中心化,那么數據都是從個人到個人,如果你下載了這個內容,并且軟件打開著,那么你也會為這個資源服務的一部門,一方面你是資源的下載者,一方面又是資源的上傳者,軟件會根據最優的算法來從你最近的幾個用戶的電腦里面來下載。于是也催生了一部分專業分享key的網站,這里有一個導航的網站里面的網站都是專業分享key的網站,質量參差不齊。wherebt.com
    我也是無意查找一個軟件的時候發現這個工具的,使用了之后感覺像發現了另外一個世界,有各種盜版的書籍、盜版的高清電影、有反我黨的各種書籍資料、有各種小電影、哪怕前一陣子流行的X寶10G,歷年被脫褲的數據庫資源(大概100多G吧,利用這些資源都可以建各種社區庫的網站了),當然還有各種病毒。
    自由、開發、無監管可以體現出來互聯網人這種無拘無促的精神,但也同時會帶來一些問題,比如會有暴力、色情、病毒等,工具(技術)是無罪的,主要是人如何去使用它!


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(9)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:16
    • 一次生產事故的優化經歷


    Source: http://www.cnblogs.com/ityouknow/p/6369051.html
    在一次正常的活動促銷之后,客服開始陸續反饋有用戶反應在搶標的時候打不開網頁或者APP,在打開的時候標的就已經被搶光了,剛開始沒有特別的上心,覺得搶標不就是這樣嗎,搶小米手機的時候也不就這樣嗎?隨著活動繼續推進,有更多的用戶強烈抗議,用戶領了加息卷或者抵現卷之后搶不上標的,認為是平臺作假故意不讓使用以達到節省資源。
    分析過程
    其實以前也會有陸續的用戶反饋不減少,給客戶以小米搶手機為例子忽悠了過去,這次用戶反饋太過強烈,才讓我們重視了起來。我們前端一共三款產品,app、官網、H5,其中app使用量最大,官網其次,H5平時使用量極少但是做活動期間流量會暴增(活動一般都是H5游戲居多,H5也便于推廣營銷),前端的三款產品都是分別使用lvs負載到后端的兩臺web服務器中(如下圖),這次用戶反饋基本在web和app端,所以重點觀察這四臺服務器。
    首先懷疑網絡帶寬是否被涌滿,找到網絡工程師通過工具來監控,在搶標的時候帶寬最高使用率只有70%左右,隨排除之;再次懷疑web服務器是否抗不住了,使用top命令查看官網負載的兩臺服務器,在搶標的瞬間會飆到6-8左右,搶標后也慢慢的恢復了正常,app兩臺服務器高峰到10-12,隨后也恢復正常。
    跟蹤web服務器業務日志,發現在數據庫更新層報請求不到新的數據庫連接或者數據庫連接已經用完,認為是數據庫的最大連接數太小,于是調整mysql數據庫最大連接數為以往的3倍;下次搶標的時候繼續觀察業務日志,發現已經不報數據庫鏈接的相關錯誤了,但還是很多用戶反饋搶標時候打不開頁面。
    繼續跟蹤web服務器,在搶標時使用命令(ps -ef|grep httpd|wc -l)查看httpd得連接數有1千左右,隨機查看apache配置文件中設置的最大連接數為1024(apache默認的最大連接數為256),原來搶標期間連接數已經到達最大連接數,很多用戶在搶標的過程中已經獲取不到http連接導致頁面無響應或者app一直在等待中。于是調整apache配置文件中的最大連接數為1024*3。
    在搶標過程中繼續觀察,apache的連接數在搶標的時候仍然可以飆到2600-2800之間,根據客服反饋,仍然有很多用戶反饋搶標的問題,但比之前稍微好一點,但是有零星的用戶反饋已經搶到標的,最后又給回退了。然后繼續觀察數據庫服務器,使用top命令和MySQLWorkbench查看mysql主庫和從庫的各項負載嚇一跳(如下圖),mysql服務器主庫的各項指標均已經達到峰值,而從庫幾乎沒有太大壓力。
    跟蹤代碼發現,三端的業務代碼全部連接主庫,從庫只有后臺的查詢業務在使用,于是立刻啟動改造;將除過搶標過程中的查詢外,其它頁面或者業務的所有查詢改造為查詢從庫,改造之后觀察,發現主庫的壓力明顯減少,從庫的壓力開始上來了。如下圖:
    根據客服的反饋,改造之后搶到標回退的問題幾乎沒有了,搶標過程中頁面打不開或者打開慢的問題有一定的緩解但仍有部分用戶反饋此問題,根據上面各項目分析結果得出:
  • 1 負載的兩臺服務器均已經達到處理的極限,需要配置更多的服務器來負載。

  • 2 mysql主庫的壓力明顯減少,但是從庫的壓力卻上去了,需要將現在的一主一從已從改為一主多從的模式。

  • 3 徹底解決這些問題,需要綜合考慮平臺的整體優化,如:業務優化(去掉業務中熱點)、增加緩存、部分頁面靜態化(可以使用雅虎和谷歌的前端優化規則,網上也有很多的測試網站可以評測)等等。

  • 當時根據這些情況寫了一份優化的報告,見下文:


    優化報告
    1 背景
    隨著公司業務不斷發展,業務量和用戶量的激增,官網pv也從最初的xxx-xxx到現在的xxx-xxxx,APP活躍用戶更是大幅增加;因此也對平臺目前的技術架構有了更大的挑戰。特別是近期平臺標源緊張的情況下,滿標的時間更是越來越短。服務器的壓力也越來越大;因此需要升級目前的系統架構,以支持更大的用戶量和業務量。
    2 用戶訪問示意圖
    目前平臺有三款產品面對用戶,平臺官網、平臺APP、平臺小網頁;其中平臺官網和平臺APP的壓力比較大。
    3 存在的問題
    用戶搶標的時候問題集中在以下幾個方面
    1、網頁或者APP打不開
    2、網站或者APP打開慢
    3、搶標過程中轉賬成功后,因為服務器負責壓力大更新失敗,再次退款
    4、數據庫連接數用完,導致滿標后添加投資記錄失敗,回退標的進度
    4、分析
    通過對近期的服務器參數,并發量,以及系統日志等進行深入的分析,得出:
    1、平臺官網、平臺APP搶標過程中服務器壓力巨大,其中平臺APP問題更加突出,搶標高峰期間單臺APP服務器apache最大連接數已經接近2600,接近apache最大的處理能力
    2、數據庫服務器壓力巨大。數據庫壓力主要在兩個時期比較突出
    1)當平臺做活動的時候,官網、小網頁、APP訪問量巨增,導致數據查詢量跟著巨增,當到達數據庫處理極限時,就會表現出網站打開慢等問題;
    2)當用戶搶標的時候,用戶搶標的壓力又分為兩個階段:搶標前和搶標中。搶標前,因為滿標速度很快,用戶提前打開搶標頁面不斷刷新,這樣數據庫的查詢壓力會不斷增大,如果搶標的用戶量非常大,會導致在搶標之前將數據庫連接數用完;搶標中,單次購買大概會涉及15張左右表進行更改查詢,每個標的份額1000萬大概每次會有100-200人左右購買完成滿標,以中間值150人計算,在幾秒的時間內需要對數據更新2000-3000次(僅僅是更新,不包括查詢 ),產生大量并發,可能會導致更新失敗或者連接超時,從而影響到用戶投標和系統正常滿標。
    5 解決方案
    1、web服務器解決方案
    單個用戶訪問web服務的示意圖
    目前網站和平臺APP均是采用了兩臺服務來做均衡負責,每臺服務器中安裝了apache來做服務端接受處理,每臺apache最大可以處理大約2000條連接。因此理論上目前網站或者APP可以處理大于4000個用戶請求。如果要支持同時1萬的請求,則需要5臺apache服務器來支持,因此目前缺少6臺web服務器。
    升級服務器后的訪問示意圖
    2、數據庫解決方案
    當前數據庫的部署方案
    1)主從分離解決主庫80%的查詢壓力。目前平臺官網、APP均連接mysql主庫導致主庫壓力倍增,把服務中的查詢全部遷移到從數據庫可以大量減輕主庫的壓力。
    2)增加緩存服務器。當從庫查詢到達峰值的時候,也會影響主從的同步,從而影響交易,因此對用戶經常使用的查詢進行緩存以達到減少數據庫的請求壓力。需要新增三臺緩存服務器搭建redis集群。
    3、其它優化
    1)官網首頁靜態化,從cnzz統計來分析,首頁占比網站的整體訪問量的15%左右,對于首頁不經常變動的數據通過靜態化來處理,提升官網打開的流暢度。
    2)apache服務器的優化,開啟gzip壓縮,配置合理的鏈接數等
    3) 去掉投資過程中的更新熱點:標的進度表。每次投標成功或者失敗都需要對標的進度表進行更新,多線程更新的時候就會出現樂觀鎖等問題。去掉過程中的更新,只在滿標后將標的進度信息保存在標的進度表,優化投資過程中對數據庫的壓力。
    6 服務器升級方案
    1、平臺最大的壓力來自于數據庫,需要將現在的一主一從,改為一主四從。官網/app/小網頁產生的大量查詢,由虛IP分發到三臺從庫,后臺管理查詢走另外的一個從庫。數據庫需要新增三臺服務器
    數據庫升級后的示意圖
    2、增加緩存減少數據的壓力,需要新增兩臺大內存的緩存服務器
    3、需要新增三臺web服務器分解用戶訪問請求
    app需要新增兩臺服務器
    在搶標過程中app服務器壓力最大,需要新增兩臺服務器,配置完成后的示意圖
    官網需要新增一臺服務器
    官網在搶標過程也有一定的壓力,需要新增一條服務器,完成后示意圖如下:

    總合計之后需要購置8臺服務器,其中有兩臺要求有大內存(64G以上)


    點擊下載優化報告word版本
    備注:所有優化方案投產后,問題解決,搶標無憂!


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(5)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:16
    • 一次dns緩存引發的慘案


    Source: http://www.cnblogs.com/ityouknow/p/6380603.html
    時間2015年的某個周六凌晨5點,公司官方的QQ群有用戶反饋官網打不開了,但有的用戶反饋可以打開,客服爬起來自己用電腦試了一下沒有問題,就給客戶反饋說,可能是自己網絡的問題,請過會在試試。早點8點,越來越多的用戶反饋官網無法打開,并且有部分用戶開發反饋app也打不開了,客服打電話叫起了還在夢鄉中的我。
    分析定位
    被客服叫起來之后,一臉懵逼,不知道什么情況,給客服回復,知道了,立刻排查,待會有消息及時溝通。用涼水洗了一把臉清醒了一下,立刻根據經驗回憶這兩天生產投產的情況:上線了XX模塊,不影響、修復了XXbug,應該也不影響、剛給服務器配置了https,看起來好像有點關系,但是app暫時沒有投產https,怎么也出現問題,排除之。打開電腦核查了最近的投產記錄應該都不至于發生這么嚴重的問題,隨懷疑是不是網絡方面有問題,立刻打電話叫起來運維經理以及相關人等一起排查。
    一邊讓網絡和運維排除問題,一邊再次核查了web服務器、數據庫服務器、業務日志、數據庫日志,以及其它的一些監控數據,各項皆正常。試著在本機ping了一下域名確實不通,更加懷疑是網絡問題,嘗試這直接使用外網訪問官,可以打開沒有問題,可以基本確認服務沒有問題,但運維部反饋網絡設備什么都正常,肯定是你們投產代碼出問題了,各方硬著頭皮繼續在排查。
    9點,群里開始有大規模的用戶反饋官網和app都打不開了,更有部分用戶煽動,XXX公司跑出了(15年很多p2p公司跑路,導致用戶都成了驚弓之鳥,稍微有問題便害怕公司跑路,個個都鍛煉成了監控高手,天天看,實時刷,凌晨起來尿尿也都順便看一下app上的今日收益),客服400熱線基本被打爆了。一邊繼續排查問題,一邊上報此問題給總監、公司各高管,給客服建議,給用戶解釋,IDC機房網絡抖動,技術正在緊急解決,資金和數據都沒有任何影響,稍安勿躁。
    10點,開發和運維反復的檢查后,開始懷疑dns解析有問題,但具體是什么問題還不清楚,CTO決定:1、大家都打車往公司走,來公司集體解決 2、在各QQ群、微信群給用戶群發解釋xxx問題,安撫客戶。在車上的時候重新梳理了一下用戶的整個訪問流程,如下圖:
    到公司后,根據這個思路大家在一起驗證了一下,通過外網IP和內網IP訪問公司所有服務都正常,但是通過域名訪問不行,另外監控服務器、防火墻、網絡設備日志都正常,因此斷定是DNS解析出現問題。
    攻堅問題
    既然確實是DNS解析問題,那么問題又來了?為什么DNS解析會出現問題?如何去解決這個問題?一邊給萬網提工單,我們也自己測試一下電信、移動、聯通在不同的網絡運營商下面的訪問情況,發現只有在聯通網絡的環境下DNS解析不了。根據客服得到的反饋也驗證了這個情況,電信和移動用戶反饋很少,聯通用戶反饋最多。于是我們又開始給聯通打電話,剛開始聯通不受理我們的這個請求,于是又開始以用戶的身份打電話給聯通公司讓立刻解決不能上網的問題。
    于是就開始了萬網和聯通的扯皮大戰,萬網說從他們那邊查看DNS解析都正常,一起指標都正常,我們又給聯通打電話聯通說我們已經知道了,待會由專業的人給我們回復,過了一會聯通的網絡工程師回復說,像這種情況一般都是域名解析的問題。早上10:30到公司開始短短的6各小時內,我們幾個輪流給聯通公司合計供打了近50、60通電話,給萬網提了N個工單,接了N個電話。
    期間領導也開始動用各種關系,聯通內部的朋友、網絡運維界的大拿幫忙來定位解決,我們也嘗試了很多的辦法,比如,使用ipconfig/flushdns命令清除本機的DNS緩存、在萬網的官網把DNS解析重新更新一邊、刪除在重新添加等等,也不是完全沒有收獲。我們一直想找一個可以測試各個地方、運營商網絡的辦法,終于在各方推薦和搜索的情況下找了17ce 和 360奇云測兩個網站,感覺非常實用,在以后的網絡定位中,成了我必備使用的工具,可以非常方便的監控各個運營商、各個地區網站的訪問是否通不通、訪問的速度快不快等問題,截圖如下:
    我們也發現,公司的其它域名也都訪問正常,就是官網的這個域名和相關的子域名不通。期間很多人都問了一個問題就是你們的域名有沒有忘了繳費,剛開始大家也都問了運維這邊說是沒有這個問題,直到中午12:30的時候在我們再三的追問下才說8點多的時候登錄上萬網的時候顯示這個域名是欠費狀態,但是他已經立刻把費用補了上去了。哎呀差點把我們氣死,問了不是域名到期有提示的嗎?才知道因為上一個運維經理走后,他們沒有及時的更新萬網的電話和郵箱導致提示郵件和短信也沒有收到。
    通過和萬網、聯通公司、領導的相關朋友溝通以及我們的測試觀察,初步明白了這個事情的原因:域名忘記繳費導致萬網的DNS解析被停止,用戶本機或者DNS服務器有緩存,所以部分用戶可以訪問部分用戶不能訪問;繳費過后萬網的DNS已經進行了更新和推送,但是DNS解析有很多的層級需要一級一級的往下面發送更新,有的層級并沒有更新到,導致部分沒有更新到的DNS服務商下面的用戶不能訪問官網。
    和萬網進行了溝通,問最延遲的情況所有的DNS更新到最新的時間,回答是48小時內肯定都會好的,但是我們等不起呀,隨著時間的推移越來越多的用戶發現問題,QQ群、微信群已經沸騰,董事長也開始關注次問題,有的客戶直接在群里面說,你們的技術太不給力了(像這種還是委婉的,有的直接打電話罵人)...
    臨時解決方案
    不斷的通過17ce測試發現,大部分地區的網絡都已經恢復,就剩北京聯通和部分地區聯通網絡環境下不通,也說明了這幾個地區下的DNS解析記錄沒有被更新。那么既然我們在上面已經定位出了問題,又了解是什么原因,就想著試著換個DNS解析服務器會不會好一點呢,于是我們把本地的DNS地址換成8.8.8.8(谷歌的DNS服務解析)發現好了!于是趕緊先寫解決手冊發給著急的客戶來使用。
    官網的用戶可以通過更改DNS來解決訪問的問題,APP怎么辦呢?沒有辦法我們也不能等,直接找開發人員把服務端調用的地址由域名暫時先改為外網的IP地址打一個版本供用戶臨時使用。安卓還比較好辦,直接讓用戶下載安裝使用還好,但是IOS那時候的審核最少都需要一周黃花菜都涼了。其實iPhone手機可以單獨設置DNS的,我們進行了設置和測試后發現也可以實現,于是馬上更新到手冊中發送給客服發送到群里面給用戶使用。
    點擊下載當時寫的DNS更新手冊
    有人說直接讓用戶使用外網就行了嗎,使用外網首頁打開到是沒有問題,但是各系統之間調用,相關配置文件里面寫的也都是域名的地址,如果硬改的話可能會引發另外的問題。第一天搞完就10點多了,中間就4點吃了一頓飯,打了N個電話大家都非常累,于是當天就先這樣了,第二天大家一早到公司繼續跟進。
    第二天到公司經過17ce測試發現所有的節點都已經通了就剩北京聯通的兩個接點沒響應,但是北京是我們的大本營,絕大部分的用戶都是北京的,繼續和萬網、聯通溝通看怎么能徹底的解決這個問題,另一方面做好最壞的打算,如果一直不通怎么辦。在生產環境中梳理所有使用域名的配置文件,做好隨時可以直接更新為外網地址而不能影響服務,app完整的重新做一個版本,做好隨時可以投產讓用戶強制升級到外網直連的版本。
    到第二天晚上10點的時候,北京聯通的這兩個節點還是不通,和領導進行了商議如果到周一早上8點來的時候這兩個網絡還是不能通的話,就上線改造好的系統和APP強制升級(因為當時周末還沒有標的,周內才有發標計劃)。第三天早上起來的第一件事情就是拿起手機,查看自己的聯通網絡是不是可以登錄上官網,結果通了!皆大歡喜。
    俗話說真理是愈辯愈明,經過了這次事故,也徹底的讓我了解了DNS解析的整個過程。
    DNS 解析流程
    DNS( Domain Name System)是“域名系統”的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用于TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換為IP地址的工作。俗話說,DNS就是將網址轉化為對外的IP地址。
    dns從用戶訪問到響應的整個流程
  • 第一步:瀏覽器將會檢查緩存中有沒有這個域名對應的解析過的IP地址,如果有該解析過程將會結束。瀏覽器緩存域名也是有限制的,包括緩存的時間、大小,可以通過TTL屬性來設置。

  • 第二步:如果用戶的瀏覽器中緩存中沒有,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關系,如果有,就先調用這個IP地址映射,完成域名解析。

  • 第三步:如果hosts里沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關系,如果有,直接返回,完成域名解析。

  • 第四步:如果hosts與本地DNS解析器緩存都沒有相應的網址映射關系,首先會找TCP/ip參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。

  • 第五步:如果要查詢的域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。

  • 第六步:如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理,并會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息后,將會聯系負責.com域的這臺服務器。這臺負責.com域的服務器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址給本地DNS服務器。當本地DNS服務器收到這個地址后,就會找域名域服務器,重復上面的動作,進行查詢,直至找到域名對應的主機。

  • 第七步:如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把轉請求轉至上上級,以此循環。不管是本地DNS服務器用是是轉發,還是根提示,最后都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。

  • 這個事情發生后給了我們很大的教訓:
    第一、流程管理有漏洞,離職交接不到位;
    第二、危機處理不成熟,影響公司聲譽;
    第三、監控機制不完善,像外網不通的這種問題,應該提前設置監控措施。


    有時候非常的嚴重的問題,就是你常常忽略的小不點


    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(4)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:15
    • 一個腳本引發的血案


    Source: http://www.cnblogs.com/ityouknow/p/6392426.html
    我們本身是一家互聯網金融公司,公司的主流業務就是p2p,因為各種原因吧,15年底啟動建設眾籌平臺。考慮到前期開發過程中的一些弊端和架構經驗,本次架構引用了dubbo做soa服務的治理,web容器nginx+tomcat,后端語言采用java,框架選擇spring+mybaits,前端模板引擎使用的是btl,app采用原生+h5的模式。這個架構可以參考我之前寫的文章從零到百億互聯網金融架構發展史中的第三代系統架構,之前的文章主要介紹了架構的變遷,本篇文章主要介紹在第三代平臺中遇到的問題以及解決方法。
    首先介紹一下眾籌系統的部署架構(如下圖),網站和app請求都是首先到最前端的nginx,如果只是靜態內容的訪問nginx直接處理后返回;動態請求分別轉發到后端的tomcat前端服務層,前端服務層只關注頁面端業務邏輯不涉及數據庫的操作,如果只是頁面框架渲染以及不涉及數據庫的請求,在前端服務層直接處理返回;如果涉及到數據庫操作或者核心業務邏輯,前端服務層通過dubbo調用后端的接入層服務或者核心層服務。
    上線在生產測試期間,發現tomcat過一段時間就會莫名奇妙的down掉,特別是后端的tomcat down掉的頻率比較高。后端的tomcat down掉之后對前端的頁面展示沒有影響,會影響后端的交易。
    jvm參數配置
    查看tomcat業務日志,報錯如下:
    2016-04-14 12:01:55,025 - org.jboss.netty.channel.DefaultChannelPipeline -59679839 [New I/O worker #29] WARN null - [DUBBO] An exception was thrown by a user handler while handling an exception event ([id: 0x5f980c11, /xxx:55386 => /xxx:6666] EXCEPTION: com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process received event .), dubbo version: 2.8.4, current host: xxx
    com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process caught event .
    at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:67)
    at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)
    at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)
    at com.alibaba.dubbo.remoting.transport.AbstractPeer.caught(AbstractPeer.java:127)
    at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.exceptionCaught(NettyHandler.java:112)
    at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.exceptionCaught(NettyCodecAdapter.java:165)
    at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525)
    at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:148)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360)
    at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65)
    ... 19 more

    查看output日志,發現其中有這么一句。
    SEVERE: The web application [/xxx] appears to have started a thread named [DubboResponseTimeoutScanTimer] but has failed to stop it. This is very likely to create a memory leak.
    根據日志提示貌似有內存泄露,以前確實還沒有碰到過這個錯誤,一片迷茫。重新啟動后,先用命令jstat -gc xxx 1000 30查看java 進程的gc情況,發現在30秒的世界內minor gc了n次,隨懷疑年輕代內存配置少了,查看個區域內存的配置參數如下:
    -Xms10g -Xmx10g -XX:PermSize=1g -XX:MaxPermSize=2g -Xshare:off -Xmn1024m
    按照年輕代為堆內存為百分之三的原則修改為-Xmn4g,重新啟動觀察之后mimor gc的頻率確實有所下降,測試大約過了3小時候之后又反饋tomcat down掉了,繼續分析啟動參數配置的時候發現了這么一句-XX:-+DisableExplicitGC,顯示的禁止了System.gc(),但是使用了java.nio的大量框架中使用System.gc()來執行gc期通過full gc來強迫已經無用的DirectByteBuffer對象釋放掉它們關聯的native memory,如果禁用會導致OOM,隨即懷疑是否是這個參數引發的問題,在啟動參數中去掉它。
    為了防止再次出現異常的時候能更加詳細的分析堆內存的使用情況,在啟動參數中添加了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/logs/java/,當tomcat down的時候讓輸出堆內存文件,一邊也啟動jvisualvm工具來實時的監控內存各個線程的使用情況。
    數據庫連接池
    繼續使用壓測工具來壓測,在壓測的過程中發現名為com.mchange.v2.resourcepool.ssync.ThreadPoolAsynchronousRunner$PoolThred-#xxx的線程不斷的增長,并且后臺tomcat報錯如下:
    2016-04-13 16:55:15,175 - com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport -83649035 [New I/O worker #27] WARN - [DUBBO] Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxx:6666, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 692 (completed: 492), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xxx:6666!, dubbo version: 2.8.4, current host: xxx
    2016-04-13 16:55:15,176 - com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport -83649036 [New I/O worker #27] WARN - [DUBBO] Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxx:6666, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 692 (completed: 492), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xxx:6666!, dubbo version: 2.8.4, current host: xxx
    2016-04-13 16:55:15,177 - org.jboss.netty.channel.DefaultChannelPipeline -83649037 [New I/O worker #27] WARN - [DUBBO] An exception was thrown by a user handler while handling an exception event ([id: 0x2f345d45, /192.168.57.20:36475 => /xxx:6666] EXCEPTION: com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process received event .), dubbo version: 2.8.4, current host: xxx
    com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process caught event .
    at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:67)
    at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)
    at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)
    at com.alibaba.dubbo.remoting.transport.AbstractPeer.caught(AbstractPeer.java:127)
    at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.exceptionCaught(NettyHandler.java:112)
    at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.exceptionCaught(NettyCodecAdapter.java:165)
    at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525)
    at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:148)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxx:6666, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 692 (completed: 492), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xxx:6666!
    at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
    at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65)
    ... 19 more

    根據這些信息隨懷疑數據庫連接池有問題,為了更好的監控連接池的使用,因此前期使用c3p0也會出現的一些問題,所以我們決定將數據庫連接池替換成druid,已經在別的項目中使用測試過,因此非常快速的更換投產。投產后繼續用壓測工具來測試,根據druid的后臺監控頁面發現(項目地址/druid/index.html),每次前端掉用一次數據庫連接就加一次,執行完成之后數據庫連接并沒有釋放。如下圖紅色區域,我們將數據庫連接池調整成1000,不一會就占滿了。
    根據這些信息判斷出,數據庫執行sql后肯定沒有釋放數據庫連接,導致數據庫連接池用滿后,后續的線程無法執行,檢查代碼之后發現果然有問題,請看下方代碼,我們最先使用的是SqlSessionFactory,如果使用SqlSessionFactory,在執行完sql后必須要執行session.close()來關閉連接,才會被連接池重新回收。
    public class SessionFactory {
    @Resource
    private SqlSessionFactory coreSqlSessionFactory;
    protected SqlSession getSession() {
    return coreSqlSessionFactory.openSession();
    }
    }

    public class BaseDao extends SessionFactory{
    public void add(Entity entity) {
    this.getSession().update(entity.getClass().getSimpleName()+"."+Thread.currentThread().getStackTrace()[2].getMethodName(), entity);
    }
    }

    但是使用SqlSessionTemplate卻不用手動執行代碼來關閉session,因此我們把上面SessionFactory類中的代碼改成SqlSessionTemplate(如下),此問題便解決了。
    public class SessionFactory {
    @Resource
    public SqlSessionTemplate coreSqlSession;
    protected SqlSessionTemplate getSession() {
    return coreSqlSession;
    }
    }

    詭異的腳本
    做完上面的優化之后,我們感覺問題應該解決了,但過了一段時間后tomcat又詭異的掛了,繼續分析gc情況,分階段使用jmap -dump:live,format=b,file=dump.hprof xxx命令生成堆轉儲快照來對比堆內存使用情況,監控線程使用情況,均發現沒有問題。這個問題困擾了我們好幾天,每天都監控這端口,一但發現tomcat down之后馬上通知運營人員重啟。一方面我們也查閱了各種資料,到網上查找各種tomcat自動down的原因,一一在我們服務器進行了測試、修復均不起作用。
    終于在google各種tomcat down原因的時候發現了這么一篇文章Tomcat進程意外退出的問題分析,立刻想起了我們最近使用的一個腳本來,因為我們的tomcat禁止了通過bat文件來關閉,因此為了啟動方便我們寫了一個腳本文件,方便通過腳本來啟動、停止、重啟tomcat文件,這是這個腳本導致tomcat down的原因,不不,不叫原因叫元兇!腳本內容如下:
    #!/bin/sh
    # eg: tomcat.sh start xxx
    #
    proc_dir="/usr/local/xxx/tomcat-zc-web/bin"
    proc_name=$2
    if [ x$proc_name != x ]
    then
    proc_dir=${proc_dir//xxx/$proc_name}
    fi
    #echo $proc_dir
    function stop () {
    kill -9 `ps -ef |grep $proc_dir |grep -v grep|awk '{print $2}'`
    }
    function start () {
    cd $proc_dir
    ./startup.sh
    tail -300f /usr/local/logs/tomcat-business/$proc_name.log
    }
    case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    stop
    start;;
    esac

    就是因為tail -300f /usr/local/logs/tomcat-business/$proc_name.log這一句導致的問題,在別的項目使用的時候其實是沒有這一句的,一般在使用的步驟是:
  • 1 執行tomcat.sh start xxx啟動tomcat,

  • 2 執行tail -300f /usr/local/logs/tomcat-business/xxx.log 查看啟動日志是否成功。

  • 在這次投產的時候為了省一步操作,就將執行查看日志的命令,直接加在了啟動命令的后面,當執行tomcat.sh start xxx這個命令的時候,即啟動的tomcat,也自動會打印出tomcat的日志,那時候的想法非常好。
    原因是,使用腳本命令啟動后因為使用了tail -300f xxx 命令,tomcat的進程會成為shell腳本的子進程,這樣的話,如過shell腳本停止的話,系統會自動殺掉tomcat進程導致tomcat down掉,在我們的腳本中去掉這條命令tomcat就正常了,更深層次的原因參考Tomcat進程意外退出的問題分析這篇文章,文章的內容還是分析的比較透徹,最后感覺阿里的技術真的很牛X,這篇文章也是出自于阿里的員工。

    經歷這么些波折,后續的tomcat服務終于穩定了下來




    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(7)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:15
    • 百億互金平臺救火故事


    Source: http://www.cnblogs.com/ityouknow/p/6404163.html
    多年前,又是周六客服打電話過來,平臺官網不能訪問,app完全無法打開,客戶在QQ群和微信群中各種反饋,說平臺是不是跑路了?客服的多條400熱線完全被打爆,電話已經接不過來...
    前言
    一直以來總是想以什么方式去記錄下自己在互金行業的這段經歷,趁著自己還記得清楚,還能找到一些資料原型,一方面可以分享出來供大家參考,但是更重要就是多年以后我可以根據這些文章回憶起來自己的那段激情歲月。
    想了很久但一直沒有實施,后來覺得應該從架構的角度來梳理一篇文章,就寫了從零到百億互聯網金融架構發展史這篇文章;最后認為只有實戰出來的東西以及解決問題的過程,才是工作中最寶貴的經驗,應該把它分享出來,在梳理的過程中覺得有三起事故比較有代表性就整理出了下面這三篇文章,本篇文章從整體來回憶一下一路走過來所經歷過的救火故事。
  • 一次生產事故的優化經歷

  • 一次dns緩存引發的慘案

  • 一個腳本引發的血案

  • 作為一個互聯網金融平臺,涉及到用戶資金,任何的服務(資金)差錯用戶都是不可容忍的,用戶不懂什么是數據庫,不知道什么網絡不通,就是一會看不到錢在app里面展示都會覺得不安。在已經有很多P2P公司跑路的前提下,用戶個個已經被鍛煉成為福爾摩斯偵探,每天打開app查看收益,監控著平臺一切,甚至半夜升級斷網十分鐘,也會被用戶察覺,直接就發到群里面,更有甚者直接在QQ群或者微信群中你們的技術行不行!
    我們常說的互聯網工作經驗,一方面是開發經驗,但其實更重要的是處理問題的能力。那么處理問題的能力怎么來呢,就是不斷的去解決問題,不斷的去總結經驗,其中處理生產環境中問題的經驗更甚,因為在處理生產環境中對個人的壓力和臨危應變的能力要求最高,你不但需要面臨千萬個用戶反饋,客服不時得催促而且旁邊可能就站了N個領導在看著你,一副你行不行的樣子要求立刻馬上解決問題!這個時候你的操作就非常重要,稍有不慎便會引發二次生產事故。
    說了這么多,只是想說明,生產事故對技術綜合能力要求頗高,更是鍛煉處理問題能力最佳時機!下面給大家介紹我們從零開發到現在百億交易量所遇到的幾次關鍵事故,有大有小挑出一些比較有代表性的事件來分享。
    并發滿標
    公司系統剛上線的時候,其實沒有經歷過什么大量用戶并發的考驗,結果公司做了一個大的推廣,涌入了一批用戶來搶標,共1000萬的標的幾乎都在10秒之內搞定,大概會有上萬左右的用戶會同時去搶標,平均每秒大概有千人左右的并發,滿標控制這塊沒有經過大的并發測試,上來之后就被打垮了,導致得結果是什么呢,1000萬的標的,有可能到一千零幾萬滿標,也有可能會九百多萬就滿標,也就說要不就是多了一些,要不就是少了一些,就滿標了。
    這就會很尷尬,因為借款用戶就借款一千萬整,那么多出來的錢既不能給用戶退回了,因為用戶好不容易才搶上了,無端退了用戶也鬧;少了也是問題,用戶借款一千萬,少了幾十萬也不行,如果短得少了可以想辦法找一些有錢的客戶直接給買了,多了就必須重新放出來讓用戶投資,非常影響士氣,這個問題困擾了我們有一段時間。
    購買標的流程圖,不知道大家是否能根據此圖發現問題呢?
    超募
    為何會產生超募?在最早前的版本中沒有使用樂觀鎖來控制,如果在最后購買的用戶一單出現并發,就會出現超募,比如最后剩余30000份的購買份額,因為并發量特別大,可能同時會有十幾個用戶拿到了剩余30000份余額的可購買額度,有的買1000份、有的買上3000份、有的買上20000份都會驅動滿標,所以最后導致了超募。
    針對這個問題,主要是引入了memcached樂觀鎖的概念(底層主要是cas、gets兩個命令),在發標的時候存入標的總份額,當用戶購買的時候首先去鎖定用戶購買的份額,因為樂觀鎖的原因,如果同時有兩個用戶拿到份額的時候保證只有一個最后可以更新成功(鎖定份額),(鎖定份額)失敗直接返回,這樣就保證了在入口的時候就直接屏蔽了部分并發的請求。
    少募
    為何產生少募?少募是可能1000萬的標的突然到980萬就給滿標了,這是因為在超募情況下我們完善了代碼,用戶一進來首先就是鎖定購買份額,只有鎖定購買份額才能進行下面的流程,如果鎖定購買份額失敗直接返回,這樣雖然保證了在1000萬份額在購買初期必須每一個用戶只能鎖定一份,但是在高并發的情況下,因為購買流程中有十幾個分支,每一個分支失敗就會退回鎖定的份額,這樣就會導致這樣的現象,就是可能是并發一上來,馬上就滿標了,過了一會進度就回退回來了。
    少募主要是因為分支失敗回退導致的,一方面我們分析了容易導致回退熱點,因為在用戶搶標的時候會給用戶實時的展示標的進度,在很早的版本中直接就是存入到一個標的進度表里面,并且采用了樂觀鎖,如果并發一高就頻繁的更新失敗導致回退,因此優化了標的進度這塊,直接去掉了標的進度表,實時根據查詢來展示標的進度(可以有延遲,有緩存);另一方面在回退份額的時候在次判斷試下memcached的份額和標的的狀態,如果份額不為零并且標的狀態是滿標,馬上自動更新狀態保證后續用戶可以立即購買再次驅動滿標。
    做了以上的兩種優化后,我們還遇到了其它的一些小問題,在不斷的優化過程中,終于穩定下來;在后期版本中將考慮使用MQ隊列或者redis隊列來處理搶標更合理對用戶也更公平一些。
    黑客攻擊
    2015年應該是互聯網行業受黑客攻擊最多的一年吧,各互金公司都深受其害,其中我就記得網貸之家有一段時間被黑客攻擊的太厲害,連續幾天網站都無法打開。當然了我們也未能幸免,什么DDOS攻擊、SQL注入、尋找系統漏洞等都幾乎都經歷過了,有的黑客還比較好,應該是出于善意或者展示自己,將漏洞放到烏云上面或者漏洞盒子里面讓廠商來修復。但更多的是一些黑產完全就是威脅、敲詐想撈一筆錢,先看看下面這位吧:
    這個家伙潛伏到我們公司的客戶群里面,冒充我們的客戶代表將頭像和資料替換成一樣,然后給群里所有的客服讓他們發送我們內部的后臺地址,想通過這種方式來尋找突破口,當然了這個算是里面的小菜鳥吧。
    DDOS攻擊
    DDOS攻擊我們也是遇到了很多次,確實也沒有比較好辦法,最后都是通過一些笨辦法來盡量的避免,先說說我們的經歷吧。有一次我正在敲代碼,客服QQ又閃爍了起來,還沒來得及打開查看信息,客服的經理電話就直接打了過來,我立刻就有一種不祥的預感,說官網打不開了,后臺也登錄不了。
    掛了電話,我在本機進行了測試果然不行,立刻準備登錄VPN查看服務器各項指標,結果登錄不上去,馬上上樓找運維經理,他也登錄不上,剛準備給機房打電話的時候,機房來電話了,說我們的一個IP正經歷著1G多的流量訪問,問我們是否正在做什么活動,剛話沒有說完就說流量已經到5G,不到一分鐘之后流量已經到達18G之多。因為我們的機房和集團公用了一個寬帶入口,結果陸續的集團上面反饋他們的網站、服務也都出現了問題,機房方面害怕引起更大的沖擊,直接把我們官網對外的IP封掉,集團的其它業務也才慢慢都恢復了過來,我們也緊急的更換了外網IP,重新切換了域名解析才恢復。
    事后我們根據apache分析了日志,流量來自N多個不同的IP地址根本無法應對,也正式因為這次攻擊也才讓我們領導重視了起來,將我們公司的機房網絡層和公司集團徹底分離,這樣的話不管那方受到大流量攻擊都不會相互影響,我們也想了一些笨辦法,因為上次我們更換了外網IP之后攻擊也就停止了,那么我們認為肯定是針對我們外網來攻擊的,所有我們就多準備了6個外網IP,當監控到對某一個外網進行攻擊的時候馬上切換到另一個外網地址,就這樣跟他們玩,可以起到非常有限的一點作用,如果黑客真的想跟我們玩,這個辦法就像是小孩子捉迷藏。
    周年慶的DDOS攻擊
    還有一次我們正在做周年慶活動,突然有人在QQ群里面給我們客服說了一句,叫你們的技術負責人來找我,然后我們的網站就掛了,我還保留了當時的一個截圖如下:
    完了之后客服就來找我,然后按照往常的策略處理完之后,我根據客服給我的QQ號碼加上了那個人,開口就來嚇我,我依稀記當年的對話如下:

    黑客:你是平臺的技術負責人嗎?
    我:算是吧
    黑客:你信不信我可以讓你們官網在5秒之內掛掉?
    我:...(沉默,還真害怕又把官網搞掛了)
    黑客:你們的官網漏洞很大
    我:如果有好的建議請您賜教
    黑客:你們的服務器是不是什么防護軟件都沒有裝?
    我:...(繼續沉默,這會在想不會是那個安全廠商來推廣產品的吧,當然我們基礎的防護肯定有)
    黑客:我們有非常多的肉雞,想攻擊誰,幾秒之內肯定搞定
    我:...
    黑客:我們已經給很多互聯網金融行業做了滲透測試,花點錢幫買你們平安,保證以后不會在出事情
    我:...
    黑客:免費的策略也有很多,比如360、百度云的安全產品可以免費低檔10G左右的流量


    ......(中間省略)


    黑客:我說了這多,你們也是不是給包煙錢,表示表示。


    ......


    后來也和領導進行了商議,堅決不能給他們錢,不能助漲這種囂張氣焰,實在不行就報警!
    曝光一下當年使用的假QQ號,剛查了下變了個頭像和描述,如下:
    后來我一直在想為什么DDOS攻擊總是喜歡根據外網IP來攻擊呢,慢慢好像是理解了如果針對域名來攻擊的話,那不就是攻擊到域名商的服務器了嗎,一般域名商比較強大,黑客不太搞的定,也確實沒有必要。當然記的前一段時間,某著名域名服務商被攻擊,導致國外twitter等著名的互聯網公司訪問不斷到達半天以上,還是很嚴重的。但是對于我們這些小公司,倒不至于搞這么大的動作。
    到底如何正確的防止DDOS攻擊:

    • 第一種方案,隱藏服務器外網地址,服務器前端加CDN中轉,免費的有百度云加速、360網站衛士、加速樂、安全寶等,如果資金充裕的話,可以購買高防的盾機,用于隱藏服務器真實IP,域名解析使用CDN的IP,所有解析的子域名都使用CDN的IP地址。此外,服務器上部署的其他域名也不能使用真實IP解析,全部都使用CDN來解析。



    • 第二種方案,買一些安全產品來進行流量清洗,主要是阿里云、騰訊云這種大廠商提供的一種服務。



    • 第三種方案,有很多的防火墻產品聲稱可以防止Ddos攻擊,但是我個人使用感覺效果非常有限。


    SQL注入
    我們的官網使用的是PHP開發,因為框架比較老舊的原因,存在著一些SQL注入的點,我們發現了一些進行了修補,沒想到還是被一些黑客找到了突破點,這塊還是比較感謝這些黑客的在漏洞盒子上面提交了bug(如下圖),最后我們根據提示進行了緊急修復,后來我們也在WAF防火墻配置了一些攔截SQL注入的策略,起到雙保險的作用。
    我一直在想為什么PHP一般比較容易出現SQL注入呢,而Java較少的暴漏出來SQL漏洞的情況,我估摸著有兩方面的原因:第一,PHP一般會在前端使用的較多,受攻擊的機會更多一些,Java一般做為后端服務攻擊的可能性會比較少;第二,PHP框架較多而且很多早期的框架并沒有特別考慮SQL注入的情況,Java大量普及了mybaits\hibernate這種orm框架,框架本身對常見的SQL注入有防止的功能,但不是說mybaits/hibernate框架就沒有被sql注入的可能,大部分場景下是OK的。另外參數化查詢可以有效的避免SQL注入。
    通過一段時間的學習,我發黑客一般先使用工具對網站做整體的掃描類似Acunetix,在根據掃描出來的漏洞做個大概的分析,但是比較深入的漏洞都需要根據網站的業務在進行調整,比如sql注入會根據頁面的查詢使用sqlmap等工具來進一步的滲透。當然我對這方面還是外行,描述的可能不夠清晰。
    其它攻擊
    其它方面的攻擊,主要是在業務方面,比如我們當初有一個很小的失誤,有一個程序員在H5的小網頁中將發送短信驗證碼返回了前端,最后被haker發現了,利用這個漏洞可以給任意的用戶重置登錄密碼;短信攻擊,現在的網站幾乎都有發送短信或者短信驗證碼的功能,如果前端不做校驗,haker會隨便寫一個for循環來發短信,一般系統的短信會進行全方位的防控,比如:1、前端加驗證(字符驗證碼,有的是拖拽的動畫);2、后端根據用戶或者IP加限制,比如用戶一分鐘只可以發送一條短信,忘記密碼的短信一天只能發送10條、一個IP地址限制每天只能發送100條短信等。
    BUG
    重復派息
    15年的某一天看到一個新聞說是陸金所的一個用戶發現自己銀行里面突然多了很多錢,沒過多久又被扣走了,然后收到陸金所那邊的解釋,說是給用戶還本派息的時候程序出現了問題導致還本派息兩次,當他們程序員發現了此問題后緊急進行了處理,用戶當然鬧了呀,就上了新聞,當然陸金所通道能力確實比較強可以直接從用戶卡里面扣,當大家都興致勃勃的談論這個話題的時候,我卻有一股淡淡的憂傷,為什么呢?因為這個錯誤我們也犯過,具體說就是我搞的,大家可不知道當時的心里壓力有多大!
    事情是這樣子的,我們使用的第三方支付的扣款接口不是特別的穩定,于是我們前期就對接了兩種不通的扣款接口,平時前端投資的時候走一個接口,后端派息或者還本的時候走另外的一個接口,在初期的時候扣款接口不穩定,因此在給用戶跑批的時候經常會有個別用戶失敗,需要手動給失敗的用戶二次派息。做為一個有志向的程序員當然覺得這種方式是低效的,于是將程序改造了一下,在后端派息的時候當第一種扣款失敗的時候,自動再次調用第二種扣款接口進行扣款,當時想著這種方式挺好的,各個環境測試也沒有問題,上線之后監控過一段時間也運行穩定。
    當我感覺一切都很美妙的時候,事故就來了,突然有一天客服反饋說有的用戶說自己收到的利息感覺不對,好像是多了(真的是太感謝這個用戶了),我登錄后臺看了一下派息的流水復核了一遍,果然利息被重復派了,一股冷水從頭而下,把當天所有的用戶派息記錄和到期記錄都進行了檢查,影響了70多個用戶,導致多派息了6萬多元,幸虧只是派息出了問題,如果是到期的話金額會翻N倍,其中70多個人里面有幾個進行了體現、幾個進行了再次投資,絕大部分用戶在我們發現的時候還不知情,金額也沒有動。
    怎么處理呢,當然不能直接就動用戶的錢了,給每個重復派息的用戶打電話,說明原因贈送小禮物,請求諒解后我們把重復派過的利息在次調回來。大部分用戶進行了核對之后都還是比較配合的,但是肯定有一些用戶不干了,當然也不能怪客戶,都是我的原因,有的客戶需要上門賠禮道歉,有的客戶需要公司出具證明材料,我們的老板親自給客戶打了N個電話被客戶罵了N遍,我心里壓力可想而知,其中有一個客戶特別難纏,各種威脅說既然到了我的賬戶里面肯定是我的,你們的失誤不應該讓他來承擔,折騰了很久,還是不能怪客戶。可能會說有的互聯網公司經常出現這種問題后就送給客戶了,哎,我們是小公司呀!這個噱頭玩不起。
    到底是什么原因呢,事后進行了復盤也給領導做了匯報,平時都是首先進行派息的定時任務,過一個小時之后進行到期的定時任務,當天的派息標的比較多,跑了一個半小時,就導致了派息和到期的兩個定時任務同時進行,轉賬有了并發,第三方支付的接口不穩定給我們返回的失敗,其實有的是成功的,就導致了我們進行了二次的扣款嘗試引發了此問題。這個事情給我帶來了非常大的教訓,對于金融扣款的這種事情一定需要謹慎,哪怕付款引發報警之后在人工處理,也不能盲目重試可能引發雪崩效應。
    雜七雜八
    還有就是其它一些零碎的問題了,記的有一次對用戶的登錄過程進行優化,導致有一塊判斷少了一個括號結果用戶在那兩個小時內,只要輸入賬戶,任意密碼就可以登錄了,幸好及時發現這個問題,正是這個問題才導致了我們正式確立了規范的上線流程,為以后的上線制度建定了基礎。
    還有一次我們在模擬用戶投資一種標的時候,留了一個入口通過http就可以調用,測試也沒有問題,有一天正好給領導演示呢,就在次用http請求的方式在瀏覽器執行了一下,前端就會看到自動投標的過程,因為生產的數據有點多,投標的過程有點長,我們為了加快進度,找了好幾個人同時來執行這http請求,導致最后出現了問題,最后發現寫測試腳本的這個同事根本就沒有考慮并發的情況,才導致出現了問題。
    也做了很多的活動,記得做一個網貸之家的一個活動的時候,活動上線比較緊張,我們團隊曾經連續工作超過30個小時(一天一夜再一天),當天晚上我2點左右寫完程序,測試從2兩點測試到早上9點,最終確認沒有任何問題,才進行投產。半夜公司沒有暖氣,我們實在凍的不行了,就在辦公室跑步,從這頭跑到那頭,第二天上線之后,又害怕出現問題,監控了一天,確認沒有任何問題,才到下午正常下班回家,那時候真是激情滿滿呀。
    說到做活動肯定少了羊毛黨,說哪一家互金公司沒有遇到過羊毛黨那很少見,而且現在的羊毛黨規模簡直逆天了,我們用戶里面就有一個羊毛黨在兩三天之內邀請了六七千位用戶,如果說邀請一個用戶送1元,那這個用戶就可以搞幾千塊一次,而且有很多專業的網站、QQ群、微信公共賬號都是他們的聚集地,那天那個平臺有活動門清,他們寫的淘羊毛操作手冊有時候比我們官網的幫助文檔還清晰,所以做活動的時候要考慮特別周全,各種限制,有封定、有預案、講誠信,只要是符合我們活動規則的堅決按照流程走。
    還有一個有趣的事情,app推送,一次我在公交車上就看到xx盒子app彈出hhhhh的推送,這個事情我們也搞過,因為在調試的時候生產和測試就差了一個參數,有時候開發人員不注意就把生產參數部署到uat環境了,測試一發送就跑到生產了,這方面只能嚴格流產管理來防止了。
    其實還很多問題:mongodb集群和mysql的同步出現的一些狀況、后臺大量數據查詢下的sql優化、golang使用mapreduce碰到的問題... 限于篇幅這里就不一一清晰的描述了。
    其實每次的出現問題都是對團隊一次非常好的鍛煉機會,通過發現問題,定位問題,解決問題,再次回過頭來反思這些問題;重新梳理整個環節,
    舉一反三避免下次再次出現類似的問題。正是因為經歷這些種種的困難、考驗才讓團隊變的更強大更穩定,也更體現了流程的重要性,更是避免再次發生類似問題。
    總結
    古代對將軍的要求是,心有萬馬奔騰而過,而面平靜如湖水可照鏡,在互聯網行業對大牛的要求也同如此,特別是技術的負責人,在面對生產事故的時候,一定首先是安撫同事,靜下下心來找到問題本質在去解決,而不是不斷去施加壓力催促解決,重壓之下很多心里承受能力稍弱的隊友,更加慌亂而不利于解決問題或者引發二次事故。
    在看淘寶雙十一視頻中,有一段特別受到感觸,在雙十一初期,雖然技術團隊做了很多的準備,但是在零點過后流量瞬間涌入,服務被打垮,部分用戶投訴刷新不出網頁,緊接著隔壁同事也都反饋網站打不開,在大家都在慌亂中,xx一拍桌子大喊一聲,大家都別動,三分鐘之后再說,過了幾分鐘之后服務慢慢部分恢復了正常。后來回憶說,當時雖然服務癱瘓,但是監控還是有部分得業務成功,說明系統并沒有被壓垮,而此時的任何操作都有可能引發更大的問題,從此之后此人一戰成名,成為阿里大將。
    互聯網平臺發展大抵都會經歷三個階段:
  • 1、上線初期,此階段問題最為繁多,生產事故不斷,系統快速迭代優化。有人說為什么不測試到完全沒有問題在投產嗎?說實話在互聯網行業這個很難,第一小公司很難做到生產環境和測試環境一致,成本太高;時間緊迫,一般都是很短的時間內要求上線,上線之后在快速迭代。另外互聯網本就是一個快速試錯的行業,錯過半年時間可能風口早過;


  • 2、發展期,此階段主要業務模式已經得到驗證,系統出現問題的頻繁度較少,低級錯誤減少,但此時是用戶量和交易量不斷爆發的時候,對系統性能、高并發的要求又上來了,所以此時出現的問題大多都是性能的問題;


  • 3、成熟期,發展期過后系統相對比較平穩,用戶量和交易量都已經慢慢穩定下來,生產問題越來越少,出現問題幾乎都是細小的bug,這個階段也是公司最忽略技術得階段,恰好我們公司就處于這個階段,在這個階段就需要靜下心里,組織架構升級,補齊在初期和發展起所欠的技術債務,做好公司在升下一個量級的技術準備。


  • 所有的這些問題幾乎都集中在14年底到15年初的這個階段,15年后半年開始到現在平臺慢慢穩定了下來,到現在幾乎沒有再出現過類似的問題,也因為幾乎都是兩年前的事情,有很多記的不是特別清楚了,寫的比較粗糙望見諒。




    作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(4)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:15
    • 文章匯總索引


    Source: http://www.cnblogs.com/ityouknow/p/6434492.html
    近期文章
  • 百億互金平臺救火故事

  • jvm系列(八):jvm知識點總覽-高級Java工程師面試必備

  • jvm系列(七):jvm調優-工具篇

  • 實戰
  • 一次生產事故的優化經歷

  • 一次dns緩存引發的慘案

  • 一個腳本引發的血案

  • 百億互金平臺救火故事

  • 從零到百億互聯網金融架構發展史

  • 生活
  • 六年程序生涯

  • 程序員該用哪種姿勢來理財

  • 2016顛倒夢想,2017靜心前行

  • 發現另外一個世界-網盤關閉背后

  • spring boot
  • springboot(一):入門篇

  • springboot(二):web綜合開發

  • springboot(三):Spring boot中Redis的使用

  • springboot(四):thymeleaf使用詳解

  • springboot(五):spring data jpa的使用

  • springboot(六):如何優雅的使用mybatis

  • springboot(七):springboot+mybatis多數據源最簡解決方案

  • springboot(八):RabbitMQ詳解

  • springboot(九):定時任務

  • springboot實戰:我們的第一款開源軟件

  • JVM
  • jvm系列(一):java類的加載機制

  • jvm系列(二):JVM內存結構

  • jvm系列(三):GC算法 垃圾收集器

  • jvm系列(四):jvm調優-命令篇

  • jvm系列(五):tomcat性能調優和性能監控(visualvm)

  • jvm系列(六):jvm調優-從eclipse開始

  • jvm系列(七):jvm調優-工具篇

  • jvm系列(八):jvm知識點總覽-高級Java工程師面試必備

  • 爬蟲
  • python3爬取1024圖片

  • 網貸之家的爬蟲之旅

  • 抓取某一個網站整站的記錄

  • 運維
  • linux定時備份mysql并同步到其它服務器

  • Elasticsearch、Logstash、Kibana搭建統一日志分析平臺

  • 大數據實踐-數據同步篇tungsten-relicator(mysql->mongo)

  • 網站文件系統發展&&分布式文件系統fastDFS

  • spring
  • spring aop

  • spring ioc

  • spring 多數據源一致性事務方案

  • (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(1)

    • 個人分類:生活學習
    ▲top
    • 3月 07 週二 201721:15
    • jvm系列(七):jvm調優-工具篇


    Source: http://www.cnblogs.com/ityouknow/p/6437037.html
    16年的時候花了一些時間整理了一些關于jvm的介紹文章,到現在回顧起來還是一些還沒有補充全面,其中就包括如何利用工具來監控調優前后的性能變化。工具做為圖形化界面來展示更能直觀的發現問題,另一方面一些耗費性能的分析(dump文件分析)一般也不會在生產直接分析,往往dump下來的文件達1G左右,人工分析效率較低,因此利用工具來分析jvm相關問題,長長可以到達事半功倍的效果來。
    jvm監控分析工具一般分為兩類,一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點擊就可以使用,其中包含分析工具已經很強大,幾乎涉及了方方面面,但是我們最常使用的只有兩款:jconsole.exe和jvisualvm.exe;第三方的分析工具有很多,各自的側重點不同,比較有代表性的:MAT(Memory Analyzer Tool)、GChisto等。
    對于大型 JAVA 應用程序來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環境下暴露出來,并且很難在測試環境中進行重現。JVM 能夠記錄下問題發生時系統的部分運行狀態,并將其存儲在堆轉儲 (Heap Dump) 文件中,從而為我們分析和診斷問題提供了重要的依據。其中VisualVM和MAT是dump文件的分析利器。
    jdk自帶的工具
    jconsole
    Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監控和管理控制臺,用于對JVM中內存,線程和類等的監控,是一個基于JMX(java management extensions)的GUI性能監測工具。jconsole使用jvm的擴展機制獲取并展示虛擬機中運行的應用程序的性能和資源消耗等信息。
    直接在jdk/bin目錄下點擊jconsole.exe即可啟動,界面如下:
    在彈出的框中可以選擇本機的監控本機的java應用,也可以選擇遠程的java服務來監控,如果監控遠程服務需要在tomcat啟動腳本中添加如下代碼:
     -Dcom.sun.management.jmxremote.port=6969 
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false

    連接進去之后,就可以看到jconsole概覽圖和主要的功能:概述、內存、線程、類、VM、MBeans
  • 概述,以圖表的方式顯示出堆內存使用量,活動線程數,已加載的類,CUP占用率的折線圖,可以非常清晰的觀察在程序執行過程中的變動情況。

  • 內存,主要展示了內存的使用情況,同時可以查看堆和非堆內存的變化值對比,也可以點擊執行GC來處罰GC的執行

  • 線程,主界面展示線程數的活動數和峰值,同時點擊左下方線程可以查看線程的詳細信息,比如線程的狀態是什么,堆棧內容等,同時也可以點擊“檢測死鎖”來檢查線程之間是否有死鎖的情況。

  • 類,主要展示已加載類的相關信息。

  • VM 概要,展示JVM所有信息總覽,包括基本信息、線程相關、堆相關、操作系統、VM參數等。

  • Mbean,查看Mbean的屬性,方法等。

  • VisualVM
    簡介
    VisualVM 是一個工具,它提供了一個可視界面,用于查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基于 Java 技術的應用程序(Java 應用程序)的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數據進行組織,并通過一種使您可以快速查看有關多個 Java 應用程序的數據的方式提供該信息。您可以查看本地應用程序以及遠程主機上運行的應用程序的相關數據。此外,還可以捕獲有關 JVM 軟件實例的數據,并將該數據保存到本地系統,以供后期查看或與其他用戶共享。
    VisualVM 是javajdk自帶的最牛逼的調優工具了吧,也是我平時使用最多調優工具,幾乎涉及了jvm調優的方方面面。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用,啟動起來后和jconsole 一樣同樣可以選擇本地和遠程,如果需要監控遠程同樣需要配置相關參數,主界面如下;
    VisualVM可以根據需要安裝不同的插件,每個插件的關注點都不同,有的主要監控GC,有的主要監控內存,有的監控線程等。
    如何安裝:

    1、從主菜單中選擇“工具”>“插件”。
    2、在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。
    3、逐步完成插件安裝程序。


    我這里以 Eclipse(pid 22296)為例,雙擊后直接展開,主界面展示了系統和jvm兩大塊內容,點擊右下方jvm參數和系統屬性可以參考詳細的參數信息.
    因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監控、線程、Visual GC
    監控的主頁其實也就是,cpu、內存、類、線程的圖表
    線程和jconsole功能沒有太大的區別
    Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的內存變化,以及gc頻率、gc的時間等。
    以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內存快照,dump出來的線程快照并且進行分析等,還有其它很多的插件大家可以去探索
    第三方調優工具
    MAT
    MAT是什么?
    MAT(Memory Analyzer Tool),一個基于Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,并可以通過報表直觀的查看到可能造成這種結果的對象。
    通常內存泄露分析被認為是一件很有難度的工作,一般由團隊中的資深人士進行。不過要介紹的 MAT(Eclipse Memory Analyzer)被認為是一個“傻瓜式“的堆轉儲文件分析工具,你只需要輕輕點擊一下鼠標就可以生成一個專業的分析報告。和其他內存泄露分析工具相比,MAT 的使用非常容易,基本可以實現一鍵到位,即使是新手也能夠很快上手使用。
    MAT以eclipse 插件的形式來安裝,具體的安裝過程就不在描述了,可以利用visualvm或者是 jmap命令生產堆文件,導入eclipse mat中生成分析報告:
    生產這會報表的同時也會在dump文件的同級目錄下生成三份(dump_Top_Consumers.zip、dump_Leak_Suspects.zip、dump_Top_Components.zip)分析結果的html文件,方便發送給相關同事來查看。
    需要關注的是下面的Actions、Reports、Step by Step區域:
  • Histogram:列出內存中的對象,對象的個數以及大小,支持正則表達式查找,也可以計算出該類所有對象的retained size

  • Dominator Tree:列出最大的對象以及其依賴存活的Object (大小是以Retained Heap為標準排序的)

  • Top Consumers : 通過圖形列出最大的object

  • duplicate classes :檢測由多個類裝載器加載的類


  • Leak Suspects :內存泄漏分析


  • Top Components: 列出大于總堆數的百分之1的報表。

  • Component Report:分析對象屬于同一個包或者被同一個類加載器加載

  • 以上只是一個初級的介紹,mat還有更強大的使用,比如對比堆內存,在生產環境中往往為了定位問題,每隔幾分鐘dump出一下內存快照,隨后在對比不同時間的堆內存的變化來發現問題。
    GChisto
    GChisto是一款專業分析gc日志的工具,可以通過gc日志來分析:Minor GC、full gc的時間、頻率等等,通過列表、報表、圖表等不同的形式來反應gc的情況。雖然界面略顯粗糙,但是功能還是不錯的。
    配置好本地的jdk環境之后,雙擊GChisto.jar,在彈出的輸入框中點擊 add 選擇gc.log日志
  • GC Pause Stats:可以查看GC 的次數、GC的時間、GC的開銷、最大GC時間和最小GC時間等,以及相應的柱狀圖

  • GC Pause Distribution:查看GC停頓的詳細分布,x軸表示垃圾收集停頓時間,y軸表示是停頓次數。


  • GC Timeline:顯示整個時間線上的垃圾收集


  • 不過這款工具已經不再維護,不能識別最新jdk的日志文件。
    gcviewer
    GCViewer也是一款分析小工具,用于可視化查看由Sun / Oracle, IBM, HP 和 BEA Java 虛擬機產生的垃圾收集器的日志,gcviewer個人感覺顯示 的界面比較亂沒有GChisto更專業一些。
    以上的兩款gc分析日志,一個不太維護了,一個不太專業,求推薦更好的gc分析工具
    前期jvm系類文章回顧:
  • jvm系列(一):java類的加載機制

  • jvm系列(二):JVM內存結構

  • jvm系列(三):GC算法 垃圾收集器

  • jvm系列(四):jvm調優-命令篇

  • jvm系列(五):tomcat性能調優和性能監控(visualvm)

  • jvm系列(六):jvm調優-從eclipse開始



  • 作者:純潔的微笑
    出處:http://www.ityouknow.com/
    版權歸作者所有,轉載請注明出處
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(14)

    • 個人分類:生活學習
    ▲top
    «1...227228229230»

    pop-under

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    線上人數

    Marquee

    最新文章

    • 文章列表
    • jvm系列(四):jvm調優-命令大全(jps jstat jmap jhat jstack jinfo)
    • spring boot(一):入門篇
    • jvm系列(一):java類的加載機制
    • jvm系列(三):java GC算法 垃圾收集器
    • spring boot 實戰:我們的第一款開源軟件
    • jvm系列(六):jvm調優-從eclipse開始
    • 混合應用技術選型
    • jvm系列(二):JVM內存結構
    • spring boot(五):spring data jpa的使用

    熱門文章

    • (1,762)jQuery之前端國際化jQuery.i18n.properties
    • (630)技術筆記:Indy控件發送郵件
    • (513)linux下安裝sqlite3
    • (501)學習筆記: Delphi之線程類TThread
    • (242)VC單選按鈕控件(Radio Button)用法(轉)
    • (149)Android AppBar
    • (103)單條件和多條件查詢
    • (50)淺談config文件的使用
    • (26)Tomcat shutdown執行后無法退出進程問題排查及解決
    • (22)基于 Asp.Net的 Comet 技術解析

    文章分類

    • 生活學習 (2,296)
    • 未分類文章 (1)

    最新留言

    • [20/04/24] 我是女生想約炮 有男生願意給我溫暖的嗎?我賴是woyou58 於文章「(1)從底層設計,探討插件式GIS框架的...」留言:
      我叫黎兒女生最近內心掙扎著要不要約炮我的line:woy...

    文章搜尋

    文章精選

    誰來我家

    Live Traffic Feed