欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法

文檔序號:6515179閱讀:256來源:國知局
一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法
【專利摘要】本發(fā)明公開了一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法,主要實現(xiàn)了以下功能:A.采用“多Reactor+線程池”機制有效的解決了密集型IO和計算的問題;B.良好的接口設(shè)計簡化了TCP網(wǎng)絡(luò)編程開發(fā);C.采用智能指針以及其它多線程安全措施,對系統(tǒng)資源進行合理有效的管理,增加了程序的魯棒性;D.采用第三方中間語言來描述消息格式,解決了升級與跨語言的問題。本發(fā)明利用C++語言的高效、穩(wěn)定和靈活性,創(chuàng)建了一個通用的網(wǎng)絡(luò)框架,極大的減少了網(wǎng)絡(luò)應(yīng)用開發(fā),讓企業(yè)可以更專注于業(yè)務(wù)的開發(fā)而不必考慮數(shù)據(jù)傳輸、通訊和管理等方面的技術(shù)細節(jié)。
【專利說明】一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于網(wǎng)絡(luò)通訊領(lǐng)域,尤其涉及一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架,其為一個提升網(wǎng)絡(luò)性能、縮短軟件開發(fā)周期的網(wǎng)絡(luò)框架。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)/移動互聯(lián)網(wǎng)的飛速發(fā)展,業(yè)界對高性能的分布式處理服務(wù)器需求越來越高,傳統(tǒng)的服務(wù)器網(wǎng)絡(luò)框架已經(jīng)無法滿足需求。另一方面,在面對紛繁復雜的業(yè)務(wù)需求時,更短的軟件開發(fā)周期意味著更豐厚的回報。
[0003]傳統(tǒng)的網(wǎng)絡(luò)框架基于阻塞式網(wǎng)絡(luò)編程,程序流程通常阻塞在讀取數(shù)據(jù)過程上。TCP是個全雙工的協(xié)議,同時支持讀寫操作,當一個線程/進程阻塞在讀取數(shù)據(jù)上時,給這個連接發(fā)送數(shù)據(jù)就必須等待讀取數(shù)據(jù)完成,這就導致了程序效率低下。
[0004]近些年來,IO多路復用技術(shù)應(yīng)用十分廣泛,也就是通過select/poll/epoll等多路選擇器,讓可一個線程可以處理多個連接,從而提高數(shù)據(jù)收發(fā)效率。同時,通過Reactor的思想,將網(wǎng)絡(luò)部分的通用代碼提取為公用的框架或庫,用戶只需要編寫業(yè)務(wù)邏輯代碼,并通過事件回調(diào)注冊到框架中,就可以實現(xiàn)完整的網(wǎng)絡(luò)服務(wù)。
[0005]通常情況下,網(wǎng)絡(luò)庫設(shè)計事件回調(diào)的方式是定義一個接口,包含網(wǎng)絡(luò)事件對應(yīng)的處理函數(shù)。用戶的代碼去繼承這個接口并加以實現(xiàn),然后把對象注冊到網(wǎng)絡(luò)庫中,事件觸發(fā)時就回調(diào)對應(yīng)的函數(shù),這是傳統(tǒng)的C++網(wǎng)絡(luò)庫的做法。這種做法在C++中面臨的一個直接問題是對象的生命周期管理,因為C++的動態(tài)綁定只能通過指針和引用來實現(xiàn),你必須把基類指針傳給框架,才能獲得事件的回調(diào)。那么這個派生類對象何時銷毀就成為了難點,它的所有權(quán)到底歸誰?
[0006]其次,傳統(tǒng)的網(wǎng)絡(luò)庫對資源的管理容易導致一系列的問題。如TCP的連接是一個短生命周期對象,但是當連接被動斷開的時候,網(wǎng)絡(luò)庫不能立刻銷毀對象,因為用戶可能還持有它的引用準備用來收發(fā)消息,如果直接delete,有可能造成空懸指針,導致程序掛死。
[0007]最后,對于CS結(jié)構(gòu),服務(wù)端添加新功能后,不一定所有的客戶端都可以馬上升級并使用新功能,因此新的服務(wù)端在上線之后要保證和現(xiàn)有的客戶端的功能和協(xié)議保持兼容,這樣才能平穩(wěn)升級。傳統(tǒng)的網(wǎng)絡(luò)庫在消息格式設(shè)計中放入版本號,服務(wù)端每次收到消息都需要根據(jù)版本號做分發(fā),如此很容易在服務(wù)端留下一堆冗余代碼且容易導致混亂。另一種錯誤是采用c struct的格式設(shè)計消息,這樣的缺點也顯而易見:首先不易升級,其次是不跨語言,需要時刻維護其他語言的打包、解包代碼,同樣容易導致混亂。

【發(fā)明內(nèi)容】

[0008]本發(fā)明利用C++語言的高效、穩(wěn)定和靈活性,創(chuàng)建了一個通用的網(wǎng)絡(luò)框架,極大的減少了網(wǎng)絡(luò)應(yīng)用開發(fā),讓企業(yè)可以更專注于業(yè)務(wù)的開發(fā)而不必考慮數(shù)據(jù)傳輸、通訊和管理等方面的技術(shù)細節(jié)。
[0009]本發(fā)明采用的技術(shù)方案為:一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法,該方法包括如下步驟:
[0010]1.網(wǎng)絡(luò)服務(wù)設(shè)計:
[0011]網(wǎng)絡(luò)設(shè)計方案采用了“多Reactor+線程池”的策略,主Reactor負責accept客戶端的連接,收到連接請求后,將連接分配給某個子Reactor,這樣該連接的收發(fā)操作都在這個子Reactor中完成,多個連接就被分發(fā)至多個子線程中,同時,具體的運算任務(wù)也分配給了運算線程池來處理,從而充分的利用了 CPU ;
[0012]2.接口設(shè)計:
[0013]事件回調(diào)采用了 boost::function+boost::bind的做法,這種做法不必擔心對象的生命周期,對用戶代碼的class類型、成員函數(shù)名沒有限制,只對函數(shù)的參數(shù)和返回值類型有部分限制,傳給網(wǎng)絡(luò)庫的都是值語義的boost: !function對象,沒有指針和引用的概念,從而解決了對象生命周期和空懸指針的問題;[0014]3.資源管理:
[0015]采用了智能指針來管理資源,智能指針使用RAII的方法來對資源進行管理,RAII的基本原理是利用對象封裝資源,采用對象引用計數(shù)記錄對象的引用次數(shù):對象初始創(chuàng)建的時候引用次數(shù)為1,在對象被使用時引用計數(shù)加1,對象釋放時引用計數(shù)減1,直至引用次數(shù)為O時對資源進行釋放。故而能夠自動管理內(nèi)存的釋放,避免了空懸指針等bug的產(chǎn)生,同時降低了資源的維護成本,縮短了程序的開發(fā)周期;
[0016]4.消息格式設(shè)計:
[0017]采用Google Protobuf (即第三方中間語言)來描述消息格式,Protobuf是用于結(jié)構(gòu)化數(shù)據(jù)串行化的方法,能夠定義自己的數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器生成的代碼來讀寫這個數(shù)據(jù)結(jié)構(gòu),每個Protobuf信息是一小段邏輯記錄,包含一系列的鍵值對,每個消息類型擁有一個或多個特定的數(shù)字字段,每個字段擁有一個名字和一個值類型,值類型可以是數(shù)字、布爾型、字符串、原始字節(jié)或者其他Protobuf類型,還允許數(shù)據(jù)結(jié)構(gòu)的分級;可以運行Protobuf編譯器,將定義的.proto文件編譯成特定語言的類;可以在不影響向后兼容的情況下隨意給數(shù)據(jù)結(jié)構(gòu)增加字段,舊有的數(shù)據(jù)會忽略新的字段,所以使用Protobuf作為通信協(xié)議,可以無須擔心破壞現(xiàn)有代碼的情況下擴展協(xié)議。至此完成用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計。
[0018]本發(fā)明主要實現(xiàn)了以下功能:
[0019]A.采用“多Reactor+線程池”機制有效處理密集型IO和計算的問題;
[0020]B.良好的接口設(shè)計不會給使用者帶來不要的限制(稱合),用boost::function、boost::bind機制取代了繼承這種強的耦合設(shè)計,從而更易于開發(fā);
[0021]C.采用智能指針以及相關(guān)的一些多線程安全措施,對資源進行合理有效的管理,從而避免了開發(fā)過程中可能會導致的一些bug,增加了程序的魯棒性;
[0022]D.米用Google Protobuf (第二方中間語目)來描述消息格式,然后生成不同語目的解析與打包代碼,從而解決了升級與跨語言的問題。
[0023]本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點在于:
[0024](I)、本發(fā)明同時適合計算和IO密集型應(yīng)用;
[0025](2)、本發(fā)明良好的接口設(shè)計易于開發(fā)人員開發(fā),簡化TCP網(wǎng)絡(luò)編程;
[0026](3)、本發(fā)明有效的資源管理保證程序的穩(wěn)定性;[0027](4)、本發(fā)明采用第三方中間語言描述消息格式解決程序升級和跨語言的問題。
【專利附圖】

【附圖說明】
[0028]圖1是傳統(tǒng)單Reactor的網(wǎng)絡(luò)框架設(shè)計方案;
[0029]圖2是本發(fā)明所采用的網(wǎng)絡(luò)框架設(shè)計方案;
[0030]圖3是本發(fā)明所采用的消息格式設(shè)計方法;
[0031]圖4是本發(fā)明應(yīng)用在音頻質(zhì)量檢測系統(tǒng)上的部署示意圖;
[0032]圖5是性能、穩(wěn)定性測試中音頻質(zhì)量檢測系統(tǒng)的部署示意圖;
[0033]圖6是QCClient的處理速度隨分布節(jié)點數(shù)目變化趨勢圖;
[0034]圖7是QCServer的網(wǎng)絡(luò)帶寬隨分布節(jié)點數(shù)目的變化趨勢圖;
[0035]圖8是QCClient的CPU占用在3*24小時的監(jiān)視情況的示意圖;
[0036]圖9是QCClient的系統(tǒng)句柄占用在3*24小時的監(jiān)視情況不意圖;
[0037]圖10是QCClient的虛擬內(nèi)存在3*24小時的監(jiān)視情況。
【具體實施方式】
[0038]下面結(jié)合附圖以及 具體實施例進一步說明本發(fā)明。
[0039]1.網(wǎng)絡(luò)服務(wù)設(shè)計
[0040]傳統(tǒng)的阻塞式編程方案顯然已經(jīng)不能滿足如今的IO需求了,附圖1顯示的是目前使用較多的單Reactor設(shè)計方案,在沒有事件觸發(fā)時,IO線程等待在poll/epoll上,事件到達后由網(wǎng)絡(luò)庫處理10,完成后將結(jié)果發(fā)送(回調(diào))給客戶端代碼。
[0041]這種方案的優(yōu)點前面已經(jīng)提到,數(shù)據(jù)收發(fā)由網(wǎng)絡(luò)庫來完成,程序只用關(guān)心具體的業(yè)務(wù)邏輯;缺點則是:適合IO密集型的應(yīng)用,不適合CPU密集型的應(yīng)用,難以發(fā)揮多核多線程的威力。
[0042]附圖2顯示的是本發(fā)明采用的網(wǎng)絡(luò)設(shè)計方案,采用了“多Reactor+線程池”的策略,主Reactor負責accept客戶端的連接,收到連接請求后,將連接分配給某個子Reactor,這樣該連接的收發(fā)操作都在這個子Reactor中完成,多個連接就被分發(fā)至多個子線程中。同時,具體的運算任務(wù)也分配給了運算線程池來處理,從而充分的利用了 CPU??梢钥闯?,這種方案適合處理密集型10和運算的應(yīng)用,在現(xiàn)如今多核發(fā)展迅速的時代,可以極大的提升程序的性能。
[0043]2.接口設(shè)計
[0044]傳統(tǒng)C++網(wǎng)絡(luò)庫設(shè)計中,網(wǎng)絡(luò)庫會定義一些抽象基類,使用者需要繼承這些基類以獲取事件的回調(diào)通知。由于C++動態(tài)綁定只能通過指針和引用來實現(xiàn),使用者必須將子類對象的指針或者引用注冊給網(wǎng)絡(luò)庫。在這些子類的生命周期結(jié)束后到底由誰來釋放,如何保證一個地方在釋放對象時其他地方?jīng)]有繼續(xù)引用這個對象,這些都是難點。
[0045]本發(fā)明中,事件回調(diào)采用了 boost::function+boost::bind的做法,這種方式不必擔心對象的生命周期,對用戶代碼的class類型、成員函數(shù)名沒有限制,只對函數(shù)的參數(shù)和返回值類型有部分限制,傳給網(wǎng)絡(luò)庫的都是值語義的boost: !function對象,沒有指針和引用的概念,從而解決了對象生命周期和空懸指針的問題。
[0046]網(wǎng)絡(luò)編程最本質(zhì)的是處理以下問題:[0047]I)連接建立。包括服務(wù)端接受(accept)新連接和客戶端發(fā)起(connect)連接。
[0048]2)連接斷開。包括主動斷開(close或shutdown)和被動斷開。
[0049]3)消息收發(fā)。包括如何處理消息分包和解包,如何設(shè)計消息緩沖等。
[0050]本發(fā)明的使用非常簡單,不需要繼承,只需要采用boost::function+boost::bind機制注冊回調(diào)去處理前面提到的連接建立斷開、消息收發(fā)問題:
[0051]服務(wù)端注冊連接建立、斷開回調(diào):[0052]server」setConnectionCallback(boost::bind(&Server::onConnection, this, _D);
[0053]服務(wù)端注冊消息收發(fā)回調(diào):
[0054]server_.setMessageCal lback (boost:: bind (&Server:: onMessage, this,_l,_2));
[0055]3.資源管理
[0056]傳統(tǒng)的資源管理方式會導致一些不可預估的錯誤。如在TCP連接中,當連接被動斷開的時候,網(wǎng)絡(luò)庫不能立刻銷毀對象,因為用戶可能還持有它的引用,準備用來收發(fā)消息,如果直接delete,有可能造成空懸指針,導致程序掛死。
[0057]本發(fā)明采用了智能指針來管理資源,智能指針使用RAII的方法來對資源進行管理,RAII的基本原理是利用對象封裝資源,采用對象引用計數(shù)記錄對象的引用次數(shù):對象初始創(chuàng)建的時候引用次數(shù)為1,在對象被使用時引用計數(shù)加1,對象釋放時引用計數(shù)減1,直至引用次數(shù)為O時對資源進行釋放。故而能夠自動管理內(nèi)存的釋放,避免了空懸指針等bug的產(chǎn)生,同時降低了資源的維護成本,縮短了程序的開發(fā)周期。
[0058]例如,對TCP傳輸中的消息采用智能指針(boost:: shaed_ptr)管理,消息定義如下:boost:: shared_ptr〈google::protobuf::Message>message。程序運行中就無需考慮消息在何時釋放,當消息使用完畢后會自動析構(gòu)釋放資源。
[0059]4.消息格式設(shè)計
[0060]本發(fā)明采用Google Protobuf (第三方中間語言)來描述消息格式。Protobuf是用于結(jié)構(gòu)化數(shù)據(jù)串行化的靈活、高效、自動的方法,有如XML,不過它更小、更快、也更簡單。你可以定義自己的數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器生成的代碼來讀寫這個數(shù)據(jù)結(jié)構(gòu)。你甚至可以在無需重新部署程序的情況下更新數(shù)據(jù)結(jié)構(gòu)。只需要在一個.proto文件中定義你需要做串行化的數(shù)據(jù)結(jié)構(gòu)信息。每個Protobuf信息是一小段邏輯記錄,包含一系列的鍵值對。
[0061]這里有個非常簡單的.proto文件定義了個人信息:
[0062]message Person {
required string namc=l;
required inl32 id=2;
optional siring cmail=3;
etium PhoneType {
MOBILE=O;
HOME=I;
WOR 1(=2;

}
message PhoneNumber {
required siring number=!;
optional PhoncTypc typc=2 [dcfault=HOME];

}
repealed PhoncNumbcr phonc=4;

} [0063]可以看出,消息格式很簡單,每個消息類型擁有一個或多個特定的數(shù)字字段,每個字段擁有一個名字和一個值類型。值類型可以是數(shù)字(整數(shù)或浮點)、布爾型、字符串、原始字節(jié)或者其他Protobuf類型, 還允許數(shù)據(jù)結(jié)構(gòu)的分級。你可以指定可選字段,必選字段和
重復字段。
[0064]—旦定義了自己的報文格式(message),你就可以運行Protobuf編譯器,將你的.proto文件編譯成特定語言的類。
[0065]例如選擇C++語言,運行編譯如上的協(xié)議文件生成類叫做Person。隨后就可以在
應(yīng)用中使用這個類來串行化的讀取報文信息。代碼如下:
[0066]
Person person;
pcrson.sc1_namc("John");
person.sct_id( 1234);
pcrson.scl_cmail("xxx@ I 63.com");
(stream.0utput(”myl、ilc”,ios::out | ios::binary);
pcrson.SerializeToOsl_rcam(&ouiput);//消息內(nèi)容序列化至文件中
[0067]然后就可以讀取報文中的數(shù)據(jù),代碼如下:
[0068]
fstrcam input("myfilc'?,ios::1n | ios:binary);
Person person;
per son.Parse From I strcam(&input);// 從文件中解析消息內(nèi)容[0069]

cout << ’’Name: M << person.namc() << cndl;
coul << "E-mail: ” << pcrson.cmail() << cndl;
[0070]可以在不影響向后兼容的情況下隨意給數(shù)據(jù)結(jié)構(gòu)增加字段,舊有的數(shù)據(jù)會忽略新的字段。所以使用Protobuf作為通信協(xié)議,可以無須擔心破壞現(xiàn)有代碼的情況下擴展協(xié)議。
[0071]綜上所述,本發(fā)明采用了附圖3所示的消息格式設(shè)計。注意,消息中添加了校驗和字段,對于一些關(guān)鍵的網(wǎng)絡(luò)應(yīng)用,進一步保證了可靠性。
[0072]1.性能、穩(wěn)定性評估
[0073]目前,本發(fā)明已經(jīng)應(yīng)用在音頻質(zhì)量檢測系統(tǒng)上,該系統(tǒng)旨在使用自動化的方法對音頻的內(nèi)容質(zhì)量進行檢測,代替?zhèn)鹘y(tǒng)的人工檢測的方法,提升檢測的效率和效果。附圖4是該系統(tǒng)的部署圖。系統(tǒng)采用一臺中心節(jié)點(QCServer)和多個分布節(jié)點(QCClient)。中心節(jié)點負責管理分布式節(jié)點,分發(fā)請求任務(wù),整合處理結(jié)果。分布節(jié)點負責完成音頻質(zhì)量檢測,并向中心節(jié)點返回處理結(jié)果,其中對音質(zhì)的檢測較為消耗CPU。整個系統(tǒng)屬于典型的CPU和IO密集型系統(tǒng)。本發(fā)明負責QCServer和QCClient之間的IO通信管理以及QCClient的密集型CPU任務(wù)處理。
[0074]I)性能測試。
[0075]采用3個服務(wù)器(4核2G、4核4G、4核8G),部署方式如附圖5所示。
[0076]下面是引擎性能數(shù)據(jù)與分布節(jié)點數(shù)目的關(guān)系表:
[0077]表1引擎性能數(shù)據(jù)與分布節(jié)點數(shù)目的關(guān)系表
【權(quán)利要求】
1.一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法,其特征在于,該方法包括如下步驟: (1)、網(wǎng)絡(luò)服務(wù)設(shè)計: 網(wǎng)絡(luò)設(shè)計方案采用了“多Reactor+線程池”的策略,主Reactor負責accept客戶端的連接,收到連接請求后,將連接分配給某個子Reactor,這樣該連接的收發(fā)操作都在這個子Reactor中完成,多個連接就被分發(fā)至多個子線程中,同時,具體的運算任務(wù)也分配給了運算線程池來處理,從而充分的利用了 CPU ; (2)、接口設(shè)計: 事件回調(diào)采用了 boost::function+boost::bind的做法,這種做法不必擔心對象的生命周期,對用戶代碼的class類型、成員函數(shù)名沒有限制,只對函數(shù)的參數(shù)和返回值類型有部分限制,傳給網(wǎng)絡(luò)庫的都是值語義的boost:: function對象,沒有指針和引用的概念,從而解決了對象生命周期和空懸指針的問題; (3)、資源管理: 采用了智能指針來管理資源,智能指針使用RAII的方法來對資源進行管理,RAII的基本原理是利用對象封裝資源,采用對象引用計數(shù)記錄對象的引用次數(shù):對象初始創(chuàng)建的時候引用次數(shù)為1,在對象被使用時引用計數(shù)加1,對象釋放時引用計數(shù)減1,直至引用次數(shù)為O時對資源進行釋放。故而能夠自動管理內(nèi)存的釋放,避免了空懸指針等bug的產(chǎn)生,同時降低了資源的維護成本,縮短了程序的開發(fā)周期; (4)、消息格式設(shè)計: 采用Google Protobuf (即第三方`中間語言)來描述消息格式,Protobuf是用于結(jié)構(gòu)化數(shù)據(jù)串行化的方法,能夠定義自己的數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器生成代碼來讀寫這個數(shù)據(jù)結(jié)構(gòu),每個Protobuf信息是一小段邏輯記錄,包含一系列的鍵值對,每個消息類型擁有一個或多個特定的數(shù)字字段,每個字段擁有一個名字和一個值類型,值類型可以是數(shù)字、布爾型、字符串、原始字節(jié)或者其他Protobuf類型,還允許數(shù)據(jù)結(jié)構(gòu)的分級;可以運行Protobuf編譯器,將定義的.proto文件編譯成特定語言的類;可以在不影響向后兼容的情況下隨意給數(shù)據(jù)結(jié)構(gòu)增加字段,舊有的數(shù)據(jù)會忽略新的字段,所以使用Protobuf作為通信協(xié)議,可以無須擔心破壞現(xiàn)有代碼的情況下擴展協(xié)議。至此完成用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計。
2.根據(jù)權(quán)利要求1所述的一種用于分布式處理的高性能通用網(wǎng)絡(luò)框架的設(shè)計方法,其特征在于,消息中添加了校驗和字段,如下表所示:


I息總長度 ^




Protobuf消息名長度




Protobuf消息名稱




Protobuf序列化數(shù)據(jù)




校驗和_ 對于一些關(guān)鍵的網(wǎng)絡(luò)應(yīng)用,進一步保證了可靠性。
【文檔編號】G06F9/44GK103513990SQ201310474365
【公開日】2014年1月15日 申請日期:2013年10月11日 優(yōu)先權(quán)日:2013年10月11日
【發(fā)明者】楊溥, 吳維昊, 史峰 申請人:安徽科大訊飛信息科技股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
元朗区| 梅河口市| 天祝| 奉新县| 宜兰县| 南涧| 基隆市| 高陵县| 承德市| 鲁甸县| 琼海市| 珠海市| 武川县| 民乐县| 桦川县| 德令哈市| 柯坪县| 镶黄旗| 黄梅县| 集贤县| 临安市| 澜沧| 琼中| 襄汾县| 丽水市| 东平县| 绩溪县| 尉氏县| 阿拉善左旗| 亚东县| 昌乐县| 东光县| 永吉县| 永川市| 普洱| 祁连县| 都江堰市| 宝鸡市| 富锦市| 崇左市| 屏边|