應(yīng)項(xiàng)目需求,需要將上傳至Fastdfs的圖片,搭建一個(gè)圖片素材庫(kù)(類似于百度圖片)。但是在項(xiàng)目構(gòu)建初期,數(shù)據(jù)量不是很大,也并沒(méi)有設(shè)想到要做這一塊的功能,圖片上傳fastdfs后,也就沒(méi)有將圖片寬高,大小,存下來(lái)。在需求下發(fā)下來(lái)后,著手考慮如何針對(duì)場(chǎng)景在現(xiàn)有基礎(chǔ)上做一些補(bǔ)充或者叫修復(fù)。首先需要新增三個(gè)字段,width,height,size。然后對(duì)庫(kù)中已有的千萬(wàn)圖片數(shù)據(jù),做數(shù)據(jù)修復(fù)。
開(kāi)始構(gòu)想,做一個(gè)定時(shí)處理任務(wù)跑批,一次獲取1w條數(shù)據(jù),然后在此次任務(wù)中,將獲取到的1w條數(shù)據(jù)分片,一個(gè)分片中1000條數(shù)據(jù),然后分10個(gè)線程并發(fā)處理。處理完后,一次性更新入庫(kù)(大數(shù)據(jù)庫(kù),1w條數(shù)據(jù)還是可以支持的)?;蛘咭粋€(gè)分片中100條數(shù)據(jù),分100個(gè)線程。針對(duì)線程數(shù)這塊,特地查到windows服務(wù)器下最多可支持好幾千甚至更多個(gè)線程,當(dāng)然這些也跟CPU,操作系統(tǒng)等有關(guān)系,但對(duì)于我們跑批的這一點(diǎn)線程,還是沒(méi)問(wèn)題的。

期間遇到些問(wèn)題,操作FastDfs的是使用了一個(gè)封裝好的工具包org.csource.fastdfs-client-java 版本5.0.4,調(diào)用了其封裝好的下載接口,StorageClient.download_file1(file_id);但是報(bào)錯(cuò),主要錯(cuò)誤如下:? java.io.IOException: recv cmd: 10 is not correct, expect cmd: 100

經(jīng)查,發(fā)現(xiàn),F(xiàn)astDfs 在多線程環(huán)境下上傳,下載圖片的時(shí)候,同時(shí)使用一個(gè)StorageClient操作文件,會(huì)報(bào)這個(gè)錯(cuò)誤,網(wǎng)絡(luò)建議有兩種解決方案:
1. 對(duì)StorageClient對(duì)象加鎖
2. 每次下載或上傳文件時(shí),重新new一個(gè)StorageClient
第一種方案的話,鑒于多線程處理方式下,對(duì)象加鎖,那顯然不合適,
第二種方案,每一次上傳,下載時(shí)都去開(kāi)辟一個(gè)鏈接,幾千萬(wàn)的數(shù)據(jù)量,頻繁的開(kāi)關(guān),是否會(huì)給線上的圖片服務(wù)器造成壓力,是未知的,保險(xiǎn)起見(jiàn),換了一種方式:
?通過(guò)HttpURLConnection 讀取流的方式下載,這種方式,顯然是避開(kāi)了頻繁創(chuàng)建StorageClient,并且,通過(guò)HttpURLConnection請(qǐng)求Fastdfs的ngnix代理路徑,也會(huì)適當(dāng)?shù)慕档蛦我籗torage訪問(wèn)壓力。項(xiàng)目比較趕,所以,暫時(shí)先用該方式修復(fù),至于Fastdfs頻繁創(chuàng)建StorageClient是否會(huì)有效率或者其他影響,需要深入了解一下。

期間還遇到了一些圖片下載解析的問(wèn)題,這個(gè)問(wèn)題,是JDK由于版本迭代產(chǎn)生的一些隱式異常,是在ImageIO.read() 還有 像此處的java.awt.image.ColorConvertOp.filter() 的一些顯式異常。
這個(gè)異常暫時(shí)先忽略掉了,因?yàn)榭赡苁怯捎谝恍v史的jpeg圖片導(dǎo)致,后期再看如何修復(fù),可能會(huì)需要使用到類似于ImageMagic的圖片處理工具等等了。
雖然弄完了,程序一切正常,但是,還是不夠快,10000數(shù)據(jù)量差不多10分鐘,那些秒級(jí)百萬(wàn)數(shù)據(jù)處理到底是怎么樣做到的呢,行吧,自己需要學(xué)的還有很多了。
最后,還是將數(shù)據(jù)分成了多個(gè)時(shí)間段,在檢索上進(jìn)行分片,然后部署了多個(gè)處理任務(wù),并行處理。
學(xué)無(wú)止盡,在每一次處理解決問(wèn)題中,才能感受到成長(zhǎng)。