日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HarmonyOS之数据管理·分布式数据服务的应用

發(fā)布時間:2024/5/21 编程问答 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HarmonyOS之数据管理·分布式数据服务的应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、簡介

① 基本概念
  • 分布式數(shù)據(jù)服務(wù)(Distributed Data Service,DDS) 為應(yīng)用程序提供不同設(shè)備間數(shù)據(jù)庫數(shù)據(jù)分布式的能力。通過調(diào)用分布式數(shù)據(jù)接口,應(yīng)用程序?qū)?shù)據(jù)保存到分布式數(shù)據(jù)庫中。通過結(jié)合帳號、應(yīng)用和數(shù)據(jù)庫三元組,分布式數(shù)據(jù)服務(wù)對屬于不同的應(yīng)用的數(shù)據(jù)進(jìn)行隔離,保證不同應(yīng)用之間的數(shù)據(jù)不能通過分布式數(shù)據(jù)服務(wù)互相訪問。在通過可信認(rèn)證的設(shè)備間,分布式數(shù)據(jù)服務(wù)支持應(yīng)用數(shù)據(jù)相互同步,為用戶提供在多種終端設(shè)備上一致的數(shù)據(jù)訪問體驗(yàn)。
  • KV 數(shù)據(jù)模型:
    • “KV數(shù)據(jù)模型”是“Key-Value數(shù)據(jù)模型”的簡稱,“Key-Value”即“鍵-值”。它是一種 NoSQL 類型數(shù)據(jù)庫,其數(shù)據(jù)以鍵值對的形式進(jìn)行組織、索引和存儲。
    • KV 數(shù)據(jù)模型適合不涉及過多數(shù)據(jù)關(guān)系和業(yè)務(wù)關(guān)系的業(yè)務(wù)數(shù)據(jù)存儲,比 SQL 數(shù)據(jù)庫存儲擁有更好的讀寫性能,同時因在分布式場景中降低了數(shù)據(jù)庫版本兼容和數(shù)據(jù)同步過程中沖突解決的復(fù)雜度而被廣泛使用。分布式數(shù)據(jù)庫也是基于 KV 數(shù)據(jù)模型,對外提供 KV 類型的訪問接口。
  • 分布式數(shù)據(jù)庫事務(wù)性:分布式數(shù)據(jù)庫事務(wù)支持本地事務(wù)(和傳統(tǒng)數(shù)據(jù)庫的事務(wù)概念一致)和同步事務(wù),同步事務(wù)是指在設(shè)備之間同步數(shù)據(jù)時,是以本地事務(wù)為單位進(jìn)行同步,一次本地事務(wù)的修改要么都同步成功,要么都同步失敗。
  • 分布式數(shù)據(jù)庫一致性:在分布式場景中一般會涉及多個設(shè)備,組網(wǎng)內(nèi)設(shè)備之間看到的數(shù)據(jù)是否一致稱為分布式數(shù)據(jù)庫的一致性。分布式數(shù)據(jù)庫一致性可以分為強(qiáng)一致性、弱一致性和最終一致性。
    • 強(qiáng)一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備對該數(shù)據(jù)的讀取操作都將得到更新后的值。
    • 弱一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能能讀取到本次更新數(shù)據(jù),也可能讀取不到,不能保證在多長時間后每個設(shè)備的數(shù)據(jù)一定是一致的。
    • 最終一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能讀取不到本次更新數(shù)據(jù),但在某個時間窗口之后組網(wǎng)內(nèi)設(shè)備的數(shù)據(jù)能夠達(dá)到一致狀態(tài)。
    • 強(qiáng)一致性對分布式數(shù)據(jù)的管理要求非常高,在服務(wù)器的分布式場景可能會遇到。因?yàn)橐苿咏K端設(shè)備的不常在線、以及無中心的特性,分布式數(shù)據(jù)服務(wù)不支持強(qiáng)一致,只支持最終一致性。
  • 分布式數(shù)據(jù)庫同步
    • 底層通信組件完成設(shè)備發(fā)現(xiàn)和認(rèn)證,會通知上層應(yīng)用程序(包括分布式數(shù)據(jù)服務(wù))設(shè)備上線。收到設(shè)備上線的消息后分布式數(shù)據(jù)服務(wù)可以在兩個設(shè)備之間建立加密的數(shù)據(jù)傳輸通道,利用該通道在兩個設(shè)備之間進(jìn)行數(shù)據(jù)同步。
    • 分布式數(shù)據(jù)服務(wù)提供了兩種同步模式:手動同步和自動同步模式。手動同步模式完全由應(yīng)用程序調(diào)用接口來觸發(fā),并且支持指定同步的設(shè)備列表和同步模式(PULL、 PUSH 和 PULL_PUSH 三種同步模式)。自動同步模式由分布式數(shù)據(jù)庫來完成數(shù)據(jù)同步(同步時機(jī)包括設(shè)備上線、應(yīng)用程序修改數(shù)據(jù)等),業(yè)務(wù)不感知同步操作。
  • 單版本分布式數(shù)據(jù)庫:單版本是指數(shù)據(jù)在本地保存是以單個 KV 條目為單位的方式保存,對每個 Key 最多只保存一個條目項,當(dāng)數(shù)據(jù)在本地被用戶修改時,不管它是否已經(jīng)被同步出去,均直接在這個條目上進(jìn)行修改。同步也以此為基礎(chǔ),按照它在本地被寫入或更改的順序?qū)?dāng)前最新一次修改逐條同步至遠(yuǎn)端設(shè)備。
  • 設(shè)備協(xié)同分布式數(shù)據(jù)庫:設(shè)備協(xié)同分布式數(shù)據(jù)庫建立在單版本分布式數(shù)據(jù)庫之上,對應(yīng)用程序存入的 KV 數(shù)據(jù)中的 Key 前面拼接了本設(shè)備的 DeviceID 標(biāo)識符,這樣能保證每個設(shè)備產(chǎn)生的數(shù)據(jù)嚴(yán)格隔離,底層按照設(shè)備的維度管理這些數(shù)據(jù),設(shè)備協(xié)同分布式數(shù)據(jù)庫支持以設(shè)備的維度查詢分布式數(shù)據(jù),但是不支持修改遠(yuǎn)端設(shè)備同步過來的數(shù)據(jù)。
  • 分布式數(shù)據(jù)庫沖突解決策略:分布式數(shù)據(jù)庫多設(shè)備提交沖突場景,在給提交沖突做合并的過程中,如果多個設(shè)備同時修改了同一數(shù)據(jù),則稱這種場景為數(shù)據(jù)沖突。數(shù)據(jù)沖突采用默認(rèn)沖突解決策略,基于提交時間戳,取時間戳較大的提交數(shù)據(jù),當(dāng)前不支持定制沖突解決策略。
  • 數(shù)據(jù)庫 Schema 化管理與謂詞查詢:單版本數(shù)據(jù)庫支持在創(chuàng)建和打開數(shù)據(jù)庫時指定Schema,數(shù)據(jù)庫根據(jù) Schema 定義感知 KV 記錄的 Value 格式,以實(shí)現(xiàn)對 Value 值結(jié)構(gòu)的檢查,并基于 Value 中的字段實(shí)現(xiàn)索引建立和支持謂詞查詢。
  • 分布式數(shù)據(jù)庫備份能力:提供分布式數(shù)據(jù)庫備份能力,業(yè)務(wù)通過設(shè)置 backup 屬性為 true,可以觸發(fā)分布式數(shù)據(jù)服務(wù)每日備份。當(dāng)分布式數(shù)據(jù)庫發(fā)生損壞,分布式數(shù)據(jù)服務(wù)會刪除損壞數(shù)據(jù)庫,并且從備份數(shù)據(jù)庫中恢復(fù)上次備份的數(shù)據(jù)。如果不存在備份數(shù)據(jù)庫,則創(chuàng)建一個新的數(shù)據(jù)庫。同時支持加密數(shù)據(jù)庫的備份能力。
② 運(yùn)作機(jī)制
  • 分布式數(shù)據(jù)服務(wù)支撐 HarmonyOS 系統(tǒng)上應(yīng)用程序數(shù)據(jù)庫數(shù)據(jù)分布式管理,支持?jǐn)?shù)據(jù)在相同帳號的多端設(shè)備之間相互同步,為用戶在多端設(shè)備上提供一致的用戶體驗(yàn),分布式數(shù)據(jù)服務(wù)包含五部分:
    • 服務(wù)接口:分布式數(shù)據(jù)服務(wù)提供專門的數(shù)據(jù)庫創(chuàng)建、數(shù)據(jù)訪問、數(shù)據(jù)訂閱等接口給應(yīng)用程序調(diào)用,接口支持 KV 數(shù)據(jù)模型,支持常用的數(shù)據(jù)類型,同時確保接口的兼容性、易用性和可發(fā)布性。
    • 服務(wù)組件:服務(wù)組件負(fù)責(zé)服務(wù)內(nèi)元數(shù)據(jù)管理、權(quán)限管理、加密管理、備份和恢復(fù)管理以及多用戶管理等、同時負(fù)責(zé)初始化底層分布式 DB 的存儲組件、同步組件和通信適配層。
    • 存儲組件:存儲組件負(fù)責(zé)數(shù)據(jù)的訪問、數(shù)據(jù)的縮減、事務(wù)、快照、數(shù)據(jù)庫加密,以及數(shù)據(jù)合并和沖突解決等特性。
    • 同步組件:同步組件連結(jié)了存儲組件與通信組件,其目標(biāo)是保持在線設(shè)備間的數(shù)據(jù)庫數(shù)據(jù)一致性,包括將本地產(chǎn)生的未同步數(shù)據(jù)同步給其他設(shè)備,接收來自其他設(shè)備發(fā)送過來的數(shù)據(jù),并合并到本地設(shè)備中。
    • 通信適配層:通信適配層負(fù)責(zé)調(diào)用底層公共通信層的接口完成通信管道的創(chuàng)建、連接,接收設(shè)備上下線消息,維護(hù)已連接和斷開設(shè)備列表的元數(shù)據(jù),同時將設(shè)備上下線信息發(fā)送給上層同步組件,同步組件維護(hù)連接的設(shè)備列表,同步數(shù)據(jù)時根據(jù)該列表,調(diào)用通信適配層的接口將數(shù)據(jù)封裝并發(fā)送給連接的設(shè)備。
  • 應(yīng)用程序通過調(diào)用分布式數(shù)據(jù)服務(wù)接口實(shí)現(xiàn)分布式數(shù)據(jù)庫創(chuàng)建、訪問、訂閱功能,服務(wù)接口通過操作服務(wù)組件提供的能力,將數(shù)據(jù)存儲至存儲組件,存儲組件調(diào)用同步組件實(shí)現(xiàn)將數(shù)據(jù)同步,同步組件使用通信適配層將數(shù)據(jù)同步至遠(yuǎn)端設(shè)備,遠(yuǎn)端設(shè)備通過同步組件接收數(shù)據(jù),并更新至本端存儲組件,通過服務(wù)接口提供給應(yīng)用程序使用。
  • 數(shù)據(jù)分布式運(yùn)作示意圖如下:

③ 使用限制
  • 應(yīng)用程序如需使用分布式數(shù)據(jù)服務(wù)完整功能,需要申請 ohos.permission.DISTRIBUTED_DATASYNC 權(quán)限。
  • 分布式數(shù)據(jù)服務(wù)的數(shù)據(jù)模型僅支持 KV 數(shù)據(jù)模型,不支持外鍵、觸發(fā)器等關(guān)系型數(shù)據(jù)庫中的技術(shù)點(diǎn)。
  • 分布式數(shù)據(jù)服務(wù)支持的 KV 數(shù)據(jù)模型規(guī)格:
    • 設(shè)備協(xié)同數(shù)據(jù)庫,Key 最大支持 896Byte,Value 最大支持 4MB - 1Byte。
    • 單版本數(shù)據(jù)庫,Key 最大支持 1KB,Value 最大支持 4MB - 1Byte。
    • 每個應(yīng)用程序最多支持同時打開 16 個 KvStore。
  • 由于支持的存儲類型不完全相同等原因,分布式數(shù)據(jù)服務(wù)無法完全代替業(yè)務(wù)沙箱內(nèi)數(shù)據(jù)庫數(shù)據(jù)的存儲功能,開發(fā)人員需要確定要做分布式同步的數(shù)據(jù),把這些數(shù)據(jù)保存到分布式數(shù)據(jù)服務(wù)中。
  • 分布式數(shù)據(jù)服務(wù)當(dāng)前不支持應(yīng)用程序自定義沖突解決策略。
  • 分布式數(shù)據(jù)服務(wù)當(dāng)前流控機(jī)制針對 KvStore 的接口 1 秒最大訪問 1000 次,1 分鐘最大訪問 10000 次。KvManager 的接口 1 秒最大訪問 50 次,1 分鐘最大訪問 500 次。
  • 如果需要在分布式數(shù)據(jù)庫事件回調(diào)的方法里修改 UI 組件,建議使用 UITaskDispatcher 機(jī)制。
④ 應(yīng)用場景
  • 分布式數(shù)據(jù)服務(wù)主要實(shí)現(xiàn)對用戶設(shè)備中應(yīng)用程序的數(shù)據(jù)內(nèi)容的分布式同步。
  • 當(dāng)設(shè)備 1 上的應(yīng)用 A 在分布式數(shù)據(jù)庫中增、刪、改數(shù)據(jù)后,設(shè)備 2 上的應(yīng)用 A 也可以獲取到該數(shù)據(jù)庫變化。可在分布式圖庫、信息、通訊錄、文件管理器等場景中使用。

二、分布式數(shù)據(jù)服務(wù) API

  • HarmonyOS 系統(tǒng)中的分布式數(shù)據(jù)服務(wù)模塊為開發(fā)者提供下面幾種功能:
功能分類接口名稱描述分布式數(shù)據(jù)庫創(chuàng)建、打開、關(guān)閉和刪除isCreateIfMissing()檢查數(shù)據(jù)庫不存在時是否創(chuàng)建setCreateIfMissing(boolean isCreateIfMissing)設(shè)置數(shù)據(jù)庫不存在時是否創(chuàng)建isEncrypt()獲取數(shù)據(jù)庫是否加密setEncrypt(boolean isEncrypt)設(shè)置數(shù)據(jù)庫是否加密getStoreType()獲取分布式數(shù)據(jù)庫的類型setStoreType(KvStoreType storeType)設(shè)置分布式數(shù)據(jù)庫的類型KvStoreType.DEVICE_COLLABORATION設(shè)備協(xié)同分布式數(shù)據(jù)庫類型KvStoreType.SINGLE_VERSION單版本分布式數(shù)據(jù)庫類型getKvStore(Options options, String storeId)根據(jù)Options配置創(chuàng)建和打開標(biāo)識符為storeId的分布式數(shù)據(jù)庫closeKvStore(KvStore kvStore)關(guān)閉分布式數(shù)據(jù)庫deleteKvStore(String storeId)刪除分布式數(shù)據(jù)庫分布式數(shù)據(jù)增、刪、改、查getStoreId()根據(jù)配置構(gòu)造帳號鍵值數(shù)據(jù)庫管理類實(shí)例putBoolean(String key, boolean value)
putInt(String key, int value)
putFloat(String key, float value)
putDouble(String key, double value)
putString(String key, String value)
putByteArray(String key, byte[] value)
putBatch(List entries)插入和更新數(shù)據(jù)delete(String key)
deleteBatch(List keys)刪除數(shù)據(jù)getInt(String key)
getFloat(String key)
getDouble(String key)
getString(String key)
getByteArray(String key)
getEntries(String keyPrefix)查詢數(shù)據(jù)分布式數(shù)據(jù)謂詞查詢select()
reset()
equalTo(String field, int value)
equalTo(String field, long value)
equalTo(String field, double value)
equalTo(String field, String value)
equalTo(String field, boolean value)
notEqualTo(String field, int value)
notEqualTog(String field, long value)
notEqualTo(String field, boolean value)
notEqualTo(String field, String value)
notEqualTo(String field, double value)
greaterThan(String field, int value)
greaterThan(String field, long value)
greaterThan(String field, double value)
greaterThan(String field, String value)
lessThan(String field, int value)
lessThan(String field, long value)
lessThan(String field, double value)
lessThan(String field, String value)
greaterThanOrEqualTo(String field, int value)
greaterThanOrEqualTo(String field, long value)
greaterThanOrEqualTo(String field, double value)
greaterThanOrEqualTo(String field, String value)
lessThanOrEqualTo(String field, int value)
lessThanOrEqualTo(String field, long value)
lessThanOrEqualTo(String field, double value)
lessThanOrEqualTo(String field, String value)
isNull(String field)
orderByDesc(String field)
orderByAsc(String field)
limit(int number, int offset)
like(String field, String value)
unlike(String field, String value)
inInt(String field, List valueList)
inLong(String field, List valueList)
inDouble(String field, List valueList)
inString(String field, List valueList)
notInInt(String field, List valueList)
notInLong(String field, List valueList)
notInDouble(String field, List valueList)
notInString(String field, List valueList)
and()
or()對于Schema數(shù)據(jù)庫謂詞查詢數(shù)據(jù)訂閱分布式數(shù)據(jù)變化subscribe(SubscribeType subscribeType, KvStoreObserver observer)訂閱數(shù)據(jù)庫中數(shù)據(jù)的變化分布式數(shù)據(jù)同步sync(List deviceIdList, SyncMode mode)在手動模式下,觸發(fā)數(shù)據(jù)庫同步

三、分布式數(shù)據(jù)服務(wù)使用流程

① 根據(jù)配置構(gòu)造分布式數(shù)據(jù)庫管理類實(shí)例
  • 根據(jù)應(yīng)用上下文創(chuàng)建 KvManagerConfig 對象。
  • 創(chuàng)建分布式數(shù)據(jù)庫管理器實(shí)例。
  • 以下為創(chuàng)建分布式數(shù)據(jù)庫管理器的代碼示例:
Context context;...KvManagerConfig config = new KvManagerConfig(context);KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config);
② 獲取/創(chuàng)建單版本分布式數(shù)據(jù)庫
  • 聲明需要創(chuàng)建的單版本分布式數(shù)據(jù)庫 ID 描述。
  • 創(chuàng)建單版本分布式數(shù)據(jù)庫,跨設(shè)備自動同步數(shù)據(jù)庫功能默認(rèn)開啟。
  • 以下為創(chuàng)建單版本分布式數(shù)據(jù)庫的代碼示例:
Options CREATE = new Options();CREATE.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);String storeID = "testApp";SingleKvStore singleKvStore = kvManager.getKvStore(CREATE, storeID);
③ 訂閱分布式數(shù)據(jù)變化
  • 客戶端需要實(shí)現(xiàn) KvStoreObserver 接口。
  • 構(gòu)造并注冊 KvStoreObserver 實(shí)例。
  • 以下為訂閱單版本分布式數(shù)據(jù)庫所有(本地及遠(yuǎn)端)數(shù)據(jù)變化通知的代碼示例:
class KvStoreObserverClient implements KvStoreObserver {@Overridepublic void onChange(ChangeNotification notification) {List<Entry> insertEntries = notification.getInsertEntries();List<Entry> updateEntries = notification.getUpdateEntries();List<Entry> deleteEntries = notification.getDeleteEntries();}}KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);
④ 將數(shù)據(jù)寫入單版本分布式數(shù)據(jù)庫
  • 構(gòu)造需要寫入單版本分布式數(shù)據(jù)庫的 Key(鍵)和 Value(值)。
  • 將鍵值數(shù)據(jù)寫入單版本分布式數(shù)據(jù)庫。
  • 以下為將字符串類型鍵值數(shù)據(jù)寫入單版本分布式數(shù)據(jù)庫的代碼示例:
String key = "todayWeather";String value = "Sunny";singleKvStore.putString(key, value);
⑤ 查詢單版本分布式數(shù)據(jù)庫數(shù)據(jù)
  • 構(gòu)造需要從單版本分布式數(shù)據(jù)庫快照中查詢的 Key(鍵)。
  • 從單版本分布式數(shù)據(jù)庫快照中獲取數(shù)據(jù)。
  • 以下為從單版本分布式數(shù)據(jù)庫中查詢字符串類型數(shù)據(jù)的代碼示例:
String key = "todayWeather";String value = singleKvStore.getString(key);
⑥ 同步數(shù)據(jù)到其他設(shè)備
  • 獲取已連接的設(shè)備列表。
  • 選擇同步方式進(jìn)行數(shù)據(jù)同步。
  • 以下為單版本分布式數(shù)據(jù)庫進(jìn)行數(shù)據(jù)同步的代碼示例,其中同步方式為 PUSH_ONLY:
List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);List<String> deviceIdList = new ArrayList<>();for (DeviceInfo deviceInfo : deviceInfoList) {deviceIdList.add(deviceInfo.getId());}singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY);
⑦ 關(guān)閉單版本分布式數(shù)據(jù)庫
  • 以下為關(guān)閉單版本分布式數(shù)據(jù)庫的代碼示例:
kvManager.closeKvStore(singleKvStore);
⑧ 刪除單版本分布式數(shù)據(jù)庫
  • 以下為刪除單版本分布式數(shù)據(jù)庫的代碼示例:
kvManager.deleteKvStore(storeID);

總結(jié)

以上是生活随笔為你收集整理的HarmonyOS之数据管理·分布式数据服务的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。