IO和socket程式設計

程式設計一生發表於2017-05-04

 五一假期結束了,突然想到3周前去上班的路上看到槐花開的正好。放假也沒能採些做槐花糕,到下週肯定就老了。一年就開一次的東西,比如牡丹,花期也就一週。而花開之時,玫瑰和月季無法與之相比。明日黃花蝶也愁。想起去年開車在美國最美的加州一號公路上,哼著美國鄉村音樂,以最正確的方式開啟著最美的風景,心裡卻為現在已經想不起來的一個什麼理由不開心,好可惜。從來沒把青春當做資本,卻也不願看看時光流走時自己的碌碌無為。

  終於確定了今年要做的事情。然而就是這個也並不容易。年初籤績效的時候,老大問我一些想法,說我能力比較強,老是做專案對我的成長不好。我說沒關係,成長這種事終究要靠自己的。我之所以這樣說是因為自己也沒想到解決辦法。那麼這時候說什麼也只是給別人出難題而已。為難別人的事情是絕對不能做的。

  第一次聽到中介軟體這個名詞是在人人的時候,那時候的中介軟體是基於ICE的,用C++寫的。推薦幾度人脈,新鮮事(feed流),antispam這些當時覺得最有技術含量的工作都包含在中介軟體裡。但是這些東西都已經很成熟了,因為是C++寫的,需要專人維護,但是維護的人平時又很閒,非常雞肋。所以在C++的哥哥都離職之後,就用java改寫了。改寫之後用的是hessian協議了,就開始說RPC了,不講ICE了。有些東西,錯過了就是一輩子。因為當時是菜鳥一枚,所以到現在也沒了解什麼是ICE(下次同事聚會的時候可以嘮一嘮,mark一下)但是那時候還沒有zookeeper(說的自己好像是考古文物~~),我們自己寫了一個用於配置管理的,用socket作為廣播站傳送UDP報文給所有業務應用服務,用心跳監控資料庫的健康狀況給業務端發訊息的。這種做法,估計也和ICE思想的移植有關。想起五四新文化運動時,胡適說:"我們這一代的白話,如同裹小了的腳放不好一樣寫不好白話。" 我從山中來,帶著蘭花草……   額……又跑題了,拉回來。 

  轉載請註明原文地址   http://www.cnblogs.com/xiexj/p/6793016.html   謝謝哦~~

  今天的主題是IO。因為ES和Solr相比,最吸引人的一個優點是它使用了Netty框架。而Solr使用了jetty,當然用tomcat,resin這樣的web容器都能跑Solr.而網路程式設計框架的選用直接決定了其高併發的能力。像我們目前專案中資料量限制在GB級別上,ES的PB級資料支援我們用不上,甚至在特定場景下,都無需分詞,很少的索引,只做儲存,以時間換空間,其實Solr如果解決了IO讀寫效能瓶頸的問題,更能發揮其優勢。話說我們也是做過socket程式設計的,除了上面說的直接用socket發UDP廣播來做配置管理健康檢查,在離線服務裡我還用http請求直接用瀏覽器作為客戶端,指定一個埠繫結一個socketServer,用ScheduledExecutorService以固定時延用accept方法接收有沒有搜尋那邊兄弟發過來的補發訊息請求。如果有,就將socket的inputstream解析處理後寫的返回結果到outputstream。雖然寫程式碼是超級簡單了,而且是阻塞請求,要不是因為是手動補發資料用的肯定有併發問題。但是足以說明我們也是知道socket程式設計原理的,只是…… 這個水平就暫時不考慮做自己的網路程式設計框架了。

  IO其實和socket程式設計是兩個概念。IO是socket編輯必須要考慮的問題之一,IO不僅在網路中有,檔案系統中也要考慮。所以他們的關係是這樣:

 當然,其實維度要多的多,維度上的節點也多的多。我總是試圖將腦子裡的東西表現出來,其實說起來挺簡單的。各種不同的維度都是網路程式設計框架要考慮的問題。netty和mina都是網路程式設計框架,jetty和tomcat更多被稱為web容器。但是他們都主要解決和客戶端通訊的問題。因為socket程式設計更接近於底層,需要自己去解決IO的問題,自己去決定用阻塞還是非阻塞,所以常將他們連在一起說。

  阻塞的IO,在我做過的socket程式設計裡都表現的很清楚了。開啟一個連線一直阻塞在那裡到accept到資料處理後關閉。accept就是"我住長江頭,君住長江尾"裡日日思君不見君的那個苦苦期盼的人。IO是面向流的,NIO是面向快取區的,緩衝區本質是個陣列,存的是整塊的資料,所以又叫面向塊的。NIO的基本原理挺好理解的。它包括三個基本要素:選擇器Selector,通道channel,緩衝區buffer。看過人家包山楂餅的。山楂被生產線壓成山楂片之後,會到一個大盒子裡面。一個生產線就是一個通道。一個盒子就是一個緩衝區。搬運工會把這些裝滿的盒子放到特定的負責將山楂片包成一條一條的工人那裡。搬運工是選擇器。包山楂片是執行緒來完成的。選擇器接觸的工序是向Selector註冊通道,SelectionKey (包含屬性:interest集合,ready集合,Channel,Selector,可選的附加的物件),通過Selector選擇通道,喚醒,關閉。框架就是領班。搬運工對領班說我是負責搬運盒子的(向Selector註冊通道), 領班就去看這個搬運工,瞭解他的特長(interest集合)是搬運,已經搬完上個盒子正在等著搬運下一個盒子(ready集合),要處理的是沒包裝的山楂片盒子(Channel),知道他的所需SelectionKey屬性後,就決定讓他搬一個盒子(通過Selector選擇通道),於是叫他去搬運(喚醒),看到他送去給到了包山楂片的工人就放心了(關閉)。通道的資料不僅可以取出,還可以放入。放入也是搬運工一盒子一盒子放的。所以選擇器也有很多選項:建立連線,就緒,讀出,寫入。讀出和寫入一個是伺服器端,一個是客戶端。都是通過通道來通訊。告訴你們一個祕密,小姨家的山楂樹都無肥無農藥,直接對外出口,但是山楂的壓碎過程都是脫了鞋襪用腳踩的。知道之後再也沒吃過山楂片。

 看,山楂的工作流和NIO是一樣的。情商高的郭靖最終能打過智商高的楊康。對別人的用心和關心最終會轉化為自己的智慧。而愛一個人要比被愛更幸福。看著一個背景會覺得很像心裡的那個人,而“真的是你”多少次依然驚喜。明明是算好了人家幾點經過,而見到的時候“好巧啊”依然是那麼真心。漸漸的,心裡的那個人會變成自己的一部分。發現自己和那個人一樣聰明,一樣善良。因為愛竟然是那麼神奇的東西,它可以開啟一個通道,可以知道自己喜歡的人在想什麼,會在她需要的時候出現。心靈感應竟然是真的。

今天堵車,估計還要兩小時才到公司,所以原諒今天的文章不僅跑題太遠,而且基本沒在正題上=.=

相關文章