IO和socket編程


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM