99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

抖音內(nèi)部使用的Go基礎(chǔ)庫(kù)開(kāi)源,高性能動(dòng)態(tài)處理RPC數(shù)據(jù)

OSC開(kāi)源社區(qū) ? 來(lái)源:OSC開(kāi)源社區(qū) ? 2023-03-23 10:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01

背景

當(dāng)前,Thrift 是字節(jié)內(nèi)部主要使用的 RPC 序列化協(xié)議,在 CloudWeGo/Kitex 項(xiàng)目中優(yōu)化和使用后,性能相比使用支持泛型編解碼的協(xié)議如 JSON 有較大優(yōu)勢(shì)。但是在和業(yè)務(wù)團(tuán)隊(duì)進(jìn)行深入合作優(yōu)化的過(guò)程中,我們發(fā)現(xiàn)一些特殊業(yè)務(wù)場(chǎng)景并不能享受靜態(tài)化代碼生成所帶來(lái)的高性能:
  1. 動(dòng)態(tài)反射:動(dòng)態(tài)地 讀取、修改、裁剪 數(shù)據(jù)包中某些字段,如隱私合規(guī)場(chǎng)景中字段屏蔽;
  2. 數(shù)據(jù)編排:組合多個(gè)子數(shù)據(jù)包進(jìn)行 排序、過(guò)濾、位移、歸并 等操作,如某些 BFF (Backend For Frontent) 服務(wù);
  3. 協(xié)議轉(zhuǎn)換:作為代理將某種協(xié)議的數(shù)據(jù)轉(zhuǎn)換另一種協(xié)議,如 http-rpc 協(xié)議轉(zhuǎn)換網(wǎng)關(guān)。
  4. 泛化調(diào)用:需要秒級(jí)熱更新或迭代非常頻繁的 RPC 服務(wù),如大量 Kitex 泛化調(diào)用(generic-call)用戶

不難發(fā)現(xiàn),這些業(yè)務(wù)場(chǎng)景都具有難以統(tǒng)一定義靜態(tài)IDL的特點(diǎn)。即使可以通過(guò)分布式 sidecar 技術(shù)規(guī)避這個(gè)問(wèn)題,也往往因?yàn)闃I(yè)務(wù)需要?jiǎng)討B(tài)更新而放棄傳統(tǒng)代碼生成方式,訴諸某些自研或開(kāi)源的 Thrift 泛型編解碼庫(kù)進(jìn)行泛化 RPC 調(diào)用。我們經(jīng)過(guò)性能分析發(fā)現(xiàn),目前這些庫(kù)相比代碼生成方式有巨大的性能下降。以字節(jié)某 BFF 服務(wù)為例,僅僅 Thrift 泛化調(diào)用產(chǎn)生的 CPU 開(kāi)銷占比就將近 40%,這幾乎是正常 Thrift RPC 服務(wù)的4到8倍。因此,我們自研了一套能動(dòng)態(tài)處理 RPC 數(shù)據(jù)(不需要代碼生成)同時(shí)保證高性能的 Go 基礎(chǔ)庫(kù) —— dynamicgo。

02

設(shè)計(jì)與實(shí)現(xiàn)

首先要搞清楚當(dāng)前這些泛化調(diào)用庫(kù)性能為什么差呢?其核心原因是:采用了某種低效泛型容器來(lái)承載中間處理過(guò)程中的數(shù)據(jù)(典型如 thrift-iterator 中的 map[string]interface{})。眾所周知,Go 的堆內(nèi)存管理代價(jià)是極高的 (GC +heap bitmap),而采用 interface 不可避免會(huì)帶來(lái)大量的內(nèi)存分配。但實(shí)際上相當(dāng)多的業(yè)務(wù)場(chǎng)景并不真正需要這些中間表示。比如 http-thrift API 網(wǎng)關(guān)中的純協(xié)議轉(zhuǎn)換場(chǎng)景,其本質(zhì)訴求只是將 JSON(或其它協(xié)議)數(shù)據(jù)依據(jù)用戶 IDL 轉(zhuǎn)換為 Thrift 編碼(反之亦然),完全可以基于輸入的數(shù)據(jù)流逐字進(jìn)行翻譯。同樣,我們也統(tǒng)計(jì)了抖音某 BFF 服務(wù)中泛化調(diào)用的具體代碼,發(fā)現(xiàn)真正需要進(jìn)行讀(Get)和寫(xiě)(Set)操作的字段占整個(gè)數(shù)據(jù)包字段不到5%,這種場(chǎng)景下完全可以對(duì)不需要的字段進(jìn)行跳過(guò)(Skip)處理而不是反序列化。而 dynamicgo 的核心設(shè)計(jì)思想是:基于 原始字節(jié)流 和 動(dòng)態(tài)類型描述 原地(in-place) 進(jìn)行數(shù)據(jù)處理與轉(zhuǎn)換。為此,我們針對(duì)不同的場(chǎng)景設(shè)計(jì)了不同的 API 去實(shí)現(xiàn)這個(gè)目標(biāo)。動(dòng)態(tài)反射

對(duì)于 thrift 反射代理的使用場(chǎng)景,歸納起來(lái)有如下使用需求:

  1. 有一套完整結(jié)構(gòu)自描述能力,可表達(dá) scalar 數(shù)據(jù)類型, 也可表達(dá)嵌套結(jié)構(gòu)的映射、序列等關(guān)系;
  2. 支持增刪查改(Get/Set/Index/Delete/Add)與遍歷(ForEach);
  3. 保證數(shù)據(jù)可并發(fā)讀,但是不需要支持并發(fā)寫(xiě)。等價(jià)于 map[string]interface{} 或 []interface{}

這里我們參考了 Go reflect 的設(shè)計(jì)思想,把通過(guò)IDL解析得到的準(zhǔn)靜態(tài)類型描述(只需跟隨 IDL 更新一次)TypeDescriptor 和 原始數(shù)據(jù)單元 Node 打包成一個(gè)完全自描述的結(jié)構(gòu)——Value,提供一套完整的反射 API。

//IDL類型描述
typeTypeDescriptorinterface{
Type()Type//數(shù)據(jù)類型
Name()string//類型名稱
Key()*TypeDescriptor//formapkey
Elem()*TypeDescriptor//forsliceormapelement
Struct()*StructDescriptor//forstruct
}
//純TLV數(shù)據(jù)單元
typeNodestruct{
tType//數(shù)據(jù)類型
vunsafe.Pointer//buffer起始位置
lint//數(shù)據(jù)單元長(zhǎng)度
}
//Node+類型描述descriptor
typeValuestruct{
Node
Descthrift.TypeDescriptor
}

這樣,只要保證 TypeDescriptor 包含的類型信息足夠豐富,以及對(duì)應(yīng)的 thrift 原始字節(jié)流處理邏輯足夠健壯,甚至可以實(shí)現(xiàn)數(shù)據(jù)裁剪、聚合等各種復(fù)雜的業(yè)務(wù)場(chǎng)景。

協(xié)議轉(zhuǎn)換

協(xié)議轉(zhuǎn)換的過(guò)程可以通過(guò)有限狀態(tài)機(jī)(FSM)來(lái)表達(dá)。以 JSON->Thrift 流程為例,其轉(zhuǎn)換過(guò)程大致為:

  1. 預(yù)加載用戶 IDL,轉(zhuǎn)換為運(yùn)行時(shí)的動(dòng)態(tài)類型描述 TypeDescriptor;
  2. 從輸入字節(jié)流中讀取一個(gè) json 值,并判斷其具體類型(object/array/string/number/bool/null):
  3. 如果是 object 類型,繼續(xù)讀取一個(gè) key,再通過(guò)對(duì)應(yīng)的 STRUCT 類型描述找到匹配字段的子類型描述;
  4. 如果是 array 類型,遞歸查找類型描述的子元素類型描述;
  5. 其它類型,直接使用當(dāng)前類型描述。
  6. 基于得到的動(dòng)態(tài)類型描述信息,將該值轉(zhuǎn)換為等價(jià)的 Thrift 字節(jié),寫(xiě)入到輸出字節(jié)流中 ;
  7. 更新輸入和輸出字節(jié)流位置,跳回2進(jìn)行循環(huán)處理,直到輸入終止(EOF)。

95a3aaf0-c8f0-11ed-bfe3-dac502259ad0.png

圖1 JSON2Thrift 數(shù)據(jù)轉(zhuǎn)換流程

整個(gè)過(guò)程可以完全做到 in-place 進(jìn)行,僅需為輸出字節(jié)流分配一次內(nèi)存即可。

數(shù)據(jù)編排

與前面兩個(gè)場(chǎng)景稍微有所不同,數(shù)據(jù)編排場(chǎng)景下可能涉及數(shù)據(jù)位置的改變(異構(gòu)轉(zhuǎn)換),并且往往會(huì)訪問(wèn)大量數(shù)據(jù)節(jié)點(diǎn)(最壞復(fù)雜度O(N) )。在與抖音隱私合規(guī)團(tuán)隊(duì)的合作研發(fā)中我們就發(fā)現(xiàn)了類似問(wèn)題。它們的一個(gè)重要業(yè)務(wù)場(chǎng)景:要橫向遍歷某一個(gè) array 的子節(jié)點(diǎn),查找是否有違規(guī)數(shù)據(jù)并進(jìn)行整行擦除。這種場(chǎng)景下,直接基于原始字節(jié)流進(jìn)行查找和插入可能會(huì)帶來(lái)大量重復(fù)的skip 定位、數(shù)據(jù)拷貝開(kāi)銷,最終導(dǎo)致性能劣化。因此我們需要一種高效的反序列化(帶有指針)結(jié)構(gòu)表示來(lái)處理數(shù)據(jù)。根據(jù)以往經(jīng)驗(yàn),我們想到了DOM(Document Object Model),這種結(jié)構(gòu)被廣泛運(yùn)用在 JSON 的泛型解析場(chǎng)景中(如 rappidJSON、sonic/ast),并且性能相比 map+interface 泛型要好很多。

要用 DOM 來(lái)描述一個(gè) Thrift 結(jié)構(gòu)體,首先需要一個(gè)能準(zhǔn)確描述數(shù)據(jù)節(jié)點(diǎn)之間的關(guān)系的定位方式—— Path。其類型應(yīng)該包括 list index、map key 以及 struct field id等。

typePathTypeuint8

const(
PathFieldIdPathType=1+iota//STRUCT下字段ID
PathFieldName//STRUCT下字段名稱
PathIndex//SET/LIST下的序列號(hào)
PathStrKey//MAP下的stringkey
PathIntkey//MAP下的integerkey
PathObjKey//MAP下的objectkey
)

typePathNodestruct{
Path//相對(duì)父節(jié)點(diǎn)路徑
Node//原始數(shù)據(jù)單元
Next[]PathNode//存儲(chǔ)子節(jié)點(diǎn)
}

在 Path 的基礎(chǔ)上,我們組合對(duì)應(yīng)的數(shù)據(jù)單元Node,然后再通過(guò)一個(gè)Next 數(shù)組動(dòng)態(tài)存儲(chǔ)子節(jié)點(diǎn),便可以組裝成一個(gè)類似于BTree的泛型結(jié)構(gòu)。

9604321c-c8f0-11ed-bfe3-dac502259ad0.png

圖2 thrift DOM 數(shù)據(jù)結(jié)構(gòu)

這種泛型結(jié)構(gòu)比 map+interface 要好在哪呢?首先,底層的數(shù)據(jù)單元 Node 都是對(duì)原始 thrift data 的引用,沒(méi)有轉(zhuǎn)換 interface 帶來(lái)的二進(jìn)制編解碼開(kāi)銷;其次,我們的設(shè)計(jì)保證所有樹(shù)節(jié)點(diǎn) PathNode 的內(nèi)存結(jié)構(gòu)是完全一樣,并且由于父子關(guān)系的底層核心容器是 slice, 我們又可以更進(jìn)一步采用內(nèi)存池技術(shù),將整個(gè) DOM 樹(shù)的子節(jié)點(diǎn)內(nèi)存分配與釋放都進(jìn)行池化從而避免調(diào)用 go 堆內(nèi)存管理。測(cè)試結(jié)果表明,在理想場(chǎng)景下(后續(xù)反序列化的DOM樹(shù)節(jié)點(diǎn)數(shù)量小于等于之前反序列化節(jié)點(diǎn)數(shù)量的最大值——這由于內(nèi)存池本身的緩沖效應(yīng)基本可以保證),內(nèi)存分配次數(shù)可為0,性能提升200%?。ㄒ?jiàn)【性能測(cè)試-全量序列化/反序列化】部分)。

03

性能測(cè)試

這里我們分別定義簡(jiǎn)單(Small)、復(fù)雜(Medium) 兩個(gè)基準(zhǔn)結(jié)構(gòu)體分別在比較 不同數(shù)據(jù)量級(jí) 下的性能,同時(shí)添加簡(jiǎn)單部分(SmallPartial)、復(fù)雜部分(MediumPartial) 兩個(gè)對(duì)應(yīng)子集,用于【反射-裁剪】場(chǎng)景的性能比較:

  • Small:114B,6個(gè)有效字段
  • SmallPartial:small 的子集,55B,3個(gè)有效字段
  • Medium: 6455B,284個(gè)有效字段
  • MediumPartial: medium 的子集,1922B,132個(gè)有效字段

Small:https://github.com/cloudwego/dynamicgo/blob/main/testdata/idl/baseline.thrift#L3

Medium:https://github.com/cloudwego/dynamicgo/blob/main/testdata/idl/baseline.thrift#L12

SmallPartial:https://github.com/cloudwego/dynamicgo/blob/main/testdata/idl/baseline.thrift#L12

MediumPartial:https://github.com/cloudwego/dynamicgo/blob/main/testdata/idl/baseline.thrift#L36

其次,我們依據(jù)上述業(yè)務(wù)場(chǎng)景劃分為 反射、協(xié)議轉(zhuǎn)換、全量序列化/反序列化 三套 API,并以代碼生成庫(kù)kitex/FastAPI、泛化調(diào)用庫(kù)kitex/generic、JSON 庫(kù)sonic為基準(zhǔn)進(jìn)行性能測(cè)試。其它測(cè)試環(huán)境均保持一致:

  • Go 1.18.1
  • CPU intel i9-9880H 2.3GHZ
  • OS macOS Monterey 12.6

kitex/FastAPI:https://github.com/cloudwego/kitex/blob/aed28371eb88b2668854759ce9f4666595ebc8de/pkg/remote/codec/thrift/thrift.go

kitex/generic:https://github.com/cloudwego/kitex/tree/develop/pkg/generic

sonic:https://github.com/bytedance/sonic

反射

1. 代碼

dynamicgo/testdata/baseline_tg_test.go

2. 用例

  • GetOne:查找字節(jié)流中最后1個(gè)數(shù)據(jù)字段
  • GetMany:查找前中后5個(gè)數(shù)據(jù)字段
  • MarshalMany:將 GetMany 中的結(jié)果進(jìn)行二次序列化
  • SetOne:設(shè)置最后一個(gè)數(shù)據(jù)字段
  • SetMany:設(shè)置前中后3個(gè)節(jié)點(diǎn)數(shù)據(jù)
  • MarshalTo:將大 Thrift 數(shù)據(jù)包裁剪為小 thrift 數(shù)據(jù)包 (Small -> SmallPartial 或 Medium -> MediumParital)
  • UnmarshalAll+MarshalPartial:代碼生成/泛化調(diào)用方式裁剪——先反序列化全量數(shù)據(jù)再序列化部分?jǐn)?shù)據(jù)。效果等同于 MarshalTo。

3. 結(jié)果

  • 簡(jiǎn)單(ns/OP)
962bbf62-c8f0-11ed-bfe3-dac502259ad0.png
  • 復(fù)雜(ns/OP)
965b93d6-c8f0-11ed-bfe3-dac502259ad0.png

4. 結(jié)論

  • dynamicgo 一次查找+寫(xiě)入 開(kāi)銷大約為代碼生成方式的 2 ~ 1/3、為泛化調(diào)用方式的 1/12 ~ 1/15,并隨著數(shù)據(jù)量級(jí)增大優(yōu)勢(shì)加大;
  • dynamicgo thrift 裁剪 開(kāi)銷接近于代碼生成方式、約為泛化調(diào)用方式的 1/10~1/6,并且隨著數(shù)據(jù)量級(jí)增大優(yōu)勢(shì)減弱。

協(xié)議轉(zhuǎn)換

1. 代碼

  • JSON2Thrift:dynamicgo/testdata/baseline_j2t_test.go
  • ThriftToJSON:dynamicgo/testdata/baseline_t2j_test.go

2. 用例

  • JSON2thrift:JSON 數(shù)據(jù)轉(zhuǎn)換為等價(jià)結(jié)構(gòu)的 thrift 數(shù)據(jù)
  • thrift2JSON:將 thrift 數(shù)據(jù)轉(zhuǎn)換為等價(jià)結(jié)構(gòu)的 JSON 數(shù)據(jù)
  • sonic + kitex-fast:表示通過(guò) sonic 處理 json 數(shù)據(jù)(有結(jié)構(gòu)體),通過(guò)kitex代碼生成處理thrift數(shù)據(jù)

3. 結(jié)果

  • 簡(jiǎn)單(ns/OP)
96762c8c-c8f0-11ed-bfe3-dac502259ad0.png
  • 復(fù)雜(ns/OP)
969ea66c-c8f0-11ed-bfe3-dac502259ad0.png

4. 結(jié)論

  • dynamicgo 協(xié)議轉(zhuǎn)換開(kāi)銷約為代碼生成方式的 1~2/3、泛化調(diào)用方式的 1/4~1/9,并且隨著數(shù)據(jù)量級(jí)增大優(yōu)勢(shì)加大;

全量序列化/反序列化

1. 代碼

dynamicgo/testdata/baseline_tg_test.go#BenchmarkThriftGetAll

2. 用例

  • UnmarshalAll:反序列化所有字段。其中對(duì)于 dynamicgo 有兩種模式:

    • new:每次重新分配 DOM 內(nèi)存;
    • reuse:使用內(nèi)存池復(fù)用 DOM 內(nèi)存。
  • MarshalAll:序列化所有字段。

3. 結(jié)果

  • 簡(jiǎn)單(ns/OP)
96b50a74-c8f0-11ed-bfe3-dac502259ad0.png
  • 復(fù)雜(ns/OP)
96cd3108-c8f0-11ed-bfe3-dac502259ad0.png

4. 結(jié)論

  • dynamicgo 全量序列化 開(kāi)銷約為代碼生成方式的 6~3倍、泛化調(diào)用方式的 1/4~1/2,并且隨著數(shù)據(jù)量級(jí)增大優(yōu)勢(shì)減弱;
  • Dynamigo 全量反序列化+內(nèi)存復(fù)用 場(chǎng)景下開(kāi)銷約為代碼生成方式的 1.8~0.7、泛化調(diào)用方式的 1/13~1/8,并且隨著數(shù)據(jù)量級(jí)增大優(yōu)勢(shì)加大。

04

應(yīng)用與展望

當(dāng)前,dynamicgo 已經(jīng)應(yīng)用到許多重要業(yè)務(wù)場(chǎng)景中,包括:

  1. 業(yè)務(wù)隱私合規(guī) 中間件(thrift 反射);
  2. 抖音某 BFF 服務(wù)下游數(shù)據(jù)按需下發(fā)(thrift 裁剪);
  3. 字節(jié)跳動(dòng)某 API 網(wǎng)關(guān)協(xié)議轉(zhuǎn)換(JSON<>thrift 協(xié)議轉(zhuǎn)換)。

并且逐步上線并取得收益。目前 dynamic 還在迭代中,接下來(lái)的工作包括:

  1. 集成到 Kitex 泛化調(diào)用模塊中,為更多用戶提供高性能的 thrift 泛化調(diào)用模塊;
  2. Thrift DOM 接入 DSL(GraphQL)組件,進(jìn)一步提升 BFF 動(dòng)態(tài)網(wǎng)關(guān)性能;
  3. 支持 Protobuf 協(xié)議。

也歡迎感興趣的個(gè)人或團(tuán)隊(duì)參與進(jìn)來(lái),共同開(kāi)發(fā)!

項(xiàng)目地址

GitHub:https://github.com/cloudwego

官網(wǎng):www.cloudwego.io


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編解碼
    +關(guān)注

    關(guān)注

    1

    文章

    145

    瀏覽量

    20108
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3678

    瀏覽量

    43814
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    269

    瀏覽量

    24987

原文標(biāo)題:抖音內(nèi)部使用的Go基礎(chǔ)庫(kù)開(kāi)源,高性能動(dòng)態(tài)處理RPC數(shù)據(jù)

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    會(huì)go語(yǔ)言能做什么工作?

    讓程序員更容易地進(jìn)行維護(hù)和修改。它融合了傳統(tǒng)編譯型語(yǔ)言的高效性和腳本語(yǔ)言的易用性和富于表達(dá)性。Go語(yǔ)言作為服務(wù)器編程語(yǔ)言,很適合處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)、分布式系統(tǒng)、
    發(fā)表于 03-22 15:03

    香山是什么?“香山” 高性能開(kāi)源 RISC-V 處理器項(xiàng)目介紹

    香山是什么2019 年,在中國(guó)科學(xué)院支持下,由 中國(guó)科學(xué)院計(jì)算技術(shù)研究所 牽頭發(fā)起 “香山” 高性能開(kāi)源 RISC-V 處理器項(xiàng)目,研發(fā)出目前國(guó)際上性能最高的開(kāi)源
    發(fā)表于 04-07 14:20

    基于LabView平臺(tái)的齒輪箱性能動(dòng)態(tài)測(cè)試與診斷_李貴明

    基于LabView平臺(tái)的齒輪箱性能動(dòng)態(tài)測(cè)試與診斷_李貴明
    發(fā)表于 03-18 09:41 ?3次下載

    移動(dòng)卡全新發(fā)布免流量刷你會(huì)辦理嗎?

    “像一顆海草海草海草海草,隨波飄搖……”每天晚上睡覺(jué)前刷刷上班坐在公交車上刷刷閑著沒(méi)事總是要刷刷
    的頭像 發(fā)表于 07-16 15:14 ?7.6w次閱讀

    到底因?yàn)槭裁椿鸪蛇@樣?

    7月16日,官方正式宣布,全球月活躍用戶數(shù)超過(guò)5億。這是首次對(duì)外公布自己的全球月活躍
    的頭像 發(fā)表于 09-01 15:54 ?3267次閱讀

    怎么直播?三種方法教你怎么開(kāi)直播

    很多朋友不知道怎么直播,找不到直播的入口。 小編為了學(xué)習(xí)如何在直播,也是在百度搜索了
    發(fā)表于 12-10 13:40 ?1.6w次閱讀

    對(duì)數(shù)據(jù)造假等各類違規(guī)行為進(jìn)行實(shí)時(shí)攔截

    截至2020年8月,包含火山版在內(nèi),的日活躍用戶已經(jīng)超過(guò)了6億。隨著的火爆,相關(guān)第三
    的頭像 發(fā)表于 12-01 09:12 ?5999次閱讀

    支付在APP內(nèi)正式上線

    1月19日 消息:據(jù)支付百科消息,支付已在APP內(nèi)正式上線,在APP內(nèi)購(gòu)物結(jié)算時(shí),除
    的頭像 發(fā)表于 01-19 15:50 ?4871次閱讀

    回應(yīng)封殺騰訊外鏈傳聞

    據(jù)報(bào)道,針對(duì)近日社交媒體上流傳的“封殺騰訊”傳聞,回應(yīng)稱為禁止財(cái)經(jīng)、醫(yī)療垂類外鏈引流。
    的頭像 發(fā)表于 02-02 11:35 ?2487次閱讀

    再回應(yīng)起訴騰訊

    2月2日,再次以聲明形式回應(yīng)對(duì)騰訊的起訴。聲明中,稱,騰訊所謂的“惡意構(gòu)陷”沒(méi)有任何依據(jù);所謂“違規(guī)獲取微信用戶個(gè)人信息”不屬實(shí);
    的頭像 發(fā)表于 02-03 09:13 ?2716次閱讀

    正式起訴騰訊壟斷

    昨天下午,微博、知乎等多個(gè)社交平臺(tái)均傳出“封殺騰訊”的消息。
    的頭像 發(fā)表于 02-03 11:03 ?2475次閱讀

    快手APP大眼特效開(kāi)源實(shí)現(xiàn),甜美系小姐姐親做效果演示

    短視頻中的大眼特效有很多人玩,這篇就講一下怎么實(shí)現(xiàn)。本文為《美顏效果開(kāi)源實(shí)現(xiàn),從AI到美顏全流程講解》姐妹篇,很多代碼和...
    發(fā)表于 01-26 18:45 ?1次下載
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>快手APP大眼特效<b class='flag-5'>開(kāi)源</b>實(shí)現(xiàn),甜美系小姐姐親做效果演示

    嵌入式Linux應(yīng)用開(kāi)發(fā)之內(nèi)置RPC

    標(biāo)準(zhǔn)庫(kù)RPC默認(rèn)采用Go語(yǔ)言特有的gob編碼,因此從其它語(yǔ)言調(diào)用Go語(yǔ)言實(shí)現(xiàn)的RPC服務(wù)將比較困難。雖然可以通過(guò)額外的工作支持跨語(yǔ)言,但是
    發(fā)表于 05-13 09:46 ?880次閱讀

    拒絕小屏 躺著大屏刷

    隨著短視頻的興起,刷已經(jīng)成為大多數(shù)人茶余飯后的一種消遣方式,但盯著一塊小小的手機(jī)屏幕刷實(shí)在是有點(diǎn)辛苦,正確的打開(kāi)方式應(yīng)該是躺在沙發(fā)上使用大屏電視,這樣刷
    的頭像 發(fā)表于 07-14 11:37 ?1590次閱讀
    拒絕小屏 躺著大屏刷<b class='flag-5'>抖</b><b class='flag-5'>音</b>

    Tars框架使用NIO進(jìn)行網(wǎng)絡(luò)編程的源碼分析

    Tars是騰訊開(kāi)源的支持多語(yǔ)言的高性能RPC框架,起源于騰訊內(nèi)部2008年至今一直使用的統(tǒng)一應(yīng)用框架TAF(Total Application Framework),目前支持C++、J
    的頭像 發(fā)表于 06-26 17:31 ?998次閱讀
    Tars框架使用NIO進(jìn)行網(wǎng)絡(luò)編程的源碼分析