整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          TypeScript基礎入門之高級類型的索引類型(I

          TypeScript基礎入門之高級類型的索引類型(Index types)

          級類型

          索引類型(Index types)

          使用索引類型,編譯器就能夠檢查使用了動態屬性名的代碼。 例如,一個常見的JavaScript模式是從對象中選取屬性的子集。

          function pluck(o, names) {
           return names.map(n=> o[n]);
          }
          

          下面是如何在TypeScript里使用此函數,通過 索引類型查詢和 索引訪問操作符:

          function pluck<T, K extends keyof T>(o:T, names: K[]): T[K][] {
           return names.map(n=> o[n])
          }
          interface Interface1 {
           name: string;
           age: number;
          }
          let i: Interface1={
           name: "A",
           age: 1,
          }
          let pluckStr: string[]=pluck(i, ['name'])
          console.log(pluckStr)
          

          運行后輸出如下

          [ 'A' ]
          

          編譯器會檢查 name是否真的是Interface1的一個屬性。 本例還引入了幾個新的類型操作符。 首先是 keyof T, 索引類型查詢操作符。 對于任何類型 T, keyof T的結果為 T上已知的公共屬性名的聯合。 例如:

          let someProps: keyof Interface1; // 'name' | 'age'
          

          keyof Interface1是完全可以與'name'|'age'互相替換的。 不同的是如果你添加了其它的屬性到Interface1,例如address: string,那么 keyof Interface1會自動變為'name'|'age'|'address'。 你可以在像pluck函數這類上下文里使用 keyof,因為在使用之前你并不清楚可能出現的屬性名。 但編譯器會檢查你是否傳入了正確的屬性名給 pluck:

          pluck(i, ['age', 'unknown']); // error, 'unknown' is not in 'name' | 'age'
          

          第二個操作符是T[K],索引訪問操作符。 在這里,類型語法反映了表達式語法。 這意味著 i['name']具有類型Interface1['name'] — 在我們的例子里則為string類型。 然而,就像索引類型查詢一樣,你可以在普通的上下文里使用 T[K],這正是它的強大所在。 你只要確保類型變量 K extends keyof T就可以了。 例如下面 getProperty函數的例子:

          function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
           return o[name]; // o[name] is of type T[K]
          }
          

          getProperty里的 o: T和 name: K,意味著 o[name]: T[K]。 當你返回 T[K]的結果,編譯器會實例化鍵的真實類型,因此 getProperty的返回值類型會隨著你需要的屬性改變。

          let name: string=getProperty(i, 'name');
          let age: number=getProperty(i, 'age');
          let unknown=getProperty(i, 'unknown'); // error, 'unknown' is not in 'name' | 'age'
          

          索引類型和字符串索引簽名

          keyof和T[K]與字符串索引簽名進行交互。如果你有一個帶有字符串索引簽名的類型,那么 keyof T會是 string。并且T[string]為索引簽名的類型:

          里云HBase增強版(Lindorm)簡介

          阿里云數據庫HBase增強版,是基于阿里集團內部使用的Lindorm產品研發的、完全兼容HBase的云上托管數據庫,從2011年開始正式承載阿里內部業務的海量數據實時存儲需求,支撐服務了淘寶、支付寶、菜鳥、優酷、高德等業務中的大量核心應用,歷經雙十一、春晚、十一出行節等場景的大規模考驗,在成本、性能、穩定性、功能、安全、易用性等方面相比社區版擁有諸多優勢和企業級能力,更多介紹可以參考Lindorm幫助文檔(https://help.aliyun.com/document_detail/119548.html)

          當大數據存儲遇上復雜查詢

          HBase是目前廣泛使用的NoSQL數據庫,其具有Schemeless特性,高吞吐,海量存儲和無限水平擴展的特性,因此被很好地應用在了推薦、風控、物聯網、畫像、表單等所有大數據場景。但是原生的HBase只支持Rowkey索引,即按rowkey的二進制排序的索引。HBase的Scan請求可基于此rowkey索引高效的執行整行匹配、前綴匹配、范圍查詢等操作。但若需要使用rowkey之外的列進行查詢,則只能使用filter在指定的rowkey范圍內進行逐行過濾。若無法指定rowkey范圍,則需進行全表掃描,不僅浪費大量資源,查詢RT也無法保證。

          為了解決用戶基于非主鍵列的查詢問題,阿里云HBase增強版(Lindorm)內置原生的全局二級索引功能,對于列較少且有固定查詢模式的場景來說,阿里云的高性能二級索引方案能夠完美解決此類問題,同時仍保持強大的吞吐與性能。這個索引方案在阿里內部使用多年,經歷了多次雙11考驗,尤其適合解決海量數據的全局索引場景。關于高性能二級索引,用戶可以參考《數據查詢的玄鐵劍:Lindorm二級索引功能解析》一文(https://developer.aliyun.com/article/740009 ), 同時,社區也有Phoenix,在HBase之上提供了插件式的二級索引以及SQL能力,使用SQL可以比較簡單地表達一些復雜查詢。

          但是,當面對更加復雜的查詢,比如表單、日志查詢里面的模糊查找,用戶畫像里面的隨機條件組合查詢等等,二級索引方案會顯得力不從心。而這些查詢,正是搜索引擎的優勢。

          Solr是分布式全文檢索的最佳實踐之一。Solr支持各種復雜的條件查詢和全文索引。通過智能集成Solr,Lindorm可以充分發揮海量數據的實時存儲和檢索能力,使得其可以高效支撐于:需要保存大數據量數據,而查詢條件的字段數據僅占原數據的一小部分,并且需要各種條件組合查詢的業務。例如:

          • ? 常見物流業務場景,需要存儲大量軌跡物流信息,并需根據多個字段任意組合查詢條件
          • ? 交通監控業務場景,保存大量過車記錄,同時會根據車輛信息任意條件組合檢索出感興趣的記錄
          • ? 各種網站會員、商品信息檢索場景,一般保存大量的商品/會員信息,并需要根據少量條件進行復雜且任意的查詢,以滿足網站用戶任意搜索需求等。

          數據同步的難題

          要想在Lindorm中集成Solr,必須想辦法將業務寫入Lindorm的主表數據實時索引到Solr中,然而存儲主表數據的寬表引擎和存儲索引數據的Solr檢索引擎有很大的差異性,比如數據模型上,兩者差別較大,寫入能力上,也有巨大的差異。針對寬表與檢索兩種異構引擎間的數據同步,目前市面上主要有兩種類似的方案:

          應用雙寫

          雙寫是最容易想到,也是最容易實現的方案。以用戶自己維護的雙寫HBase+Solr為例:業務將數據寫入HBase的同時,也將同樣的數據寫入Solr即可。有些用戶使用了HBase的Coprocessor功能,hook了HBase的寫入邏輯,在HBase完成寫入時,在Coprocessor中寫入solr,本質上也是雙寫HBase和Solr

          但雙寫HBase和Solr存在非常多的問題,需要用戶自己去解決:一致性難以保證

          • 當HBase寫入成功,Solr寫入失敗,或者HBase寫入失敗,Solr寫入成功都會造成數據不一致,用戶需要自己處理此類情況。
          • HBase支持更新部分列,而Solr只能整行更新,因此當更新HBase后,還需要在HBase中讀取整行數據,才能寫入Solr,當有多個線程同時修改一行時,會導致HBase和Solr中的數據不一致。
          • 就算用戶寫入HBase時是整行全量更新,無需回讀,寫入HBase和寫入Solr并不是原子更新,很難保證HBase的寫入順序跟Solr中的修改順序一致從而導致數據不一致問題

          穩定性降低雙寫HBase和Solr等于把HBase和Solr的可用性捆綁在了一起。Solr的可用性會反過來影響HBase的可用性。一旦Solr出現問題,用戶要么選擇放棄寫Solr,放棄數據一致性來確保可用性,要么只能無限重試等待Solr恢復來確保數據一致性,但降低了可用性。在HBase的Coprocessor中寫Solr的用戶的穩定性問題尤為突出,如果用戶沒有處理好Solr的拋錯和重試時的內存管理,很容易直接造成HBase RegionServer的宕機。讀寫能力下降很多用戶選擇HBase的主要原因是HBase具有海量吞吐能力,而現在雙寫Solr等于將HBase的寫入能力拉低到了Solr的水平,大部分業務都無法接受。同時雙寫時需要回讀HBase獲取整行數據,回讀會造成HBase額外的壓力,從而進一步降低了HBase的讀寫能力

          開源Lily HBase Indexer

          Lily HBase Indexer(下文簡稱Indexer)是Cloudera推出的HBase和Solr之間的數據同步組件。他利用了HBase的Replication功能,將自己"偽裝"成一個HBase的Replication sink集群,當HBase有數據寫入時,Replication會通過讀取WAL文件獲取最新更新傳輸到Indexer里,然后再由Indexer寫入Solr。

          同樣,這套方案也存在大量問題:同步效率低

          • Indexer使用的是Replication框架。在Replication框架下,一行數據的更新需要先要序列化寫入WAL,然后通過Replication從WAL中讀出反序列化,然后序列化成二進制數據發送到Indexer,Indexer再反序列化成數據才能寫入Solr。整個過程非常低效,同步的速率受限于HBase的Replication能力,往往Solr的寫入瓶頸還沒達到,就已經達到了HBase的Replication瓶頸。
          • Indexer的同步模型是每一個HBase表,都開啟一條Replication通道(一個Replication Peer)。有10張HBase表需要同步到Solr,就必須有10個Replication Peer,這意味著同一個WAL,會被讀取10次(每個peer都讀取一次)隨著同步表的增多,對HDFS的壓力也就越大。
          • 由于HBase是SchemaLess的,Indexer收到Replication發過來的WAL后,無法知道是否在WAL中有整行數據,因此它必須在寫Solr之前回讀HBase獲取整行數據。因此實際上,WAL中的entry發送過來后,有用的只有rowkey,其他的數據還是要依靠回讀,這些WAL entry經歷了這么長的發送鏈路,但大部分信息卻是無用的。同時,回讀會占用HBase資源,影響HBase穩定性。

          數據一致性無法保證使用Indexer同步HBase到Solr會經常遇到兩者之間數據不一致的問題,這也是Indexer的用戶吐槽最多的地方。

          這些不一致往往發生的非常隨機,一般用戶也很難查到原因,讓人摸不到頭腦。我們深入研究Indexer后發現了他的問題所在。由于Indexer依賴了HBase的Replication做同步,而HBase Replication有一個重要的特點就是亂序發送,這對于HBase集群之間的Replication無影響,因為HBase可以用KV的時間戳來保證最終一致。但是Solr是不支持列時間戳的,HBase的寫入亂序到達Indexer會導致寫入Solr中的數據與HBase不一致。

          比如用戶有兩次更新同一行,。但是在replication過程中, ts2的更新先到Indexer,而ts1的更新后到,這會導致Indexer將Solr中的這行的數據更新成value1,導致HBase和Solr的數據不一致。另外,由于HBase是先寫WAL再內存可見,在回讀HBase過程中,Indexer也可能沒有獲取到最新數據導致Solr數據不一致。

          同時HBase支持多family,多版本,自定義時間戳,各種類型的刪除,Solr模型的支持比較有限,Indexer沒有處理好這些問題,我們發現有多個case都會導致HBase和Solr的數據不一致,這里就不一一列舉了。Indexer官方已經不再維護Indexer社區代碼已經4年沒有更新,所有的這些問題都不會再修復,這也是使用Indexer的最大風險,面對這些問題和bug,用戶只能自行解決。

          云HBase增強版(Lindorm)全文索引

          通過分析應用雙寫和開源的Lily HBase Indexer存在的種種問題,Lindorm在研發全文索引功能時,從中吸取相關經驗,進行創新的設計,使得寬表和檢索兩類引擎正確而自然的結合在一起,方便用戶即開即用。

          在此方案中,我們選用了自研的BDS組件做Lindorm的寬表引擎到Solr檢索引擎間的數據同步。BDS是一個cloud native的HBase生態數據同步服務,可以提供高效的數據實時同步和全量遷移能力,關于BDS的介紹,用戶可以參照《BDS - HBase數據遷移同步方案的設計與實踐》一文(https://yq.aliyun.com/articles/704977 )。

          在此方案中,我們使用BDS完美解決了Lindorm的寬表引擎和檢索引擎Solr因為模型不一致,WAL亂序等等問題帶來的數據不一致問題。不管用戶是部分更新,多版本,自定義時間戳,多family寫入,還是刪除行、列,兩個引擎之間的數據都不會產生不一致問題(具體的做法在申請專利中,專利申請完成后再專文對外分享)。同時整個系統采用分布式分層架構,各個組件之間可以獨立自由伸縮,BDS服務、Lindorm的寬表引擎服務和檢索引擎服務都具備無限的橫向擴展能力,從而提供海量數據的無限存儲和實時檢索。在使用上, Lindorm全文索引功能非常簡單易用,用戶可以通過HBase Shell(Lindorm原生API暫未開放)就可以管理同步映射的Schema,BDS對于用戶來說是完全透明的。不像在Lily HBase Indexer方案中,用戶還需要和Indexer交互,管理schema。具體的操作大家可以參考全文索引使用快速入門的幫助(https://help.aliyun.com/document_detail/161121.html ),簡單來說,用戶只需要在HBase Shell中執行一條命令,就可以為數據列創建Solr索引

           hbase shell> add_external_index_field 'testTable', {FAMILY=> 'f', QUALIFIER=> 'money', TARGETFIELD=> 'money_f', TYPE=> 'FLOAT' }

          同時BDS還具有豐富的WebUI界面和監控和報警信息,用戶可以非常方便地獲取同步狀態和報錯信息。比如在云監控中,我們可以清晰地看到同步的延遲,同時可以通過訂閱報警,隨時發現異常。

          最后是 阿里云HBase增強版(Lindorm)全文索引與其他方案的一個對比

          方案雙寫Lily HBase IndexerLindorm全文索引同步效率受限于Solr受限于HBase Replication,擴展性差受限于Solr穩定性會影響HBase穩定性會影響HBase穩定性無影響數據一致性無法保證無法保證可以保證一致性Cloud NativeN/AN/A云原生,支持擴容,升級配置,同步通道可獨立擴展,報警監控一應俱全

          案例介紹

          目前已經有非常多的公司和業務已經在線上使用Lindorm的全文索引。這里給大家介紹幾個使用案例。

          某快遞公司包裹平臺

          該快遞公司的包裹系統原來使用了Oracle,由于業務的增長Oracle的單表數據過大已經造成瓶頸,并且只能存儲1個月的數據。在這么大規模的數據下,上萬網點的分析查詢已經慢到無法接受的程度。該公司采用了Lindorm全文索引的方案改造之后,不僅可以將可查數據擴展到6個月,在引入Solr做多維查詢后,查詢能力也比之前好了五倍。

          某O2O公司訂單系統

          該公司原來的訂單查詢系統使用了DRDS分庫分表,由于訂單量巨大,DRDS分32個庫都已經只能放下6個月的訂單數據。而該公司希望查詢系統能夠查詢所有訂單數據。同時由于查詢時有多達15個維度條件的隨機組合查詢,傳統的二級索引方案已經無法滿足要求。在選用了Lindorm全文索引方案后,得益于Lindorm的海量存儲能力,一個表就能放下所有歷史數據。由于單個Solr的表索引數據不宜過大,因此該業務使用了我們推薦的Solr分庫分表功能(Alias功能),Lindorm寬表存儲中的數據自動增量同步到不同的Solr Collection中(按時間分割),在查詢時,無需查詢全量Solr數據,只需要根據時間維度查詢少量Solr Collection。在新方案下,該公司不僅實現了能夠在線查詢所有歷史數據,還能秒級返回查詢結果。

          某在線教育公司營銷平臺

          該公司原來的營銷平臺直接基于MySQL,由于MySQL列不能太多,只能把各個系統的數據分布在多張表內,然后再采用DTS同步的方式,訂閱Binlog,再寫入到自建HBase的大寬表中。然后把寫入事件記在Kafka上,再消費Kafka的消息,回讀HBase數據同步到Solr中,最后提供給營銷系統使用。整個鏈路非常長,組件非常多,難以維護,容易出穩定性問題。在使用了Lindorm的全文索引方案后,僅僅使用了一個Lindorm就解決了所有的問題,簡單易運維,同時獲得了 Cloud native的能力,各個組件都可以無限水平擴展和擴容。

          總結阿里云Lindorm全文索引方案給廣大用戶提供了存儲與檢索的一站式解決能力,相比之前的方案,不僅簡單易用,容易維護,同時能夠利用Cloud Native的特性解決一系列運維上的難題。在技術上,阿里云Lindorm使用了一種高性能,低延遲的異構存儲同步方案,避免了之前一些方案的性能問題,并完美地解決了寬表引擎和檢索引擎的模型差異所帶來的數據不一致的問題,在后續的計劃中,Lindorm還將提供統一的多維查詢能力,系統會自動利用Solr索引對多條件查詢加速,而無需應用顯示地訪問Solr,進一步優化使用體驗。目前,有大量的公司和用戶已經基于此功能打造了他們的在線查詢和離線分析系統,歡迎更多的用戶前來試用。產品主頁:https://www.aliyun.com/product/hbase ,產品使用幫助:https://help.aliyun.com/document_detail/146604.html

          SSCI中文社會科學引文索引(2019-2020)(含擴展版)

          《中國社會工作研究》稿件范圍:本期特刊歡迎學術論文、研究報告、學術評論、書評以及社會工作、社會福利、社會政策及相關社會理論的學術動態評論。 一般投稿字數限制在10,000字(包括評論和參考文獻),特殊投稿字數可增加至15,000字,書評和學術概述限制在3,000~4,000字。

          來稿應遵循國際公認的學術標準,引用和注釋準確,有證據,全文論證邏輯一致,研究方法和分析工具清晰準確。 投稿時應特別注意社會工作術語的標準化。 術語方面,一般術語參見《社會工作導論》(王思斌主編,高等教育出版社,1999年第1版),參見《社會工作詞典》或《社會工作詞典》或《社會工作詞典》美國社會工作者協會(NASW)出版的國際術語詞典。 工作百科全書(全英文)。 特殊術語應明確定義或引用。 例如,翻譯的術語應附加在原文的括號中。 文章格式可參見《社會學研究》(中國社會科學院社會學研究所)或《中國社會科學季刊》(香港)。

          稿件中出現外文名稱時,將按照商務印書館出版的《英文名稱翻譯手冊》進行翻譯。 第一次出現時將原文用括號括起來,以后出現時不再附原文。

          國外投稿主題與中國問題相關,對中國社會工作和中國社會發展具有參考價值的理論和實踐研究。 具有普世價值理論的實用研究論文也受到歡迎。

          請同時提交印刷稿一套(三份)和軟盤一套。 請將軟盤保存為 HTML 文件格式。 來稿恕不退還,請自行妥善保管。 請在帖子封面打印:文章標題、作者及個人信息(包括學位、職位、工作單位)、聯系方式(包括信件地址、電子郵件、電話號碼、傳真)。 不要簽署這篇文章。

          《中國社會工作研究》編輯部擁有修改、刪除稿件的權利。 如有不同意見,請給予指導。

          請準備一份副本以供提交。 我不會取消。 無論采納與否,編輯部都會在3個月內通知作者,作者可自行處理稿件。

          所提交稿件的文學責任由作者承擔。 提交的稿件必須尚未正式發表。 嚴禁向本特刊提交更多稿件。

          本期特刊入選發表的稿件版權歸作者本人所有,版權歸中國社會工作教育協會所有。


          主站蜘蛛池模板: 福利在线一区二区| 国产日韩一区二区三区| 国产精品亚洲一区二区无码| 国产成人久久一区二区不卡三区| 亚洲一区在线视频| 久久精品日韩一区国产二区| 国产伦精品一区二区三区免.费 | 国精品无码一区二区三区左线| 国产一区二区女内射| 精品成人乱色一区二区| 免费精品一区二区三区在线观看| 国产精品主播一区二区| 精品无码一区二区三区亚洲桃色| 精品国产一区二区三区在线| 国产午夜三级一区二区三| 2020天堂中文字幕一区在线观| 精品国产亚洲第一区二区三区| 国产天堂一区二区综合| 国产对白精品刺激一区二区| 日本在线观看一区二区三区| 亚州日本乱码一区二区三区| 婷婷亚洲综合一区二区| 性色A码一区二区三区天美传媒| 日韩一区二区在线免费观看| 丰满爆乳一区二区三区| 免费看AV毛片一区二区三区| 无码人妻精品一区二区三区久久 | 亚洲男女一区二区三区| 一区二区三区免费高清视频| 精品性影院一区二区三区内射| 一本岛一区在线观看不卡| 久久久久人妻一区二区三区| 国产在线精品一区二区夜色| 国产91久久精品一区二区| 久久国产香蕉一区精品| 在线|一区二区三区四区| 精品三级AV无码一区| 国产精品毛片一区二区| 国产天堂在线一区二区三区| 精品欧洲av无码一区二区三区| 91精品一区国产高清在线|