當前位置:首頁 » 操作系統 » 邊緣資料庫

邊緣資料庫

發布時間: 2023-03-19 22:14:04

① 互聯網如何海量存儲數據

目前存儲海量數據的技術主要包括NoSQL、分布式文件系統、和傳統關系型資料庫。隨著互聯網行業不斷的發展,產生的數據量越來越多,並且這些數據的特點是半結構化和非結構化,數據很可能是不精確的,易變的。這樣傳統關系型資料庫就無法發揮它的優勢。因此,目前互聯網行業偏向於使用NoSQL和分布式文件系統來存儲海量數據。

下面介紹下常用的NoSQL和分布式文件系統。
NoSQL
互聯網行業常用的NoSQL有:HBase、MongoDB、Couchbase、LevelDB。

HBase是Apache Hadoop的子項目,理論依據為Google論文 Bigtable: A Distributed Storage System for Structured Data開發的。HBase適合存儲半結構化或非結構化的數據。HBase的數據模型是稀疏的、分布式的、持久穩固的多維map。HBase也有行和列的概念,這是與RDBMS相同的地方,但卻又不同。HBase底層採用HDFS作為文件系統,具有高可靠性、高性能。

MongoDB是一種支持高性能數據存儲的開源文檔型資料庫。支持嵌入式數據模型以減少對資料庫系統的I/O、利用索引實現快速查詢,並且嵌入式文檔和集合也支持索引,它復制能力被稱作復制集(replica set),提供了自動的故障遷移和數據冗餘。MongoDB的分片策略將數據分布在伺服器集群上。

Couchbase這種NoSQL有三個重要的組件:Couchbase伺服器、Couchbase Gateway、Couchbase Lite。Couchbase伺服器,支持橫向擴展,面向文檔的資料庫,支持鍵值操作,類似於SQL查詢和內置的全文搜索;Couchbase Gateway提供了用於RESTful和流式訪問數據的應用層API。Couchbase Lite是一款面向移動設備和「邊緣」系統的嵌入式資料庫。Couchbase支持千萬級海量數據存儲
分布式文件系統
如果針對單個大文件,譬如超過100MB的文件,使用NoSQL存儲就不適當了。使用分布式文件系統的優勢在於,分布式文件系統隔離底層數據存儲和分布的細節,展示給用戶的是一個統一的邏輯視圖。常用的分布式文件系統有Google File System、HDFS、MooseFS、Ceph、GlusterFS、Lustre等。

相比過去打電話、發簡訊、用彩鈴的「老三樣」,移動互聯網的發展使得人們可以隨時隨地通過刷微博、看視頻、微信聊天、瀏覽網頁、地圖導航、網上購物、外賣訂餐等,這些業務的海量數據都構建在大規模網路雲資源池之上。當14億中國人把衣食住行搬上移動互聯網的同時,也給網路雲資源池帶來巨大業務挑戰。

首先,用戶需求動態變化,傳統業務流量主要是端到端模式,較為穩定;而互聯網流量易受熱點內容牽引,數據流量流向復雜和規模多變:比如雙十一購物狂潮,電商平台訂單創建峰值達到58.3萬筆,要求通信網路提供高並發支持;又如優酷春節期間有超過23億人次上網刷劇、抖音拜年短視頻增長超10倍,需要通信網路能夠靈活擴充帶寬。面對用戶動態多變的需求,通信網路需要具備快速洞察和響應用戶需求的能力,提供高效、彈性、智能的數據服務。

「隨著通信網路管道十倍百倍加粗、節點數從千萬級逐漸躍升至百億千億級,如何『接得住、存得下』海量數據,成為網路雲資源池建設面臨的巨大考驗」,李輝表示。一直以來,作為新數據存儲首倡者和引領者,浪潮存儲攜手通信行業用戶,不斷 探索 提速通信網路雲基礎設施的各種姿勢。

早在2018年,浪潮存儲就參與了通信行業基礎設施建設,四年內累計交付約5000套存儲產品,涵蓋全快閃記憶體儲、高端存儲、分布式存儲等明星產品。其中在網路雲建設中,浪潮存儲已連續兩年兩次中標全球最大的NFV網路雲項目,其中在網路雲二期建設中,浪潮存儲提供數千節點,為上層網元、應用提供高效數據服務。在最新的NFV三期項目中,浪潮存儲也已中標。

能夠與通信用戶在網路雲建設中多次握手,背後是浪潮存儲的持續技術投入與創新。浪潮存儲6年內投入超30億研發經費,開發了業界首個「多合一」極簡架構的浪潮並行融合存儲系統。此存儲系統能夠統籌管理數千個節點,實現性能、容量線性擴展;同時基於浪潮iTurbo智能加速引擎的智能IO均衡、智能資源調度、智能元數據管理等功能,與自研NVMe SSD快閃記憶體檔進行系統級別聯調優化,讓百萬級IO均衡落盤且路徑更短,將存儲系統性能發揮到極致。

「為了確保全球最大規模的網路雲正常上線運行,我們聯合用戶對存儲集群展開了長達數月的魔鬼測試」,浪潮存儲工程師表示。網路雲的IO以虛擬機數據和上層應用數據為主,浪潮按照每個存儲集群支持15000台虛機進行配置,分別對單卷隨機讀寫、順序寫、混合讀寫以及全系統隨機讀寫的IO、帶寬、時延等指標進行了360無死角測試,達到了通信用戶提出的單卷、系統性能不低於4萬和12萬IOPS、時延小於3ms的要求,產品成熟度得到了驗證。

以通信行業為例,2020年全國移動互聯網接入流量1656億GB,相當於中國14億人每人消耗118GB數據;其中春節期間,移動互聯網更是創下7天消耗36億GB數據流量的記錄,還「捎帶」打了548億分鍾電話、發送212億條簡訊……海量實時數據洪流,在網路雲資源池(NFV)支撐下收放自如,其中分布式存儲平台發揮了作用。如此樣板工程,其巨大示範及拉動作用不言而喻。

② NoSQL會取代SQL資料庫嗎

對此,前Google工程師,Milo(本地商店搜索引擎)創始人Ted Dziuba最近發表標題驚人的博客「I Can't Wait for NoSQL to Die」,對NoSQL的適用范圍進行了分析。他認為,
NoSQL也會帶來一連串的新問題,並不會成為主流,無法取代關系型資料庫。
他的理由是:Cassandra等NoSQL資料庫在使用上並不方便,比如,修改column family定義時就需要重啟。而且NoSQL更適合Google那樣的規模,而一般的互聯網公司都不是Google,早早地去考慮Google那樣的規模的可擴展性,純粹是浪費時間,存在巨大的商業風險。
他還透露,即使在Google,AdWords這樣的關鍵產品也是基於MySQL實現的。
他在文中最後表示,NoSQL當然死不了,但是
它最終會被邊緣化,就像Rails被NoSQL邊緣化一樣
Dziuba的文章因為言辭激烈,在社區里引起了強烈反應。
SQL資料庫陣營贊同者大有人在。craigslist工程師、著名的MySQL專家Jeremy Zawodny表示,在讀此文的時候,不時會心一笑。他說,
NoSQL運動只是軟體不斷進化進程中的正常現象
。關系型資料庫也會繼續發展,MySQL社區不斷推出的XtraDB或InnoDB插件, PBXT, Drizzle都是證據。各種技術競爭的結果是,我們獲得了更多解決問題的選擇。
drizzle項目開發者Eric Day也表示,NoSQL有很多值得學習的,但是目前大部分實際項目的最佳選擇還是關系型資料庫。
NoSQL陣營當然不會坐視不理,Cassandra項目組的Eric Evans表示,Dziuba提到Cassandra修改column family定義的問題其實很容易解決。而且,NoSQL並不是要取代MySQL,事實上Twitter仍然在用MySQL。如果關系型資料庫能夠承擔負荷,那就用好了;如果不行,請考慮NoSQL。
而德國知名博客Code Monkeyism則嘲笑Dziuba看起來並沒有用MySQL做過真實項目,因為MySQL如果沒有memcache,基本上無法應付網站項目。他認為,NoSQL將使SQL資料庫邊緣化,而且一個重要理由恰恰是可以節省DBA的開銷。
digg的前任首席架構師現在也在創業的Joe Stump說,自己現在的創業項目就是用NoSQL,而且列舉了一系列問題挑戰SQL陣營。

③ 我想查中文文獻,請問常用資料庫有哪些

國內3大中文文獻資料庫系統:中國知網、萬方、中國期刊網。

萬方數據資源系統(China Info)由中國科技信息研究所,萬方數據股份有限公司研製。該資料庫收錄的期刊學科範圍廣,包括了學術期刊於非學術期刊,提供約2 000種的電子期刊的全文檢索。

被收錄的學術期刊都獲得了「中國核心期刊(遴選)資料庫來源期刊」的收錄證書。個別期刊甚至將「遴選」改成「精選」,或者乾脆去掉。很多作者因此誤以為這就是核心期刊。

中國知網收錄1994年以來國內6 600種期刊,包括了學術期刊於非學術期刊,涵蓋理工、農業、醫葯衛生、文史哲、政治軍事與法律、教育與社會科學綜合、電子技術與信息科學、經濟與管理。

收錄的學術期刊同時作為「中國學術期刊綜合評價資料庫統計源期刊」。但是收錄的期刊不很全面,一些重要期刊未能收錄。

(3)邊緣資料庫擴展閱讀:

多次引用的文獻,每處的頁碼或頁碼范圍(有的刊物也將能指示引用文獻位置的信息視為頁碼)分別列於每處參考文獻的序號標注處,置於方括弧後(僅列數字,不加「p」或「頁」等前後文字、字元)並作上標。

所列參考文獻的要求是:

1、所列參考文獻應是正式出版物,以便讀者考證。

2、所列舉的參考文獻要標明序號、著作或文章的標題、作者、出版物信息。

④ 如何用 Python 實現一個圖資料庫(Graph Database)

本文章是 重寫 500 Lines or Less 系列的其中一篇,目標是重寫 500 Lines or Less 系列的原有項目:Dagoba: an in-memory graph database。

Dagoba 是作者設計用來展示如何從零開始自己實現一個圖資料庫( Graph Database )。該名字似乎來源於作者喜歡的一個樂隊,另一個原因是它的前綴 DAG 也正好是有向無環圖 ( Directed Acyclic Graph ) 的縮寫。本文也沿用了該名稱。

圖是一種常見的數據結構,它將信息描述為若干獨立的節點( vertex ,為了和下文的邊更加對稱,本文中稱為 node ),以及把節點關聯起來的邊( edge )。我們熟悉的鏈表以及多種樹結構可以看作是符合特定規則的圖。圖在路徑選擇、推薦演算法以及神經網路等方面都是重要的核心數據結構。

既然圖的用途如此廣泛,一個重要的問題就是如何存儲它。如果在傳統的關系資料庫中存儲圖,很自然的做法就是為節點和邊各自創建一張表,並用外鍵把它們關聯起來。這樣的話,要查找某人所有的子女,就可以寫下類似下面的查詢:

還好,不算太復雜。但是如果要查找孫輩呢?那恐怕就要使用子查詢或者 CTE(Common Table Expression) 等特殊構造了。再往下想,曾孫輩又該怎麼查詢?孫媳婦呢?

這樣我們會意識到,SQL 作為查詢語言,它只是對二維數據表這種結構而設計的,用它去查詢圖的話非常笨拙,很快會變得極其復雜,也難以擴展。針對圖而言,我們希望有一種更為自然和直觀的查詢語法,類似這樣:

為了高效地存儲和查詢圖這種數據結構,圖資料庫( Graph Database )應運而生。因為和傳統的關系型資料庫存在極大的差異,所以它屬於新型資料庫也就是 NoSql 的一個分支(其他分支包括文檔資料庫、列資料庫等)。圖資料庫的主要代表包括 Neo4J 等。本文介紹的 Dagoba 則是具備圖資料庫核心功能、主要用於教學和演示的一個簡單的圖資料庫。

原文代碼是使用 JavaScript 編寫的,在定義調用介面時大量使用了原型( prototype )這種特有的語言構造。對於其他主流語言的用戶來說,原型的用法多少顯得有些別扭和不自然。

考慮到本系列其他資料庫示例大多是用 Python 實現的,本文也按照傳統,用 Python 重寫了原文的代碼。同樣延續之前的慣例,為了讓讀者更好地理解程序是如何逐步完善的,我們用迭代式的方法完成程序的各個組成部分。

原文在 500lines 系列的 Github 倉庫中只包含了實現代碼,並未包含測試。按照代碼注釋說明,測試程序位於作者的另一個代碼庫中,不過和 500lines 版本的實現似乎略有不同。

本文實現的代碼參考了原作者的測試內容,但跳過了北歐神話這個例子——我承認確實不熟悉這些神祇之間的親緣關系,相信中文背景的讀者們多數也未必了解,雖然作者很喜歡這個例子,想了想還是不要徒增困惑吧。因此本文在編寫測試用例時只參考了原文關於家族親屬的例子,放棄了神話相關的部分,盡管會減少一些趣味性,相信對於入門級的代碼來說這樣也夠用了。

本文實現程序位於代碼庫的 dagoba 目錄下。按照本系列程序的同意規則,要想直接執行各個已完成的步驟,讀者可以在根目錄下的 main.py 找到相應的代碼位置,取消注釋並運行即可。

本程序的所有步驟只需要 Python3 ,測試則使用內置的 unittest , 不需要額外的第三方庫。原則上 Python3.6 以上版本應該都可運行,但我只在 Python3.8.3 環境下完整測試過。

本文實現的程序從最簡單的案例開始,通過每個步驟逐步擴展,最終形成一個完整的程序。這些步驟包括:

接下來依次介紹各個步驟。

回想一下,圖資料庫就是一些點( node )和邊( edge )的集合。現在我們要做出的一個重大決策是如何對節點/邊進行建模。對於邊來說,必須指定它的關聯關系,也就是從哪個節點指向哪個節點。大多數情況下邊是有方向的——父子關系不指明方向可是要亂套的!

考慮到擴展性及通用性問題,我們可以把數據保存為字典( dict ),這樣可以方便地添加用戶需要的任何數據。某些數據是為資料庫內部管理而保留的,為了明確區分,可以這樣約定:以下劃線開頭的特殊欄位由資料庫內部維護,類似於私有成員,用戶不應該自己去修改它們。這也是 Python 社區普遍遵循的約定。

此外,節點和邊存在互相引用的關系。目前我們知道邊會引用到兩端的節點,後面還會看到,為了提高效率,節點也會引用到邊。如果僅僅在內存中維護它們的關系,那麼使用指針訪問是很直觀的,但資料庫必須考慮到序列化到磁碟的問題,這時指針就不再好用了。

為此,最好按照資料庫的一般要求,為每個節點維護一個主鍵( _id ),用主鍵來描述它們之間的關聯關系。

我們第一步要把資料庫的模型建立起來。為了測試目的,我們使用一個最簡單的資料庫模型,它只包含兩個節點和一條邊,如下所示:

按照 TDD 的原則,首先編寫測試:

與原文一樣,我們把資料庫管理介面命名為 Dagoba 。目前,能夠想到的最簡單的測試是確認節點和邊是否已經添加到資料庫中:

assert_item 是一個輔助方法,用於檢查字典是否包含預期的欄位。相信大家都能想到該如何實現,這里就不再列出了,讀者可參考 Github 上的完整源碼

現在,測試是失敗的。用最簡單的辦法實現資料庫:

需要注意的是,不管添加節點還是查詢,程序都使用了拷貝後的數據副本,而不是直接使用原始數據。為什麼要這樣做?因為字典是可變的,用戶可以在任何時候修改其中的內容,如果資料庫不知道數據已經變化,就很容易發生難以追蹤的一致性問題,最糟糕的情況下會使得數據內容徹底混亂。

拷貝數據可以避免上述問題,代價則是需要佔用更多內存和處理時間。對於資料庫來說,通常查詢次數要遠遠多於修改,所以這個代價是可以接受的。

現在測試應該正常通過了。為了讓它更加完善,我們可以再測試一些邊緣情況,看看資料庫能否正確處理異常數據,比如:

例如,如果用戶嘗試添加重復主鍵,我們預期應拋出 ValueError 異常。因此編寫測試如下:

為了滿足以上測試,代碼需要稍作修改。特別是按照 id 查找主鍵是個常用操作,通過遍歷的方法效率太低了,最好是能夠通過主鍵直接訪問。因此在資料庫中再增加一個字典:

完整代碼請參考 Github 倉庫。

在上個步驟,我們在初始化資料庫時為節點明確指定了主鍵。按照資料庫設計的一般原則,主鍵最好是不具有業務含義的代理主鍵( Surrogate key ),用戶不應該關心它具體的值是什麼,因此讓資料庫去管理主鍵通常是更為合理的。當然,在部分場景下——比如導入外部數據——明確指定主鍵仍然是有用的。

為了同時支持這些要求,我們這樣約定:欄位 _id 表示節點的主鍵,如果用戶指定了該欄位,則使用用戶設置的值(當然,用戶有責任保證它們不會重復);否則,由資料庫自動為它分配一個主鍵。

如果主鍵是資料庫生成的,事先無法預知它的值是什麼,而邊( edge )必須指定它所指向的節點,因此必須在主鍵生成後才能添加。由於這個原因,在動態生成主鍵的情況下,資料庫的初始化會略微復雜一些。還是先寫一個測試:

為支持此功能,我們在資料庫中添加一個內部欄位 _next_id 用於生成主鍵,並讓 add_node 方法返回新生成的主鍵:

接下來,再確認一下邊是否可以正常訪問:

運行測試,一切正常。這個步驟很輕松地完成了,不過兩個測試( DbModelTest 和 PrimaryKeyTest )出現了一些重復代碼,比如 get_item 。我們可以把這些公用代碼提取出來。由於 get_item 內部調用了 TestCase.assertXXX 等方法,看起來應該使用繼承,但從 TestCase 派生基類容易引起一些潛在的問題,所以我轉而使用另一個技巧 Mixin :

實現資料庫模型之後,接下來就要考慮如何查詢它了。

在設計查詢時要考慮幾個問題。對於圖的訪問來說,幾乎總是由某個節點(或符合條件的某一類節點)開始,從與它相鄰的邊跳轉到其他節點,依次類推。所以鏈式調用對查詢來說是一種很自然的風格。舉例來說,要知道 Tom 的孫子養了幾只貓,可以使用類似這樣的查詢:

可以想像,以上每個方法都應該返回符合條件的節點集合。這種實現是很直觀的,不過存在一個潛在的問題:很多時候用戶只需要一小部分結果,如果它總是不計代價地給我們一個巨大的集合,會造成極大的浪費。比如以下查詢:

為了避免不必要的浪費,我們需要另外一種機制,也就是通常所稱的「懶式查詢」或「延遲查詢」。它的基本思想是,當我們調用查詢方法時,它只是把查詢條件記錄下來,而並不立即返回結果,直到明確調用某些方法時才真正去查詢資料庫。

如果讀者比較熟悉流行的 Python ORM,比如 SqlAlchemy 或者 Django ORM 的話,會知道它們幾乎都是懶式查詢的,要調用 list(result) 或者 result[0:10] 這樣的方法才能得到具體的查詢結果。

在 Dagoba 中把觸發查詢的方法定義為 run 。也就是說,以下查詢執行到 run 時才真正去查找數據:

和懶式查詢( Lazy Query )相對應的,直接返回結果的方法一般稱作主動查詢( Eager Query )。主動查詢和懶式查詢的內在查找邏輯基本上是相同的,區別只在於觸發機制不同。由於主動查詢實現起來更加簡單,出錯也更容易排查,因此我們先從主動查詢開始實現。

還是從測試開始。前面測試所用的簡單資料庫數據太少,難以滿足查詢要求,所以這一步先來創建一個更復雜的數據模型:

此關系的復雜之處之一在於反向關聯:如果 A 是 B 的哥哥,那麼 B 就是 A 的弟弟/妹妹,為了查詢到他們彼此之間的關系,正向關聯和反向關聯都需要存在,因此在初始化資料庫時需要定義的邊數量會很多。

當然,父子之間也存在反向關聯的問題,為了讓問題稍微簡化一些,我們目前只需要向下(子孫輩)查找,可以稍微減少一些關聯數量。

因此,我們定義數據模型如下。為了減少重復工作,我們通過 _backward 欄位定義反向關聯,而資料庫內部為了查詢方便,需要把它維護成兩條邊:

然後,測試一個最簡單的查詢,比如查找某人的所有孫輩:

這里 outcome/income 分別表示從某個節點出發、或到達它的節點集合。在原作者的代碼中把上述方法稱為 out/in 。當然這樣看起來更加簡潔,可惜的是 in 在 Python 中是個關鍵字,無法作為函數名。我也考慮過加個下劃線比如 out_.in_ 這種形式,但看起來也有點怪異,權衡之後還是使用了稍微啰嗦一點的名稱。

現在我們可以開始定義查詢介面了。在前面已經說過,我們計劃分別實現兩種查詢,包括主動查詢( Eager Query )以及延遲查詢( Lazy Query )。

它們的內在查詢邏輯是相通的,看起來似乎可以使用繼承。不過遵循 YAGNI 原則,目前先不這樣做,而是只定義兩個新類,在滿足測試的基礎上不斷擴展。以後我們會看到,與繼承相比,把共同的邏輯放到資料庫本身其實是更為合理的。

接下來實現訪問節點的方法。由於 EagerQuery 調用查詢方法會立即返回結果,我們把結果記錄在 _result 內部欄位中。雖然 node 方法只返回單個結果,但考慮到其他查詢方法幾乎都是返回集合,為統一起見,讓它也返回集合,這樣可以避免同時支持集合與單結果的分支處理,讓代碼更加簡潔、不容易出錯。此外,如果查詢對象不存在的話,我們只返回空集合,並不視為一個錯誤。

查詢輸入/輸出節點的方法實現類似這樣:

查找節點的核心邏輯在資料庫本身定義:

以上使用了內部定義的一些輔助查詢方法。用類似的邏輯再定義 income ,它們的實現都很簡單,讀者可以直接參考源碼,此處不再贅述。

在此步驟的最後,我們再實現一個優化。當多次調用查詢方法後,結果可能會返回重復的數據,很多時候這是不必要的。就像關系資料庫通常支持 unique/distinct 一樣,我們也希望 Dagoba 能夠過濾重復的數據。

假設我們要查詢某人所有孩子的祖父,顯然不管有多少孩子,他們的祖父應該是同一個人。因此編寫測試如下:

現在來實現 unique 。我們只要按照主鍵把重復數據去掉即可:

在上個步驟,初始化資料庫指定了雙向關聯,但並未測試它們。因為我們還沒有編寫代碼去支持它們,現在增加一個測試,它應該是失敗的:

運行測試,的確失敗了。我們看看要如何支持它。回想一下,當從邊查找節點時,使用的是以下方法:

這里也有一個潛在的問題:調用 self.edges 意味著遍歷所有邊,當資料庫內容較多時,這是巨大的浪費。為了提高性能,我們可以把與節點相關的邊記錄在節點本身,這樣要查找邊只要看節點本身即可。在初始化時定義出入邊的集合:

在添加邊時,我們要同時把它們對應的關系同時更新到節點,此外還要維護反向關聯。這涉及對字典內容的部分復制,先編寫一個輔助方法:

然後,將添加邊的實現修改如下:

這里的代碼同時添加正向關聯和反向關聯。有的朋友可能會注意到代碼略有重復,是的,但是重復僅出現在該函數內部,本著「三則重構」的原則,暫時不去提取代碼。

實現之後,前面的測試就可以正常通過了。

在這個步驟中,我們來實現延遲查詢( Lazy Query )。

延遲查詢的要求是,當調用查詢方法時並不立即執行,而是推遲到調用特定方法,比如 run 時才執行整個查詢,返回結果。

延遲查詢的實現要比主動查詢復雜一些。為了實現延遲查詢,查詢方法的實現不能直接返回結果,而是記錄要執行的動作以及傳入的參數,到調用 run 時再依次執行前面記錄下來的內容。

如果你去看作者的實現,會發現他是用一個數據結構記錄執行操作和參數,此外還有一部分邏輯用來分派對每種結構要執行的動作。這樣當然是可行的,但數據處理和分派部分的實現會比較復雜,也容易出錯。

本文的實現則選擇了另外一種不同的方法:使用 Python 的內部函數機制,把一連串查詢變換成一組函數,每個函數取上個函數的執行結果作為輸入,最後一個函數的輸出就是整個查詢的結果。由於內部函數同時也是閉包,盡管每個查詢的參數形式各不相同,但是它們都可以被閉包「捕獲」而成為內部變數,所以這些內部函數可以採用統一的形式,無需再針對每種查詢設計額外的數據結構,因而執行過程得到了很大程度的簡化。

首先還是來編寫測試。 LazyQueryTest 和 EagerQueryTest 測試用例幾乎是完全相同的(是的,兩種查詢只在於內部實現機制不同,它們的調用介面幾乎是完全一致的)。

因此我們可以把 EagerQueryTest 的測試原樣不變拷貝到 LazyQueryTest 中。當然拷貝粘貼不是個好注意,對於比較冗長而固定的初始化部分,我們可以把它提取出來作為兩個測試共享的公共函數。讀者可參考代碼中的 step04_lazy_query/tests/test_lazy_query.py 部分。

程序把查詢函數的串列執行稱為管道( pipeline ),用一個變數來記錄它:

然後依次實現各個調用介面。每種介面的實現都是類似的:用內部函數執行真正的查詢邏輯,再把這個函數添加到 pipeline 調用鏈中。比如 node 的實現類似下面:

其他介面的實現也與此類似。最後, run 函數負責執行所有查詢,返回最終結果;

完成上述實現後執行測試,確保我們的實現是正確的。

在前面我們說過,延遲查詢與主動查詢相比,最大的優勢是對於許多查詢可以按需要訪問,不需要每個步驟都返回完整結果,從而提高性能,節約查詢時間。比如說,對於下面的查詢:

以上查詢的意思是從孫輩中找到一個符合條件的節點即可。對該查詢而言,主動查詢會在調用 outcome('son') 時就遍歷所有節點,哪怕最後一步只需要第一個結果。而延遲查詢為了提高效率,應在找到符合條件的結果後立即停止。

目前我們尚未實現 take 方法。老規矩,先添加測試:

主動查詢的 take 實現比較簡單,我們只要從結果中返回前 n 條記錄:

延遲查詢的實現要復雜一些。為了避免不必要的查找,返回結果不應該是完整的列表( list ),而應該是個按需返回的可迭代對象,我們用內置函數 next 來依次返回前 n 個結果:

寫完後運行測試,確保它們是正確的。

從外部介面看,主動查詢和延遲查詢幾乎是完全相同的,所以用單純的數據測試很難確認後者的效率一定比前者高,用訪問時間來測試也並不可靠。為了測試效率,我們引入一個節點訪問次數的概念,如果延遲查詢效率更高的話,那麼它應該比主動查詢訪問節點的次數更少。

為此,編寫如下測試:

我們為 Dagoba 類添加一個成員來記錄總的節點訪問次數,以及兩個輔助方法,分別用於獲取和重置訪問次數:

然後瀏覽代碼,查找修改點。增加計數主要在從邊查找節點的時候,因此修改部分如下:

此外還有 income/outcome 方法,修改都很簡單,這里就不再列出。

實現後再次運行測試。測試通過,表明延遲查詢確實在效率上優於主動查詢。

不像關系資料庫的結構那樣固定,圖的形式可以千變萬化,查詢機制也必須足夠靈活。從原理上講,所有查詢無非是從某個節點出發按照特定方向搜索,因此用 node/income/outcome 這三個方法幾乎可以組合出任意所需的查詢。

但對於復雜查詢,寫出的代碼有時會顯得較為瑣碎和冗長,對於特定領域來說,往往存在更為簡潔的名稱,例如:母親的兄弟可簡稱為舅舅。對於這些場景,如果能夠類似 DSL (領域特定語言)那樣允許用戶根據專業要求自行擴展,從而簡化查詢,方便閱讀,無疑會更為友好。

如果讀者去看原作者的實現,會發現他是用一種特殊語法 addAlias 來定義自己想要的查詢,調用方法時再進行查詢以確定要執行的內容,其介面和內部實現都是相當復雜的。

而我希望有更簡單的方法來實現這一點。所幸 Python 是一種高度動態的語言,允許在運行時向類中增加新的成員,因此做到這一點可能比預想的還要簡單。

為了驗證這一點,編寫測試如下:

無需 Dagoba 的實現做任何改動,測試就可以通過了!其實我們要做的就是動態添加一個自定義的成員函數,按照 Python 對象機制的要求,成員函數的第一個成員應該是名為 self 的參數,但這里已經是在 UnitTest 的內部,為了和測試類本身的 self 相區分,新函數的參數增加了一個下劃線。

此外,函數應返回其所屬的對象,這是為了鏈式調用所要求的。我們看到,動態語言的靈活性使得添加新語法變得非常簡單。

到此,一個初具規模的圖資料庫就形成了。

和原文相比,本文還缺少一些內容,比如如何將資料庫序列化到磁碟。不過相信讀者都看到了,我們的資料庫內部結構基本上是簡單的原生數據結構(列表+字典),因此序列化無論用 pickle 或是 JSON 之類方法都應該是相當簡單的。有興趣的讀者可以自行完成它們。

我們的圖資料庫實現為了提高查詢性能,在節點內部存儲了邊的指針(或者說引用)。這樣做的好處是,無論資料庫有多大,從一個節點到相鄰節點的訪問是常數時間,因此數據訪問的效率非常高。

但一個潛在的問題是,如果資料庫規模非常大,已經無法整個放在內存中,或者出於安全性等原因要實現分布式訪問的話,那麼指針就無法使用了,必須要考慮其他機制來解決這個問題。分布式資料庫無論採用何種數據模型都是一個棘手的問題,在本文中我們沒有涉及。有興趣的讀者也可以考慮 500lines 系列中關於分布式和集群演算法的其他一些文章。

本文的實現和系列中其他資料庫類似,採用 Python 作為實現語言,而原作者使用的是 JavaScript ,這應該和作者的背景有關。我相信對於大多數開發者來說, Python 的對象機制比 JavaScript 基於原型的語法應該是更容易閱讀和理解的。

當然,原作者的版本比本文版本在實現上其實是更為完善的,靈活性也更好。如果想要更為優雅的實現,我們可以考慮使用 Python 元編程,那樣會更接近於作者的實現,但也會讓程序的復雜性大為增加。如果讀者有興趣,不妨對照著去讀讀原作者的版本。

⑤ 網路進步下的產物——邊緣雲計算

隨著虛擬人等應用不斷發展成熟,對於計算的容量和實時性的要求不斷提高。在這種趨勢下,我們認為,邊緣雲計算有望成為元宇宙的重要支撐。作為雲計算的延伸,邊緣雲計算被視為新一輪 科技 革命中必不可少的驅動因素。我們認為,元宇宙對網路傳輸提出了更大帶寬、更低時延、更廣覆蓋的要求,需要藉助邊緣計算技術,以保障所有用戶獲得同樣流暢的體驗。

1.全球數據增長迅速,集中式雲計算已無法全面應對,邊緣剛需場景涌現,目前中國物聯網連接量將從2019年的55億個增長至2023年的148億個,年復合增長率達到28.1%。物聯網感知數據量激增,數據類型愈發復雜多樣,IDC預測到2025年中國每年產生的數據量將增長48.6ZB。

2.晶元:FPGA同時滿足邊緣側對性能、能耗及延遲的要求與集中式雲計算不同,邊緣雲計算所處的物理環境復雜多樣,很多時候空間、溫度、電源系統都不是最佳的狀態。但同時,邊緣側又要求極高的實時性和計算性能,傳統CPU架構難以勝任邊緣雲的需求。英特爾、賽靈思等國際晶元巨頭持續加碼FPGA晶元,並推出支持CPU+FPGA異構計算的硬體平台,底層晶元產業的繁榮將支撐邊緣雲計算在各領域的應用,並不斷迸發出新的活力。

3.5G技術的升級加碼,Wi-Fi在室內場景形成互補,工信部數據顯示,截至2020年中國已開通5G基站超71.8萬個,實現地級以上城市及重點縣市的覆蓋。預計邊緣雲計算也會隨著5G行業應用的普及分階段落地。此外,Wi-Fi技術也在向著更高的吞吐量、更大的覆蓋面積和更低的時延發展,Wi-Fi在室內場景中的優勢使其成為5G的重要補充,兩者將共同助力邊緣雲應用。

4.雲計算:企業上雲常態化,雲原生下沉實現雲邊端一體化,近年來雲原生的熱度持續高漲,包括容器、微服務、DevOps等在內的雲原生技術和理念強調松耦合的架構和簡單便捷的擴展能力,旨在通過統一標准實現不同基礎設施上一致的雲計算體驗。相比於虛擬主機,雲原生更適合邊緣雲計算的場景,可以為雲邊端提供一體化的應用分發與協同管理,解決邊緣側大規模應用交付、運維、管控的問題。

5.「新基建」加碼,工業互聯網等標桿應用引領產業融合,「新基建」是十四五規劃的重點方向,通過優化算力資源結構,將高頻調用、低時延業務需求分配至邊緣數據中心,推動5G承載網路的邊緣組網建設,為將算力和網路下沉到邊緣創造條件。同時,工業互聯網、車聯網、遠程醫療等產業政策明確提及邊緣計算,推動關鍵技術研究、標准體系建設及軟硬體產品研發,促進邊緣雲在典型產業的融合應用。

應用場景

1.視頻加速及 AR/VR 渲染

基於移動邊緣計算的智能視頻加速可以改善移動內容分發效率低下的情況:於無線接入網移動邊緣計算伺服器部署無線分析應用(Radio Analyticsapplication),為視頻伺服器提供無線下行介面的實時吞吐量指標,以助力視頻伺服器做出更為科學的 TCP(傳輸控制協議)擁塞控制決策,並確保應用層編碼能與無線下行鏈路的預估容量相匹配。另外,由於 AR/VR 信息(用戶位置及攝像頭視角)是高度本地化的,對這些信息的實時處理最好是在本地(移動邊緣計算伺服器)進行而不是在雲端集中進行,以最大程度地減小 AR 延遲/時延、提高數據處理的精度。

2.車聯網(智能交通)

將移動邊緣計算技術應用於車聯網之後,可以把車聯網雲下沉至高度分布式部署的移動通信基站。移動邊緣計算應用直接從車載應用(APP)及道路感測器實時接收本地化的數據,然後進行分析,並將結論(危害報警信息)以極低延遲傳送給臨近區域內的其他聯網車輛,整個過程可在毫秒級別時間內完成,使駕駛員可以及時做出決策。

3.工業互聯網

邊緣計算一直與工業控制系統有密切的關系,具備工業互聯網介面的工業控制系統本質上就是一種邊緣計算設備,解決工業控制高實時性要求與互聯網服務質量的不確定性的矛盾。在基礎設施層,通過工業無線和有線網路將現場設備以扁平互聯的方式聯接到工業數據平台中;在數據平台中,根據產線的工藝和工序模型,通過服務組合對現場設備進行動態管理和組合,並與 MES等系統對接。工業 CPS系統能夠支撐生產計劃靈活適應產線資源的變化,舊的製造設備快速替換與新設備上線。

4.IoT(物聯網)網關服務

採取邊緣計算技術,邊緣計算匯聚節點將被部署於接近物聯網終端設備的位置,提供感測數據分析及低延遲響應。其中邊緣計算伺服器的計算能力和存儲能力可為以下5個方面提供服務:業務的匯聚及分發;設備消息的分析;基於上述分析結果的決策邏輯;資料庫登錄;對於終端設備的遠程式控制制和接入控制。

市場規模

預計2025年規模將超500億元,年復合增長率達43.3%,信通院2020年5月調研數據顯示,中國企業中僅有不足5%使用了邊緣計算,但計劃使用的比例高達44.2%。可以見得,雖然邊緣雲計算尚處在發展的萌芽期,但未來成長空間非常廣闊。根據艾瑞咨詢測算,2020年中國邊緣雲計算市場規模為91億元,其中區域、現場、IoT三類邊緣雲市場規模分別達到37億元、38億元及16億元。預計到2025年整體邊緣雲規模將以44.0%的年復合增長率增長至550億元,其中區域邊緣雲將憑借互動直播、vCDN、車聯網等率先成熟的場景實現增速領跑。2030年,中國邊緣雲計算市場規模預計達到接近2500億元,2025年至2030年的年復合增長率相比前五年有所下降,現場邊緣雲中工業互聯網、智慧園區、智慧物流等場景將在這一期間快速走向成熟。

相關上市公司

中興通訊

中興通訊面向運營商提供全場景MEC解決方案,打破傳統封閉的電信網路架構,將移動接入網與互聯網深度融合,在網路邊緣滿足客戶的個性化需求。中興通訊Common Edge邊緣計算解決方案包括MEP能力開放平台、輕量化邊緣雲及面向邊緣的全系列伺服器和邊緣加速硬體,提供通用硬體、專用集成硬體等多種硬體選擇,深度融合OpenStack與Kubernetes,為上層MEC應用提供統一的邊緣雲管理系統,方便運營商因地制宜部署MEC。

網宿 科技

公司的邊緣計算平台以雲主機、容器、函數計算和網路四大平台作為技術底座,在邊緣計算節點上部署邊緣雲主機、邊緣雲容器、邊緣雲函數、SD-WAN、邊緣雲安全等基礎服務,以及內外部的各類應用模塊,結合客戶的業務場景及需求,嘗試進行解決方案的整合和輸出。

初靈信息

公司在 5G、AI 技術高速發展的背景下,持續構建以固移智能連接(5G+Fixed)+數據處理(DPI)+AI 為代表的三大邊緣計算核心能力。公司多年深耕企業(行業)智能連接網路、垂直行業邊緣應用型 DPI(安全、物聯網類)、視頻及其他行業(企業)的智能應用等技術,初步構成「雲邊端」協同的邊緣計算生態。在市場端,公司除聚焦傳統運營商市場外,積極拓展政企行業和大中企業市場,中標多個項目。公司三季度顯示,公司與中國聯通就邊緣計算展開合作,開展了CUNOS在5G環境下的承載能力測試。

引用內容

1. 研報《中國邊緣雲計算行業展望報告》

2. 研報《邊緣計算:算力網路重要環節,產業方興未艾》

風險提示

1.底層相關技術發展緩慢,邊緣計算需求不及預期。

2.5G 進度不達預期。

⑥ 什麼是邊緣伺服器

隨著互聯網及其應用的快速發展,絕大多數企業都建桐鉛立自己的網站,增強對外聯絡,加速業務流程,客戶對網站系統訪問的響應時間,網站內容以及所提供服務的可靠性,即時性等要求也越來越高,使得以單台伺服器來支撐整個網站的系統已無法滿足客戶需求,取而代之的是採用兩到三層架構的一組伺服器.第一層是跟用戶直接發生聯系的前端伺服器,也稱為邊緣伺服器。x0dx0ax0dx0a 邊緣伺服器為用戶提供一個進入網路的通道和與其它伺服器設備通訊的功能,通常邊緣伺服器是一組完成單一功能的伺服器,如防火牆伺服器,高速緩存伺服器,負載均衡伺服器,DNS伺服器等。第二層是中間層,也稱為應用伺服器,包括Web表現伺服器,Web應用伺服器等.第三層是後端資料庫伺服器。x0dx0ax0dx0a 在當今企業龐大的網路中,網路安全一直是管理人員擔心的問題,病毒傳播和黑客入侵已成為企業網路受到外來攻擊的最主要的威脅,網站的安全是網站建設必須考慮的內容,所以所有的網站都或多或少的有網路安全措施&網路防火牆.在訪問量不高的情況下,防火牆功能可以跟Web服務共存在一台伺服器上,但訪問網站的客戶數量的增多枯灶必然增加伺服器的負載,防火牆的運行必然影響訪問速度,因此為了不降低訪問速度甚至提高訪問速度,同時保持或提高網路安全性,就有必要採用專用的防火牆伺服器. 不論一個客戶是如何使用互聯網的, 快速持續地傳送客戶所需的Web內容都是非常重要的。x0dx0ax0dx0a 針對電子商務, 用戶的等待時間會導致收入的損失.研究顯示,在每頁標準的8秒裝載時間之前, 25%的站點訪問者會變得不耐煩而轉向其它站點.下降的生產率會給那些其雇員不願意訪問互聯網上有關工作信息的企業帶來同樣的成本.為了提高網站訪問響應速度和效率,在web伺服器之前增加高速緩存伺服器,把客戶經常訪問的內容放在高速緩存伺服器上,這樣客戶在訪問這些內容時就可以直接在高速緩存伺服器上獲得,降低了網路擁塞,這樣就有更多的帶寬用於其它請求,極大地提高了響應時間. 隨著網站通信量的增加,一台伺服器已不能滿足業務需求,需要不斷增加新的局敗好伺服器,並要跨越這些伺服器分發負載,同時還不能造成站點訪問者的任何中斷.這些訪問應該連接到相同的URL- 不管實際上是由哪一台伺服器來滿足了請求.因此需要有一個專用伺服器動態分配各伺服器之間的訪問流量,這種專用伺服器就是負載均衡伺服器,負載伺服器通過特定的負載均衡技術,將外部客戶請求視同一功能的伺服器組中各伺服器上的負載狀況合理分配到某台伺服器上,籍此大幅提高獲取數據的速度,解決海量並發訪問問題.負載均衡伺服器不僅可以平衡各伺服器的負載,還可以檢測伺服器的使用情況,在某台伺服器發生故障的情況下及時把該伺服器的工作分配到其他伺服器上,保證系統正常運行的高可用性和高可靠性.如果訪問量超出了伺服器的響應能力,只需增加伺服器數目就可平滑升級。

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:167
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:737
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:150
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:367