主頁 > 資料庫 > 一份配置輕松搞定表單渲染,配置式表單渲染器在袋鼠云的實作思路與實踐

一份配置輕松搞定表單渲染,配置式表單渲染器在袋鼠云的實作思路與實踐

2023-06-08 09:35:23 資料庫

前段時間,袋鼠云離線開發產品接到改造資料同步表單的需求,

一方面,資料同步模塊的代碼可讀性和可維護性較差,導致在資料同步模塊開發新功能和定位問題的效率很低,另一方面,整體規劃上,希望在對接新的資料源時,可以不再關心表單渲染相關問題,從資料源中心新建資料源一直到資料源在資料同步模塊的應用,全鏈路的表單都可以通過配置化的方式解決,

本文就將以此為例,拋磚引玉,為大家詳細介紹配置式表單渲染器實作的實踐之路,

資料同步表單背景

資料同步模塊整體上分為四個部分,資料來源表單、同步目標表單、欄位映射組件和通道控制表單,

file

其中前三個部分對應的代碼非常混亂,代碼量也很大,單個組件代碼 5000+ 行,這里著重說一下資料來源表單和同步目標表單,

資料來源和同步目標表單的主要功能是收集資料源對應的配置資訊,并且根據資料源型別的不同,對應需要渲染的表單項也不同,

目前袋鼠云離線開發產品 BatchWorks 資料同步功能的資料源多達50+種,在長時間的迭代程序中,榷訓月累出現了很多強行復用的代碼,這些強行復用的代碼內部又包含著大量的 if else 邏輯,另外,資料同步模塊的表單內部有很多聯動關系,比如:

· 某個表單項的值變化時,需要發起介面請求,請求的回傳值被用作另一個表單項下拉框的資料

· 某個表單項的值變化時,需要去清空/重置其他一些表單項的值

· 某個表單項的值變化時,需要顯示/隱藏某個表單項

· 某個表單項的值變化時,某個表單項的 label 文案、表單項組件(比如從 select 變成 input ) 等隨之發生變化

這些表單項的聯動處理邏輯在代碼中混雜交叉,另外還要加上表單回顯的特殊邏輯處理,表單的值收集到 redux 的特殊邏輯處理等,

需求分析

基于上述需求背景,表單渲染器的核心功能是輸入一份配置,輸出表單 UI 組件,

file

基于上述資料同步表單背景,我們希望渲染器可以盡可能吸收掉表單內部的復雜度,也就是說在表單的配置中要能夠描述上述的聯動關系,那么可以大概得出表單的配置需要描述:

· 表單項的基礎資訊,比如欄位名、label、表單組件、校驗資訊等

· 表單項資料之間的聯動

· 表單項 UI 的聯動(控制顯示/隱藏)

· 表單項的值變化時需要觸發的副作用(比如呼叫介面)

表單基礎資訊描述

這里配置格式使用 JSON 格式,用一個陣列描述所有的表單項資訊,UI 上表單項的渲染順序即配置陣列中表單項配置的順序,表單組件使用 Ant Design Form,

對于表單項基礎資訊的描述配置,大多可以直接搬用 Ant Design Form Item 的 props,比如 label、rules、Tooltip 等屬性,這里不多贅述,

比較特殊的是,需要在配置里描述表單項描述的 UI 組件,比如 Select、Input,那么這里使用 widget 欄位去描述,另外,組件的描述除了組件名稱,還需要描述組件的 props, 所以還需要一個 widgetProps 欄位去描述組件的屬性,比如 placeholder、disabled 等,

那么一個用于選擇資料源的表單項應該這樣描述:

{
  "fieldName": "sourceId",
  "label": "資料源",
  "rules": [
    {
      "required": true,
      "message": "請選擇資料源!",
    },
  ],
  "widget": "Select",
  "widgetProps": {
    "placeholder": "請選擇資料源",
    "options": [
      {
        "lable": "資料源1",
        "value": 1
      }
    ]
  },
}

當然可能會存在某些表單項的 UI 組件有自定義的情況,比如可編輯表格,代碼編輯器等,這個時候就需要開發自定義表單組件了,然后把這些組件注入到 FormRenderer 中,偽代碼如下所示:

import { Editor, EditableTable } from './customWigets'

export const getWidets = (widgetsName) => {
    switch(widgetsName) {
      case 'Editor': {
        return Editor
      }
      case 'EditableTable': {
        return EditableTable
      }
    }
} 

那么目前的結構如圖所示:

file

這份配置寫到這里的時候,問題出現了:

· 無法在配置中描述 onChange、onSelect 等事件回呼函式

· 相比于 jsx 強大的表達能力,JSON 中只能表達基本的資料結構,而沒辦法直接表達邏輯

· Select 下拉框的資料可能來源于介面,這種情況在業務中相當常見,這里也沒辦法表達

· 不能自定義表單校驗器,無法支持復雜的 Tootip 提示,比如帶有 a 標簽的 Tootip

上述問題產生的根本原因,實際上是 JSON 與 jsx 之間表達能力的差距,但是從另一個角度來講,正因為 JSON 的表達能力和靈活性不如 jsx,所以在用來描述 UI 時,JSON 更不容易導致混亂,

我們先思考如何表達 Select 下拉框的資料來源于介面,這里可以拆解為兩個部分,資料獲取和取得介面的回傳值并在配置項中表達,

資料獲取

實際上,Select 下拉框中的資料也并不一定來源于介面,也可能是來源于其他業務資料,所以在配置項描述資料獲取時,不應該關心資料的來源,

很顯然,資料獲取邏輯需要用 js 描述 ,這里我們抽象出一個 Service 的概念,用于描述/宣告資料獲取邏輯,Service 的宣告使用 js,在 JSON 配置中,只需要去描述 Service 的呼叫邏輯即可,對于 JSON 配置來說, Service 呼叫需要三個要素:

· Service 的標識/名稱,表示哪一個 Service 被觸發

· Service 的觸發時機

· Service 回傳的資料如何存盤

● Service 的觸發時機

Service 的觸發一般來說是由于用戶的互動引起的,當然也存在在表單項組件掛載時就需要觸發的情況,那么呼叫時機大概就是以下幾種:

· onMount

· onChange

· onSearch

· onFocus

· onBlur

● Service 回傳的資料如何存盤

這里 Service 回傳的資料存盤需要能被 UI 獲取到,那么需要將回傳的資料都維護在 FormRender 內部,這里將存盤資料的地方命名為 extraData,那么我們描述 Service 回傳的資料的存盤,可以使用一個 fieldInExtraData 的欄位,描述當前 Service 回傳的資料被存盤在 extraData 的那個欄位中,取值時:extraData[fieldInExtraData],

那么在表單項配置中描述 Service,如下所示:

{
  "serviceName": "getSourceList",
  "triggers": ["onMount", "onSearch"],
  "fieldInExtraData": "schemaList"
}

● Service 的宣告

對于 Service 本身來說,要做的事情就是獲取并處理資料然后回傳,當然 Service 本身可能需要接受一些引數,比如當前 Form 收集到的資料、Service 是被哪個欄位觸發的、觸發時機是什么等等,那么 Service 的格式如下所示:

const getSourceList = ({ formData, extraData, trigger, triggerFieldName }) => {
  return Promise((resolve) => {
    resolve(...)
  })
}

由于 Service 可能是異步的,所以這里 Service 都回傳一個 Promise,然后將所有的 Service 都注入到 FormRenderer 中,FormRenderer 根據表單項配置中宣告的呼叫時機去呼叫 Service,整個資料獲取的鏈路就完成了,

獲取 Service 回傳值并在配置項中表達

上文中提到,Service 的回傳的資料都被存盤在 FormRenderer 內部的 extraData 中,一般情況下如果使用 jsx 當然能很容易地取到對應的值,但是在 JSON 中,是沒辦法表達的,但是我們可以借鑒 jsx 的插值運算式和 vue 的插值運算式,

<div>{user.name}</div>

在 jsx 中,如果在一對標簽內部寫了一串字串,對應的會有兩種決議策略,第一種是直接識別為字串,第二種如果識別到花括號,則將其視為 js 運算式, 同理,在 JSON 配置中也可以使用這種方式去取值,

{
  "fieldName": "sourceId",
  "label": "資料源",
  "widget": "Select",
  "widgetProps": {
    "placeholder": "請選擇資料源",
    "options": "{{ extraData.sourceList }}"
  },
  "triggerServices": [
    {
      "serviceName": "getSourceList",
      "triggers": ["onMount", "onSearch"],
      "fieldInExtraData": "sourceList"
    }
  ]
}

● 函式運算式

上例中,使用一對花括號宣告函式運算式,表面上是借鑒了 jsx 的插值運算式,但是其實兩者有很大的區別,jsx 的插值運算式是在編譯階段就轉化成了 js 運算式,而在 JSON 中的這種自定義的函式運算式要在運行時轉換,上述的函式運算式只能被轉換為函式執行,即:

"{{ extraData.schemaList  }}"
// 轉化為
const valueGetter = new Function('extraData', 'return extraData.schemaList')

出于安全問題考慮,運算式還需要被放在一個類似沙箱的環境中執行,避免運算式內部修改全域環境變數,創建簡易沙箱使用 proxy + with + symbol.unscopables 的方式,這里不展開講解了,最終函式運算式的應用大概是如下形式:

function Comp () {
  return <Select options={valueGetter(extraData)} />
}

到目前為止,已經有了兩個新概念:Service 和 函式運算式,回到上文中提到的問題,我們已經解決了 Select 下拉框來源于介面的問題,那么還剩下如下問題:

· JSON 中只能表達基本的資料結構,而沒辦法直接表達邏輯

· 無法在配置中描述 onChange、onSelect 等事件回呼函式,也不能自定義表單校驗器

· 不能自定義表單校驗器,無法支持復雜的 Tootip 提示,比如帶有 a 標簽的 Tootip

json 中沒辦法表達邏輯的問題,其實已經可以通過函式運算式來解決了,函式運算式內部支持寫任意的 js 運算式,另外,在函式運算式中也可以支持訪問 form 表單資料,有了資料支持和邏輯表達能力支持,絕大多數情況下的已經能夠滿足 UI 渲染中的邏輯表達了,

而描述 onChange、onSelect 等事件回呼函式可以通過配置 Service 來解決,

自定義表達校驗器可以通過函式運算式的變種來解決,可以向 FormRenderer 中注入 form 校驗器的集合,然后通過 {{ ruleMap.xxx }} 來指定表單項的某一條校驗規則的校驗器,

{
  "fieldName": "sourceId",
  "label": "資料源",
  "rules": [
    {
      validator: "{{ ruleMap.checkSourceId }}"
    },
  ],
}

Tooltip 提示也是如此,目前結構如下圖所示:

file

表單資料聯動

表單資料聯動實際上就是當表單中某個表單項值變化時,去重置其他表單項的值,那么要在配置中描述這種聯動關系有兩種方式:

· 當前欄位受哪些欄位的影響

· 當前欄位的值變化會影響到哪些欄位

一般情況下,在代碼中描述這種邏輯時都是采用第二種方式,也就是監聽某個欄位的值的變化,然后在回呼函式中去做對應的資料聯動操作,

但是在配置 JSON 時,第二種方式就變得不那么友好了,那會讓欄位配置之間產生更多的耦合,更加友好的方式是在某個欄位內表達本欄位受到哪些欄位的影響,這樣做的另一個好處是,當開發者填寫或者修改某一個欄位的配置時,可以更加聚焦,不用關心其他欄位的配置,

這里用 dependecies 欄位來表達當前欄位的值受哪些欄位的影響,舉個例子,表單中有資料源、schema、table 三個欄位,資料源變化時,schema 的值應該被重置;schema 變化時,table 的值會被重置,那么在 json 中應該這樣描述:

[
  {fieldName: 'sourceId', dependencies: []},
  {fieldName: 'schema', dependencies: ['sourceId']},
  {fieldName: 'table', dependencies: ['schema']},
]

對應的依賴關系圖如下:

file

這里新的問題產生了,當資料源變化時,table 的值是否要被重置?一般情況下是肯定的,那么實際上它們的依賴關系是這樣的:

file

這里有兩種方式來解決這種隱式的依賴關系:

· 開發者在配置時顯式得宣告所有的依賴關系

· 渲染器內部決議依賴關系時,將這種隱式的依賴關系也決議出來

那么如何選擇使用哪一種方式呢?

如果采用第一種方式,優點是渲染器不再需要關心這種隱式的依賴關系了,但是在配置時的心智負擔可能比較大,很容易出現漏配依賴關系的情況,

如果采用第二種方式,優點是配置起來心智負擔低,但是也有可能出現 table 確實不依賴 sourceId 的情況,也就是間接依賴不生效的情況,

結合實際業務看,目前的業務中,所有的欄位之間間接依賴其實都是隱式依賴,也就是需要生效的,這里采用第二種方式,前文中也提到了,期望是 FormRenderer 可以盡可能的吸收掉表單內部的復雜度,

特殊的表單資料聯動

在實際業務中還存在著一些比較特殊的表單資料聯動,比如:

· 選擇資料源時,除了需要收集資料源的 id,還需要收集資料源型別

· 選擇資料源后,需要將資料源的其他資訊展示為表單項,比如下圖中的表單

file

對于這種業務場景,我們可以理解為某個表單項的值是由其他表單項的值派生出來的,那么就需要去描述這種派生邏輯,當然,這種派生邏輯可以在業務代碼中描述,只需要在資料源變化時,手動的 setFieldValue 就可以了,但是還是上文中提到的期望,FormRenderer 可以盡可能吸收掉復雜度,

處理這種情況,需要新增一個配置項去描述派生邏輯,這里配置項定為 valueDerived,這個配置項的值應該為一個取值運算式,那么以第一個例子為例,配置應該如下所示:

[
  {
    "fieldName": "sourceId",
    "label": "資料源",
    "widget": "Select",
    "widgetProps": {
      "placeholder": "請選擇資料源",
      "options": "{{ extraData.sourceList }}"
    },
  },
  {
    "fieldName": "sourceType",
    "label": "資料源型別",
    "hidden": true,
    "valueDerived": "{{ extraData.sourceList.find(s => s.value =https://www.cnblogs.com/DTinsight/p/== formData.sourceId).type }}",
  },
]

FormRenderer 內部根據配置的 valueDerived 去自動更新表單中對應欄位的值,

表單 UI 聯動

表單 UI 聯動可以分為以下兩個部分,

表單項 UI 文案、樣式等根據資料聯動

表單項的 UI 聯動在 React 和 JSX 中,都能很輕易、很自然的發生,但是想要在 JSON 中描述,由于JSON本身不具備表達邏輯的能力,還是要借助函式運算式,只需要支持對應的配置項可以使用函式運算式就能完成表單項的聯動,舉個例子:

[
  {
    "fieldName": "time",
    "label": "{{ extraData.type === 1 ? '開始時間' : '結束時間' }}",
    "widget": "Input",
    "widgetProps": {
      "placeholder":"{{ extraData.type === 1 ? '請輸入開始時間' : '請輸入結束時間' }}",
    },
  }
]

那么它們實際渲染時等同于以下偽代碼:

function Comp (props) {
  const {fieldName, label, widget, widgetProps, extraData} = props
  
  const form = useFormInstance()
  const formData = https://www.cnblogs.com/DTinsight/p/form.getFieldsValue()
  
  const tarnsformer = (configItem) => {
    const fn = new Function('formData', 'extraData', `return $[configItem}`)
    return fn.call(null, formData, extraData)
  }

  return 
    <Form.Item
      name=fieldName
      label={tarnsformer(label)}
    >
      <widget  placeholder={tarnsformer(widgetProps.placeholder)}/>
    </Form.Item>
}

這樣就能做到表單項的文案樣式等根據資料變化自然的聯動,

表單項的顯示與隱藏

表單項的隱藏也能拆分為以下兩種情況:

· 隱藏但不銷毀,表單項的值仍然會被收集和保留

· 銷毀,不再保留/收集表單項的值

隱藏但不銷毀的情況,antd form 本身就有 hidden 配置支持,那么這里只需要支持 hidden 配置使用函式運算式就可以了,

對于表單項的銷毀,就需要新增一個欄位了,這里命名為 destory,同樣通過支持使用函式運算式完成聯動,但是這里需要考慮一些其他情況,比如從銷毀狀態變成顯示狀態時,需要去觸發 mount service 等,

思路小結

回顧上文需求分析中所說的需要實作的功能:

· 表單項的基礎資訊,比如欄位名、label、表單組件、校驗資訊等

· 表單項資料之間的聯動

· 表單項 UI 的聯動(控制顯示/隱藏)

· 表單項的值變化時需要觸發的副作用(比如呼叫介面)

目前在思路上,上述功能都是可以實作的,除了基礎的渲染功能以外,FormRender 需要額外實作的功能有:

· 內置一個 extraData 存盤 Service 回傳的資料

· 支持根據配置在正確的時機觸發 Service

· 支持函式運算式

· 支持根據配置在內部處理資料聯動邏輯

大體實作

整體上,匯出一個 FormRenderer 組件,上文中提到的 json config、Service 宣告、自定義的表單校驗器,自定義表單項組件等,都通過 FormRenderer 的 props 傳入,

內置 extraData

由于 extraData 內部存盤的資料變化可能導致視圖更新,那么只能使用 React.Context 或者 state,事實上即使使用 Context 也還是需要宣告 state 來觸發視圖更新,但是 Conetxt 在傳遞資料時有著獨特的優勢,這里直接使用 Context 存盤資料,

// 避免閉包問題
export function useExtraData(init: IExtraDataType) {
    const stateRef = useRef<IExtraDataType>(init);
    const [_, updateState] = useReducer((preState, action) => {
        stateRef.current =
            typeof action === 'function'
                ? { ...action(preState) }
                : { ...action };
        return stateRef.current;
    }, init);

    return [stateRef, updateState] as const;
}

// 創建context
const ExtraContext = React.createContext<ExtraContextType>({
    extraDataRef: { current: { } },
    update: () => void 0,
});
import { useExtraData, ExtraContext } from 'extraDataContext.ts'

const FormRenderer: React.FC = () => {
  const [extraDataRef, updateExtraData] = useExtraData({});
  // ....
  return(
    <ExtraContext.Provider
      value=https://www.cnblogs.com/DTinsight/p/{{ extraDataRef, update: updateExtraData }}
    >
      {....}
    
  )     
}

在正確的時機觸發 Service

在 JSON 配置中 Service 相關描述如下所示:

[
  {
    "fieldName": "sourceId",
    "label": "資料源",
    "triggerServices": [
      {
        "serviceName": "getSourceList",
        "triggers": ["onMount", "onSearch"],
        "fieldInExtraData": "sourceList"
      },
      {
        "serviceName": "getSchemaList",
        "triggers": ["onChange"],
        "fieldInExtraData": "schemaList"
      },
    ]
  }
]

triggerServices 已經很清楚直觀的描述了,該欄位在什么時機應該呼叫哪個 service,在代碼實作上,為了這部分觸發邏輯與視圖渲染分離,采用發布訂閱模式,大體流程如下圖所示:

file

這里流程已經走通了,但是可以發現,renderer 中仍然需要去處理訂閱的邏輯,Service 觸發邏輯與視圖渲染邏輯分離的不夠徹底,那么可以繼續優化一下,加入一個訂閱器去處理這部分邏輯,優化后的邏輯如下圖所示:

file

支持函式運算式

上文中提到了,函式運算式的實作是用 new Function,以及處于安全問題考慮需要將函式運算式放到模擬沙箱環境中執行,執行流程如下所示:

file

實作代碼如下所示(不包含正則處理):

class FnExpressionTransformer {
    private sandboxProxiesMap: WeakMap<ScopeType, InstanceType<typeof Proxy>> =
        new WeakMap();

    private createProxy(scopeObj: ScopeType) {
        /** 存盤創建的 proxy 避免重復創建 */
        if (this.sandboxProxiesMap.has(scopeObj)) {
            return this.sandboxProxiesMap.get(scopeObj);
        }
        const scope = {
            extraData: scopeObj.extraDataRef,
            formData: scopeObj.formData,
            Math: Math,
            Date: Date,
        };
        const proxy = new Proxy(scope, {
            has() {
                return true;
            },
            get(target, prop) {
                if (prop === Symbol.unscopables) return undefined;
                if (prop === 'extraData') {
                    return target[prop]['current'];
                }
                return target[prop];
            },
        });
        this.sandboxProxiesMap.set(scopeObj, proxy);
        return proxy;
    }

    transform = (code: string): TransformedFnType => {
        return (scope: ScopeType) => {
            const proxy = this.createProxy(scope);
            const fnBody = `with(scope) {  return ${code} }`;
            const fn = new Function('scope', fnBody);
            return fn(proxy);
        };
    };
}

比如在 label 配置中使用了函式運算式:

[
  {
    "fieldName": "name",
    "label": "{{ extraData.xxx ? '用戶名' : '昵稱' }}"
  }
]

那么經過轉換后,就是等同于以下函式:

function lableValue (scope) {
  return scope.extraData.xxx;
} 

具體應用如下:

<FormItem
  name={name}
  label={lableValue({ formData, extraData })}
>
{/* xxxx */}
</FormItem>

支持根據配置在內部處理資料聯動邏輯

與上文中 Service 觸發邏輯一樣,將這部分聯動的邏輯通過發布訂閱與視圖渲染邏輯分離,但是相比于 Service 觸發邏輯,這里多了分析依賴的步驟,比如,有如下 json 配置:

[
  {fieldName: 'schema', dependencies: []},
  {fieldName: 'table', dependencies: ['schema']},
  {fieldName: 'partition', dependencies: ['schema', 'table']},
  {fieldName: 'coprate', dependencies: ['table', 'partition']}
]

那么生成的依賴關系圖就應該是:

[
  {fieldName: 'schema', isField: true]},
  {fieldName: 'table', isField: true},
  {fieldName: 'partition', isField: true},
  {fieldName: 'coprate', isField: true},
  {fieldName: 'schema', dependBy: 'table', isRelation: true},
  {fieldName: 'schema', dependBy: 'partition', isRelation: true},
  {fieldName: 'table', dependBy: 'partition', isRelation: true},
  {fieldName: 'table', dependBy: 'coprate', isRelation: true},
  {fieldName: 'partition', dependBy: 'coprate', isRelation: true},
]

生成上述依賴關系后,剩下的流程與觸發Service 的流程類似,在這里不多做贅述了,

《數堆疊產品白皮書》:https://www.dtstack.com/resources/1004?src=https://www.cnblogs.com/DTinsight/p/szsm

《資料治理行業實踐白皮書》下載地址:https://www.dtstack.com/resources/1001?src=https://www.cnblogs.com/DTinsight/p/szsm

想了解或咨詢更多有關袋鼠云大資料產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠云官網:https://www.dtstack.com/?src=https://www.cnblogs.com/DTinsight/p/szbky

同時,歡迎對大資料開源專案有興趣的同學加入「袋鼠云開源框架釘釘技術qun」,交流最新開源技術資訊,qun號碼:30537511,專案地址:https://github.com/DTStack

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554628.html

標籤:大數據

上一篇:GreatSQL洗掉磁區慢的跟蹤

下一篇:返回列表

標籤雲
其他(160593) Python(38215) JavaScript(25484) Java(18209) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7235) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1955) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 一份配置輕松搞定表單渲染,配置式表單渲染器在袋鼠云的實作思路與

    前段時間,[袋鼠云離線開發產品](https://www.dtstack.com/dtinsight?src=https://www.cnblogs.com/DTinsight/p/szsm)接到改造資料同步表單的需求。 一方面,[資料同步模塊](https://www.dtstack.com/dtinsight?src=szsm)的代碼可讀性和可維護性較差,導致在資料 ......

    uj5u.com 2023-06-08 09:35:23 more
  • GreatSQL洗掉磁區慢的跟蹤

    # GreatSQL洗掉磁區慢的跟蹤 ## 背景 某業務系統,每天凌晨會洗掉磁區表的一個磁區(按天磁區),耗時較久,從最開始的30秒,慢慢變為1分鐘+,影響到交易業務的正常進行。 在測驗環境進行了模擬,復現了洗掉磁區慢的情況,本次基于GreatSQL8.0.25-17進行測驗,官方mysql版本也存 ......

    uj5u.com 2023-06-07 10:00:28 more
  • GreatSQL洗掉磁區慢的跟蹤

    # GreatSQL洗掉磁區慢的跟蹤 ## 背景 某業務系統,每天凌晨會洗掉磁區表的一個磁區(按天磁區),耗時較久,從最開始的30秒,慢慢變為1分鐘+,影響到交易業務的正常進行。 在測驗環境進行了模擬,復現了洗掉磁區慢的情況,本次基于GreatSQL8.0.25-17進行測驗,官方mysql版本也存 ......

    uj5u.com 2023-06-07 09:43:44 more
  • 常用的 SQL Server 關鍵字及其含義

    SQL Server 是一種關系型資料庫管理系統(RDBMS),提供了用于管理和操作資料庫的各種關鍵字。 以下是一些常用的 SQL Server 關鍵字及其含義: 1. SELECT: 用于從資料庫中檢索資料。 2. INSERT: 用于將新記錄插入到資料庫表中。 3. UPDATE: 用于更新資料 ......

    uj5u.com 2023-06-07 08:19:39 more
  • Hive執行計劃之一文讀懂Hive執行計劃

    ## 概述 Hive的執行計劃描述了一個hiveSQL陳述句的具體執行步驟,通過執行計劃解讀可以了解hiveSQL陳述句被決議器轉換為相應程式語言的執行邏輯。通過執行邏輯可以知曉HiveSQL運行流程,進而對流程進行優化,實作更優的資料查詢處理。 同樣,通過執行計劃,還可以了解到哪些不一樣的SQL邏輯其 ......

    uj5u.com 2023-06-07 08:19:33 more
  • Zookeeper

    # zookeeper ZooKeeper是一個開源的分布式應用程式協調服務 簡單來說可以理解為zookeeper = 檔案系統+監聽通知機制 應用場景: 1. 集群管理、服務器狀態感知 2. 分布式應用配置管理 3. 統一命名服務 4. 分布式鎖 > 小總結: >1. 為客戶提供寫資料功能 資料不 ......

    uj5u.com 2023-06-07 08:19:28 more
  • 常用的 SQL Server 關鍵字及其含義

    SQL Server 是一種關系型資料庫管理系統(RDBMS),提供了用于管理和操作資料庫的各種關鍵字。 以下是一些常用的 SQL Server 關鍵字及其含義: 1. SELECT: 用于從資料庫中檢索資料。 2. INSERT: 用于將新記錄插入到資料庫表中。 3. UPDATE: 用于更新資料 ......

    uj5u.com 2023-06-07 08:19:16 more
  • Hive執行計劃之一文讀懂Hive執行計劃

    ## 概述 Hive的執行計劃描述了一個hiveSQL陳述句的具體執行步驟,通過執行計劃解讀可以了解hiveSQL陳述句被決議器轉換為相應程式語言的執行邏輯。通過執行邏輯可以知曉HiveSQL運行流程,進而對流程進行優化,實作更優的資料查詢處理。 同樣,通過執行計劃,還可以了解到哪些不一樣的SQL邏輯其 ......

    uj5u.com 2023-06-07 08:13:14 more
  • Zookeeper

    # zookeeper ZooKeeper是一個開源的分布式應用程式協調服務 簡單來說可以理解為zookeeper = 檔案系統+監聽通知機制 應用場景: 1. 集群管理、服務器狀態感知 2. 分布式應用配置管理 3. 統一命名服務 4. 分布式鎖 > 小總結: >1. 為客戶提供寫資料功能 資料不 ......

    uj5u.com 2023-06-07 08:13:09 more
  • GreatSQL 8.0.32-24 今日發布

    - 1.新增特性 - - 1.1 SQL兼容性 - 1.2 MGR - 1.3 性能優化 - 1.4 安全 - 2.穩定性提升 - 3.其他調整 - 4.bug修復 - 5.GreatSQL VS MySQL - 6.GreatSQL Release Notes > GreatSQL 8.0.32- ......

    uj5u.com 2023-06-05 09:41:18 more