菜鳥(niǎo)實(shí)時(shí)數(shù)倉(cāng)技術(shù)架構(gòu)演進(jìn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
分享嘉賓:賈元喬 菜鳥(niǎo) 高級(jí)數(shù)據(jù)技術(shù)專(zhuān)家
內(nèi)容來(lái)源:Flink Forward ASIA
出品平臺(tái):DataFunTalk
導(dǎo)讀:在開(kāi)源盛世的今天,實(shí)時(shí)數(shù)倉(cāng)的建設(shè)已經(jīng)有了較為成熟的方案,技術(shù)選型上也都各有優(yōu)劣。菜鳥(niǎo)作為物流供應(yīng)鏈的主力軍,時(shí)效要求已經(jīng)成為了核心競(jìng)爭(zhēng)力,離線數(shù)倉(cāng)已不能滿(mǎn)足發(fā)展的需要,在日益增長(zhǎng)的訂單和時(shí)效挑戰(zhàn)下,菜鳥(niǎo)技術(shù)架構(gòu)也在不斷發(fā)展和完善,如何更準(zhǔn)更高效的完成開(kāi)發(fā)和維護(hù),變得格外重要。本文將為大家分享菜鳥(niǎo)技術(shù)團(tuán)隊(duì)在建設(shè)實(shí)時(shí)數(shù)倉(cāng)技術(shù)架構(gòu)中的一些經(jīng)驗(yàn)和探索,希望能給大家?guī)?lái)啟發(fā)。
本文主要包括以下內(nèi)容:
-
以前的實(shí)時(shí)數(shù)據(jù)技術(shù)架構(gòu)
-
數(shù)據(jù)模型、計(jì)算引擎、數(shù)據(jù)服務(wù)的升級(jí)
-
其他技術(shù)工具的探索和創(chuàng)新
-
未來(lái)發(fā)展與思考
數(shù)據(jù)模型:
-
業(yè)務(wù)線內(nèi)部模型層次混亂,數(shù)據(jù)使用成本特別高
-
需求驅(qū)動(dòng)的煙囪式開(kāi)發(fā),完全沒(méi)有復(fù)用的可能性,計(jì)算成本居高不下
-
各業(yè)務(wù)線橫向或者縱向的交叉,導(dǎo)致開(kāi)發(fā)過(guò)程中數(shù)據(jù)一致性偏差較大
-
縱向的數(shù)據(jù)模型,導(dǎo)致 BI 使用時(shí)比較困難
實(shí)時(shí)計(jì)算:
-
我們之前使用阿里云的 JStorm 和 Spark Streaming 進(jìn)行開(kāi)發(fā),這兩部分能滿(mǎn)足大部分的實(shí)時(shí)數(shù)據(jù)開(kāi)發(fā),但是應(yīng)用到物流供應(yīng)鏈場(chǎng)景當(dāng)中,實(shí)現(xiàn)起來(lái)并不簡(jiǎn)單,甚至無(wú)法實(shí)現(xiàn)
-
很難同時(shí)兼顧功能、性能、穩(wěn)定性以及快速故障恢復(fù)能力
數(shù)據(jù)服務(wù):
-
開(kāi)發(fā)過(guò)程中,實(shí)時(shí)數(shù)據(jù)下沉到 MySQL,HBase 等數(shù)據(jù)庫(kù)中,查詢(xún)和保障方面不靈活
-
BI 權(quán)限控制和全鏈路保障不可靠
1. 模型分層
參考離線數(shù)倉(cāng),將實(shí)時(shí)數(shù)據(jù)進(jìn)行分層,第一層是數(shù)據(jù)采集,將從 MySQL 等數(shù)據(jù)庫(kù)中采集到的數(shù)據(jù)放到 TT 消息中間件中,然后基于 TT 消息中間件和 HBase 的各種維表關(guān)聯(lián)產(chǎn)生事實(shí)明細(xì)寬表,再將生成的數(shù)據(jù)寫(xiě)到 TT 消息中間件中。通過(guò)訂閱這個(gè)消息產(chǎn)生輕度匯總層和高度匯總層兩層。輕度匯總層主要按照多個(gè)維度沉淀數(shù)據(jù),高度匯總層主要用于大屏場(chǎng)景。
2. 預(yù)置分流
左邊公共數(shù)據(jù)中間層是將所有業(yè)務(wù)線整合在一起,然后進(jìn)行分層。右邊的業(yè)務(wù)數(shù)據(jù)中間層是各個(gè)業(yè)務(wù)基于橫向的公共數(shù)據(jù)中間層的基礎(chǔ)上,去分流自己業(yè)務(wù)的數(shù)據(jù)中間層,然后根據(jù)這些實(shí)時(shí)的消息,個(gè)性化的產(chǎn)出自己業(yè)務(wù)的數(shù)據(jù)中間層。比如不同的訂單,可以橫向分流成進(jìn)口供應(yīng)鏈和出口供應(yīng)鏈。這樣實(shí)現(xiàn)了上游只需要一個(gè)公共分流作業(yè)完成,節(jié)約了計(jì)算資源。
3. 菜鳥(niǎo)供應(yīng)鏈實(shí)時(shí)數(shù)據(jù)模型
左邊是公共的數(shù)據(jù)中間層,里面包含整個(gè)大盤(pán)的訂單數(shù)據(jù),大盤(pán)的物流詳情,匯總的公共粒度數(shù)據(jù)等,在這個(gè)基礎(chǔ)之上做了個(gè)分流任務(wù),然后從物流訂單,物流詳情等里面拆分出我們自己個(gè)性化的業(yè)務(wù),比如國(guó)內(nèi)的供應(yīng)鏈,進(jìn)口的供應(yīng)鏈以及出口的供應(yīng)鏈等。經(jīng)過(guò)這些步操作之后,可以輕易的區(qū)分哪些表是大屏的數(shù)據(jù),哪些表是統(tǒng)計(jì)分析的數(shù)據(jù),在數(shù)據(jù)易用性方面有了很大的提升。
一開(kāi)始,我們采用了 JStorm 和 Spark Streaming 進(jìn)行實(shí)時(shí)開(kāi)發(fā)。這兩個(gè)計(jì)算引擎在滿(mǎn)足大部分的場(chǎng)景時(shí),沒(méi)有特別大的問(wèn)題,但是在應(yīng)用到供應(yīng)鏈或者物流場(chǎng)景時(shí),不是那么簡(jiǎn)單。所以我們?cè)?7年切換到了 Flink 上,F(xiàn)link 提供了一些很實(shí)用的功能,而這些功能在一些供應(yīng)鏈的場(chǎng)景下比較適用。
首先是內(nèi)部 Flink 支持一套完整的 SQL 寫(xiě)法,提高了開(kāi)發(fā)效率。第二點(diǎn)是 Flink 內(nèi)置的基于 State 的 retraction 機(jī)制,很好的支持了供應(yīng)鏈當(dāng)中的取消訂單,換配等這種操作,而且非常簡(jiǎn)單。Flink 的 CEP 功能,方便的實(shí)現(xiàn)了超時(shí)統(tǒng)計(jì)的功能,還有目前正在推的 AtoScaling 方案,比如數(shù)據(jù)傾斜,資源配置等。另外一點(diǎn)是 Flink 在批流混合問(wèn)題的處理,有很好的支持。
1. 神奇的 Retraction
左邊有4列數(shù)據(jù),第1列數(shù)據(jù)是物流訂單,第2列的數(shù)據(jù)是物流訂單的創(chuàng)建時(shí)間,第3列數(shù)據(jù)是這個(gè)訂單是不是被取消,第4個(gè)數(shù)據(jù)是計(jì)劃配送公司,就是訂單分配給哪個(gè)配送公司。這個(gè)業(yè)務(wù)需求看上去非常簡(jiǎn)單,其實(shí)就是統(tǒng)計(jì)每個(gè)配送公司計(jì)劃履行的有效單量有多少。但是有兩個(gè)點(diǎn)需要注意一下,第一點(diǎn),有一個(gè)訂單 LP3,在開(kāi)始的時(shí)候是有效的,然后在最后一條時(shí)取消了,就變成了一個(gè)無(wú)效訂單,但這一條訂單不應(yīng)該統(tǒng)計(jì)在內(nèi),因?yàn)闃I(yè)務(wù)需求統(tǒng)計(jì)的是有效訂單。第二點(diǎn),配送公司的轉(zhuǎn)變,LP1 這個(gè)訂單在一分鐘時(shí)是 tmsA 來(lái)配送,后來(lái)變成了 tmsB,再過(guò)了一段時(shí)間,這個(gè)訂單又變成 tmsC 配送。如果基于 Storm 增量計(jì)算,得出的結(jié)果顯然是錯(cuò)誤的,這時(shí)要按照最后一次消息給我們傳過(guò)來(lái)的數(shù)據(jù)統(tǒng)計(jì)。這樣的場(chǎng)景在 Flink 中是如何實(shí)現(xiàn)的呢?Flink 也提供了一些非常好的回撤機(jī)制。
第一段代碼使用 Flink 的 last_value 函數(shù),獲取這個(gè)訂單最后一個(gè)消息非空的值,在這個(gè)基礎(chǔ)上進(jìn)行匯總。一旦 last_value 中字段發(fā)生變化,都會(huì)觸發(fā)撤回機(jī)制,得到最后正確的值。
2. 實(shí)時(shí)超時(shí)統(tǒng)計(jì)
這個(gè)案例發(fā)生在菜鳥(niǎo)實(shí)際物流場(chǎng)景中,第1個(gè)表格是一個(gè)日志的時(shí)間,第2個(gè)是物流訂單,第3個(gè)字段是出庫(kù)時(shí)間,最后一個(gè)字段是攬收時(shí)間,現(xiàn)在需要統(tǒng)計(jì)的是出庫(kù)超6個(gè)小時(shí)沒(méi)有被攬收的單量。這里涉及到全鏈路時(shí)效問(wèn)題,全鏈路時(shí)效指從下單到倉(cāng)庫(kù)發(fā)貨到快遞攬收到簽收的整體時(shí)間,這個(gè)場(chǎng)景放在離線中是非常容易實(shí)現(xiàn)的,但是放到實(shí)時(shí)中來(lái)不是很簡(jiǎn)單, 比如 LP1 在00:05分的時(shí)候沒(méi)有攬收,現(xiàn)在如果當(dāng)下時(shí)刻是12點(diǎn)的話,也沒(méi)有攬收,理論上應(yīng)該計(jì)算這個(gè)訂單,但是沒(méi)有攬收就意味著沒(méi)有消息進(jìn)來(lái),沒(méi)有消息進(jìn)來(lái)我們又要統(tǒng)計(jì),其實(shí)我們用 Flink 是沒(méi)法統(tǒng)計(jì)的,那這種情況我們?cè)趺刺幚砟??我們的解決方案是如果沒(méi)有這條消息我們用 Flink 來(lái)制造這條消息。這種超時(shí)消息統(tǒng)計(jì)我們想到了幾種方法:
包括引入消息中間件 ( kafka ) 和 Flink 的 CEP。最終選擇了 Flink 的 Timer Service,因?yàn)檫@種消息不是特別多,中間件又特別重。而 CEP 會(huì)丟掉一些回傳不準(zhǔn)確的消息,導(dǎo)致數(shù)據(jù)計(jì)算不準(zhǔn)確,針對(duì)這些情況,我們?cè)谡{(diào)研之后選擇了 Timer Service,同時(shí)我們對(duì)它底層的 ProcessElement 和 OnTimer 兩個(gè)方法進(jìn)行了改寫(xiě)。ProcessElement 告訴 Flink 存儲(chǔ)什么樣的數(shù)據(jù),然后啟動(dòng)針對(duì)每一個(gè)超時(shí)的事件的 Timer Service。OnTimer 方法會(huì)在每個(gè)超時(shí)的時(shí)刻讀這個(gè)超時(shí)的消息,并把這個(gè)超時(shí)的消息下發(fā)下來(lái)?;谙掠胃A鞯年P(guān)聯(lián)操作之后就能計(jì)算超時(shí)消息的單量。
先構(gòu)造一個(gè) process funcation 到 state 存數(shù)據(jù),并為每一個(gè)超時(shí)的數(shù)據(jù)注冊(cè)一個(gè) Timer Service。然后執(zhí)行 OnTimer 這個(gè)方法,讀取并把這個(gè)超時(shí)的消息下發(fā)下去。
3. 從手動(dòng)優(yōu)化到智能優(yōu)化
關(guān)于數(shù)據(jù)傾斜的問(wèn)題,左圖顯示在 map 階段 shuffer 之后數(shù)據(jù)傾斜到了紅色的 Agg 上,這時(shí)就出現(xiàn)熱點(diǎn)了,原來(lái)我們是對(duì)這個(gè) lg_order_code 進(jìn)行 hash 取值操作,然后再針對(duì)散列的結(jié)果進(jìn)行二次的聚合,這樣操作后在一定程度上減輕了數(shù)據(jù)的傾斜。在最近的 Flink 的版本中已經(jīng)實(shí)現(xiàn)了規(guī)避數(shù)據(jù)傾斜的方法,我們內(nèi)部的 Blink 版本,有幾個(gè)功能去優(yōu)化熱點(diǎn)的問(wèn)題,第一個(gè)就是 MiniBatch,之前來(lái)一條數(shù)據(jù),我們就去 State 里面查詢(xún)?nèi)缓髮?xiě)入,MiniBatch 的作用是把所有的數(shù)據(jù)先聚合一次,類(lèi)似一個(gè)微批處理,然后再把這個(gè)數(shù)據(jù)寫(xiě)到 State 里面,或者在從 State 里面查出來(lái),這樣可以大大的減輕對(duì) State 查詢(xún)的壓力。第二個(gè)辦法就是 LocalGlobal,類(lèi)似于在 hive 中 map 階段中的 combiner,通過(guò)設(shè)置這個(gè)參數(shù)可以在讀的時(shí)候先聚合。第三個(gè)辦法是 PartialFinal,類(lèi)似于散列的方式,分兩次聚合,相當(dāng)于 hive 中兩個(gè)入 reduce 操作。通過(guò)設(shè)置這三個(gè)參數(shù),可以在大部分場(chǎng)景規(guī)避數(shù)據(jù)傾斜的問(wèn)題。
智能化功能支持的另一個(gè)場(chǎng)景是資源配置。在進(jìn)行實(shí)時(shí) ETL 過(guò)程中,首先要定義 DDL,然后編寫(xiě) SQL,之后需要進(jìn)行資源配置。針對(duì)資源配置問(wèn)題,菜鳥(niǎo)之前的方案是對(duì)每一個(gè)節(jié)點(diǎn)進(jìn)行配置,包括并發(fā)量、是否會(huì)涉及消息亂序操作、CPU、內(nèi)存等,一方面配置過(guò)程非常復(fù)雜,另一方面無(wú)法提前預(yù)知某些節(jié)點(diǎn)的資源消耗量。Flink 目前提供了較好的優(yōu)化方案來(lái)解決該問(wèn)題:
-
大促場(chǎng)景:該場(chǎng)景下,菜鳥(niǎo)會(huì)提前預(yù)估該場(chǎng)景下的 QPS,會(huì)將其配置到作業(yè)中并重啟。重啟后 Flink 會(huì)自動(dòng)進(jìn)行壓測(cè),測(cè)試該 QPS 每個(gè)節(jié)點(diǎn)所需要的資源。
-
日常場(chǎng)景:日常場(chǎng)景的 QPS 峰值可能遠(yuǎn)遠(yuǎn)小于大促場(chǎng)景,此時(shí)逐一配置 QPS 依然會(huì)很復(fù)雜。為此 Flink 提供了 AutoScaling 智能調(diào)優(yōu)的功能,除了可以支持大促場(chǎng)景下提前設(shè)置 QPS 并壓測(cè)獲取所需資源,還可以根據(jù)上游下發(fā)的 QPS 的數(shù)據(jù)自動(dòng)預(yù)估需要的資源。大大簡(jiǎn)化了資源配置的復(fù)雜度,使得開(kāi)發(fā)人員可以更好地關(guān)注業(yè)務(wù)邏輯本身的開(kāi)發(fā)。
在開(kāi)發(fā)的過(guò)程中常用的數(shù)據(jù)庫(kù)比較少,因此統(tǒng)一數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn)是有必要的。我們開(kāi)發(fā)的叫天工,它可以提供整個(gè)數(shù)據(jù)庫(kù)統(tǒng)一的接入標(biāo)準(zhǔn),提供統(tǒng)一的權(quán)限控制,提供統(tǒng)一的全鏈路的保障。這個(gè)中間件將 SQL 作為 DSL,并且提供一些標(biāo)準(zhǔn)化的 HSF 的服務(wù)方式。作為菜鳥(niǎo)數(shù)據(jù)服務(wù)的踐行者,天工也提供了一些非常貼近業(yè)務(wù)的,非常實(shí)用的功能,下面是幾個(gè)案例。
1. NoSQL To TgSQL
對(duì)于 HBase 這種 NoSQL 數(shù)據(jù)庫(kù),BI 或者運(yùn)營(yíng)來(lái)說(shuō)用代碼來(lái)實(shí)現(xiàn)需求是比較困難的,所以開(kāi)發(fā)天工的時(shí)候第一件事情就是把一些 NoSQL 轉(zhuǎn)化成天工 SQL,包括我前面說(shuō)的一個(gè)人員的表轉(zhuǎn)化成一個(gè)二維表,這里是邏輯的轉(zhuǎn)換,不是實(shí)際物理上的轉(zhuǎn)化,大家通過(guò)運(yùn)行這個(gè) SQL,后臺(tái)的中間件會(huì)自動(dòng)轉(zhuǎn)化成查詢(xún)的語(yǔ)言,去查詢(xún)后臺(tái)的數(shù)據(jù)。
2. 跨源數(shù)據(jù)轉(zhuǎn)化
在開(kāi)發(fā)數(shù)據(jù)產(chǎn)品的過(guò)程中,我們發(fā)現(xiàn)實(shí)時(shí)跟離線有時(shí)候分不開(kāi),比如有一個(gè)比較大的場(chǎng)景,需要統(tǒng)計(jì)實(shí)時(shí) KPI 的完成率,它的分子是實(shí)際單量,分母是已經(jīng)計(jì)劃好的單量,數(shù)據(jù)源是來(lái)自?xún)蓚€(gè)部分,第一個(gè)部分來(lái)自已經(jīng)做好的 KPI 的一個(gè)表,然后第二部分是一個(gè)實(shí)時(shí)計(jì)算出來(lái)的表。對(duì)于這種場(chǎng)景,之前我們是用 Java 去計(jì)算這兩部分?jǐn)?shù)據(jù),然后在前端去運(yùn)算,比較麻煩?,F(xiàn)在通過(guò)天工 SQL 直接取這兩部分?jǐn)?shù)據(jù)關(guān)聯(lián),做到跨源數(shù)據(jù)的操作。
3. 服務(wù)保障升級(jí)
原來(lái)在整個(gè)服務(wù)的保障比較缺失,比如某個(gè)數(shù)據(jù)服務(wù)出了問(wèn)題,我們直到運(yùn)營(yíng)反饋的時(shí)候才發(fā)現(xiàn)有問(wèn)題,或者數(shù)據(jù)量比較大的時(shí)候,要去做限流和主備切換。所以在數(shù)據(jù)服務(wù)的這一層中也把數(shù)據(jù)服務(wù)保障加到了天工的中間件里面。還有主備雙活,將流量大的放在主庫(kù),流量適中的放在備庫(kù)上。針對(duì)一些復(fù)雜的查詢(xún),在執(zhí)行的時(shí)候很慢,我們會(huì)自動(dòng)識(shí)別這些慢查詢(xún),然后進(jìn)行阻斷,等待資源充足后再執(zhí)行,當(dāng)然,也可通過(guò)添加白名單用戶(hù)進(jìn)行限流。上面這些功能在天工里面都有實(shí)現(xiàn)。
除了前面講的,我們?cè)诩夹g(shù)工具上也和阿里云計(jì)算平臺(tái)的事業(yè)部進(jìn)行了探索。每年遇到大促都要進(jìn)行壓測(cè),大家要去啟動(dòng)數(shù)據(jù),模擬大促流量,看看我們的實(shí)時(shí)作業(yè)能不能滿(mǎn)足預(yù)期,比如有延遲,或者 QPS 過(guò)高,在原來(lái)我們會(huì)重啟作業(yè),然后把 source 和 sink 改成壓測(cè) source 和 sink,操作起來(lái)非常的麻煩。后來(lái)我們做了一個(gè)實(shí)時(shí)的壓測(cè)工具,可以做到一鍵啟動(dòng)所有重要的壓測(cè)任務(wù),并且會(huì)生成壓測(cè)報(bào)告。我們只需要看壓測(cè)本報(bào)告有沒(méi)有滿(mǎn)足我們的預(yù)期就行?;?Flink 之后,我們開(kāi)始做基于作業(yè)進(jìn)度的監(jiān)控,比如延遲監(jiān)控、checkpoint 的監(jiān)控、TPS 的預(yù)警等。
菜鳥(niǎo)目前在實(shí)時(shí)數(shù)倉(cāng)方面更多的是基于 Flink 進(jìn)行一系列功能的開(kāi)發(fā),未來(lái)的發(fā)展方向計(jì)劃向批流混合以及 AI 方向演進(jìn)。
Flink 提供了 batch 功能。菜鳥(niǎo)很多中小型的表分析不再導(dǎo)入到 Hbase 中, 而是在定義 source 的時(shí)候直接將 MaxCompute 的離線維表讀到內(nèi)存中,直接去做關(guān)聯(lián),如此一來(lái)很多操作不需要再進(jìn)行數(shù)據(jù)同步的工作。
針對(duì)一些物流的場(chǎng)景。如果鏈路比較長(zhǎng),尤其是雙十一支付的訂單,在十一月十七號(hào)可能還存在未簽收的情況,這時(shí)候如果發(fā)現(xiàn)作業(yè)中有一個(gè)錯(cuò)誤,如果重啟的話,作業(yè)的 State 將會(huì)丟失,再加之整個(gè)上游的 source 在 TT 中只允許保存三天,使得該問(wèn)題的解決變得更加困難。
-
菜鳥(niǎo)之后發(fā)現(xiàn) Flink 提供的 batch 功能可以很好地解決該問(wèn)題,具體來(lái)講是定義 TT 的 source,作為三天的實(shí)時(shí)場(chǎng)景的應(yīng)用,TT 數(shù)據(jù)寫(xiě)到離線數(shù)據(jù)庫(kù)進(jìn)行歷史數(shù)據(jù)備份,如果存在重啟的情況,會(huì)讀取并整合離線的數(shù)據(jù),即使 Flink 的 state 丟失,因?yàn)殡x線數(shù)據(jù)的加入,也會(huì)生成新的 state,從而不必?fù)?dān)心雙十一的訂單如果在十七號(hào)簽收之前重啟導(dǎo)致無(wú)法獲取十一號(hào)的訂單信息。
-
當(dāng)然,在上述問(wèn)題的解決上,菜鳥(niǎo)也踩了很多的小坑。其中的一個(gè)是整合實(shí)時(shí)數(shù)據(jù)和離線數(shù)據(jù)的時(shí)候,數(shù)據(jù)亂序的問(wèn)題。菜鳥(niǎo)實(shí)現(xiàn)了一系列的 UDF 來(lái)應(yīng)對(duì)該問(wèn)題,比如實(shí)時(shí)數(shù)據(jù)和離線數(shù)據(jù)的讀取優(yōu)先級(jí)設(shè)置。
針對(duì)日志型的業(yè)務(wù)場(chǎng)景。比如曝光、網(wǎng)站流量等,其一條日志下來(lái)后,基本不會(huì)再發(fā)生變化。菜鳥(niǎo)目前在考慮將所有解析的工作交給 Flink 來(lái)處理,然后再寫(xiě)入到 batch 中,從而無(wú)需在 MaxCompute 的 ODPS 中進(jìn)行批處理的操作。
在智能化方面。前面提到的數(shù)據(jù)傾斜隱患的規(guī)避、資源的優(yōu)化等,都用到了 Flink 提供的智能化功能。
-
菜鳥(niǎo)也期望在實(shí)時(shí) ETL 過(guò)程中的一些場(chǎng)景中,比如去重,也使用 Flink 相應(yīng)的智能化解決方案來(lái)進(jìn)行優(yōu)化。
-
此外,在數(shù)據(jù)服務(wù)保障上,如主備切換等,目前仍然依賴(lài)人工對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,菜鳥(niǎo)也期望 Flink 之后能提供全鏈路實(shí)時(shí)保障的策略。
-
最后是業(yè)務(wù)場(chǎng)景的智能化,阿里 Alink 對(duì)于業(yè)務(wù)智能化的支持也是之后探索的方向。
本次的分享就到這里,謝謝大家。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
![]()
長(zhǎng)按訂閱更多精彩▼
![]()
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!





