系統沒有及時升級。
創新互聯公司長期為上1000+客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為水城企業提供專業的成都做網站、網站建設,水城網站改版等技術服務。擁有十余年豐富建站經驗和眾多成功案例,為您定制開發。
建行到家rpc顯示請求超時,主要原因就是系統沒有及時升級,部分組件沒有響應,必須更新。
rpc(RemoteProcedureCall)是遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。
負載均衡是高可用網絡基礎架構的關鍵組件,通常用于將工作負載分布到多個服務器來提高應用的性能和可靠性。
關于GRPC的負載均衡,我們選擇NGINX來進行反向代理。NGINX在1.13.9版本已經開始支持GRPC代理。有了對 GRPC 的支持,NGINX 就可以代理 GRPC TCP 連接,還可以終止、檢查和跟蹤 GRPC 的方法調用。
在nginx的配置文件中配置GRPC代理即可。
通過grpc 調用代理端口
觀察NGINX的access.log,可以看到相應的代理記錄
首先GRPC是建立在HTTP2.0的基礎上進行數據傳輸,HTTP2.0的優勢就不用多說了。因此NGINX負載均衡同樣也是建立在HTTP2.0的基礎之上。并且NGINX新增了GRPC模塊。用于負載GRPC請求。
需要注意以下幾個NGINX的參數配置:
nginx_http2模塊
http2_max_requests:在一個tcp連接上默認通過的最大數據包數,默認1000個
http2_max_concurrent_streams:在一個tcp連接上默認最大并發流,默認128個
nginx_grpc模塊
grpc_send_timeout:將請求傳輸到gRPC服務器的超時時間,如果超過這個時間,NGINX會斷開連接。
grpc_read_timeout:接收gRPC服務器數據的超時時間,如果超過這個時間,NGINX會斷開連接。
grpc_socket_keepalive:NGINX與gRPC服務器長連接配置設置。
1、通過Configuration初始化集群Connection
1.1、Connction維持了客戶端到整個HBase集群的鏈接,如一個HBase集群有2個Master、5個RegionServer,那么一般來說整個Connection會維持一個到Active Master的TCP連接和5個到ReginonServer的TCP鏈接。
1.2、通常一個進程只需要為一個獨立的集群建立一個Connection即可,并不需要建立連接池。
1.3、Connection還緩存了訪問的Meta信息,后續的大部分請求都可以通過緩存的Meta信息定位到對應的Region Server。
2、通過Connection初始化Table
2.1、Table是一個非常輕量級的對象,它所使用的連接資源、配置信息、線程池、Meta緩存等都來自于Connection。
2.2、由同一個Connection創建的多個Table,都會共享連接、配置信息、線程池、Meta緩存這些資源
2.3、在branch-1以及之前的版本中,Table并不是線程安全的類,所以不建議在多個線程中使用同一個Table實例。在HBase 2.00及之后,Table已經實現了線程安全。
2.4、由于Table是一個非常輕量級的對象,所以可以通過Connection為每個請求創建一個Table,但是記住,在該請求執行完畢之后需要關閉Table資源。
3、hbase:meta
3.1、hbase:meta用來保存整個集群的region信息
3.2、hbase:meta在HBase中保證始終只有一個Region,這是為了確保meta表多次操作的原子性,因為HBase本質上只支持Region級別的事務所謂Region級別的事務是指:當多個操作落在同一個Region內時,HBase能保證這一批操作執行的原子性。如果多個操作分散在不同的Region,則無法保證這批操作的原子性
3.3、hbase:meta的一行就對應一個Region. 它的rowkey主要由TableName、StartRow、TimeStamp、EncodeName、標識這個Region是屬于哪個表,表Rowkey的起始行以及Region的創建時間戳
3.4、hbase:meta只有一個列簇info他有4列,info:regioninfo、info:seqnumDuringOpen、info:server、info:serverstartcode,表示這個表rowkey的起始位置,region落在哪個RegionServer上以及所在RegionServer的啟動時間戳
4、HBase超時參數設置
hbase.rpc.timeout:表示單次RPC請求的超時時間,默認是60 000ms。
hbase.clinet.retries.number:最多允許發生多少次RPC重試操作默認是35次。
hbase.clinet.pause:表示連續兩次RPC重試之間的休眠時間,默認是100ms。重試休眠時間是按照隨機退避算法設計的。也就是重試次數越多,休眠間隔時間就會越來越長。按照默認的重試次數35,則可能長期卡在休眠和重試兩個步驟中
hbase.clinet.operation.timeout:表示單次API的超時時間,默認值為1 200 000ms.一次API可能會有多次RPC重試,這個參數是API操作的總超時。
5、CAScheckAndPut、inCrementColumnValue操作是Region級別串行執行的,吞吐受限,在HBase 2.x版本已調整設計,對于同一個Region內部的不同行可以并行執行CAS,這樣大大提交了Region內部的CAS吞吐
6、Filter使用避坑指南
6.1、PrefixFilter 前綴過濾
低效使用方式:
Scan scan = new Scan();
scan.setFilter(new PrefixFillter(Bytes.toBytes("def")));
這個Scan雖然能得到預期的效果,但是并不高效,因為對于rowKey在區間(-∞,def)的數據,會一條條掃描,發現前綴不為def,就讀下一行,直到找到第一個rowkey為def的行為止
高效使用方式:
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("def"));
scan.setFilter(new PrefixFillter(Bytes.toBytes("def")));
增加了一個startRow。RegionServer發現Scan設置了startRow,首先會尋址定位到startRow。這樣就跳過了大量的(-∞,def)的數據。
最高效的使用方式:
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("def"));
scan.setStopRow(Bytes.toBytes("deg"));
將PrefixFilter直接展開,掃描[def,deg)區間的數據,這樣效率是最高的。
6.2、PageFilter:表有5個Region起始key為(-∞,1)、[1,2)、[2,3)、[3,4)、[4,+∞)每個Region 都有超過100條數據
錯誤的使用方式:
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("1"));
scan.setStopRow(Bytes.toBytes("3"));
scan.setFilter(new PageFilter(100))
這樣寫得出來的分頁每頁數據就會有200 條。但是明明設置了分頁每頁條數是100。原因是,它需要scan 2個Region.scan從一個region切換到另一個region之前的那個Filter的內部狀態就無效了,新的region內部用的是一個全新的Filter.Filter計數器被清零。Filter不是全局的, 所以它分別從2個region各查了100 條,總共200 條返回。
正確的使用方式:
如果想實現分頁功能,可以不通過Filter而直接通過limit來實現。
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("1"));
scan.setStopRow(Bytes.toBytes("3"));
scan.setLimit(100);
所以對于用戶來說,正常情況下PageFilter并沒有太多的存在價值
6.3、SingleColumnValueFilter
使用方式:
Scan scan = new Scan();
SingleColumnValueFilter scvf = new? SingleColumnValueFilter(Bytes.toBytes("family"),Bytes.toBytes("qualifier"),
CompareOp.EQUAL,Bytes.toBytes("value"));
scan.setFilter(scvf);
表面上是將列簇為family,列為qualifier,值為value的cell返回給用戶,但事實上那些不包含family:qualifier的行也會默認返回給用戶,如果用戶不希望讀取那些不包含family:qualifier的數據,需要設計如下scan
Scan scan = new Scan();
SingleColumnValueFilter scvf = new? SingleColumnValueFilter(Bytes.toBytes("family"),Bytes.toBytes("qualifier"),
CompareOp.EQUAL,Bytes.toBytes("value"));
scvf.setFiterIfMisssing(true);
scan.setFilter(scvf);
另外當SingleColumnValueFilter設置為filterIfMisssing為true時,和其他Filter組合成FilterList時可能導致返回的結果不正確。建議是不要使用SingleColumnValueFilter與其他Filter組合成FilterList。 直接指定列,通過ValueFilter替換掉SingleColumnValueFilter
Scan scan = new Scan();
ValueFilter vf = new ValueFilter(CompareOf.EQUAL,new BinaryComparatoe(Bytes.toBytes("value")));
scan.addColum(Bytes.toBytes("family"),Bytes.toBytes("qualifier"));
scan.setFilter(vf);
7、HBase寫入方式對比
7.1、table.put(Put):
每次執行都會執行一次RPC和磁盤持久化,寫入吞吐受限于磁盤帶寬、網絡帶寬,不會有數據丟失能保證put操作的原子性。
7.2、table.put(ListPut):
客戶端打包一批put提交,執行一次RPC,一次WAL。相比第一種省略了多次往返的RPC和磁盤持久化。但是時間會變長。如果打包的put分布在多個Region。則不能保證這一批put的原子性,應為HBase不支持跨Region的多行事務,失敗的put會經歷若干次重試。
7.3、bulk load:
將待寫入的數據生成HFile,然后采用bulk load方式將HFile直接加載到對于的Region的CF內。這是一種完全離線的快速寫入方式。它應該是最快的批量寫入手段,同時不會對線上的集群產生巨大壓力,在load完HFile之后,CF內部會進行Compaction,但是Compaction是異步的且可以限速,所以bulk load對線上集群非常友好。
使用場景舉例:
7.3.1、兩個集群互為主備,其中一個集群由存在數據丟失,想通過另一備份集群的數據來修復異常集群。最快的方式是:把備份集群的數據導一個快照拷貝到異常集群,然后通過copyTable工具掃快照生成HFile,然后bulk load 到異常集群,完成數據的修復。
7.3.2、當用戶寫入大量數據后,發現選擇的split keys不合適,想重新選擇split keys見表,這時也可以通過 snapshort生成HFile再bulk load的方式生成新表。
考慮基于HTTP的RPC,或者HTTP服務器主動通知客戶端的機制,就是HTTP Long-Polling,意思就是客戶端發起一個長連接,服務器阻塞忍住不響應直到:
超時,比如5秒后,我們給客戶端響應一個keepalive,意思是現在還沒有啥事,請繼續polling。
拿到結果,這個可能是任何時候,比如300毫秒、1100毫秒、2300毫秒拿到一個事件,響應給客戶端,實現了有事件異步通知。
這樣客戶端和服務器之間RPC的效率就非常高,只有在有事件時才會通知。但是,實際上還有一種情況需要處理:
當客戶端斷開連接,比如客戶端設置了3秒鐘TCP請求超時,或者因為客戶端Crash時OS回收了FD等等,這個時候服務器應該要終止polling事務,停止獲取事件。因為如果這個時候獲取了事件,那么如何處理這個事件?只能丟棄,如果客戶端再次發起請求,就拿不到這個事件了。
問題就來了,如何在HTTP Handler中探測客戶端斷開?例如:
分享標題:go語言rpc超時時間 go實現rpc
本文來源:http://vcdvsql.cn/article40/doieheo.html
成都網站建設公司_創新互聯,為您提供品牌網站設計、網站策劃、Google、網站設計、App設計、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯