中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站用哪些系統(tǒng)做的比較好用如何網(wǎng)站推廣

網(wǎng)站用哪些系統(tǒng)做的比較好用,如何網(wǎng)站推廣,引航博景網(wǎng)站做的很好嗎,展覽策劃正如你可能之前看到的,Discord去年發(fā)布了一篇有價(jià)值的文章,討論了他們成功存儲(chǔ)了數(shù)萬(wàn)億條消息。雖然有很多關(guān)于這篇文章的YouTube視頻和文章,但我認(rèn)為這篇文章中一個(gè)名為“數(shù)據(jù)服務(wù)為數(shù)據(jù)服務(wù)”的部分沒(méi)有得到足夠的關(guān)注。在這篇文章中&#…

正如你可能之前看到的,Discord去年發(fā)布了一篇有價(jià)值的文章,討論了他們成功存儲(chǔ)了數(shù)萬(wàn)億條消息。雖然有很多關(guān)于這篇文章的YouTube視頻和文章,但我認(rèn)為這篇文章中一個(gè)名為“數(shù)據(jù)服務(wù)為數(shù)據(jù)服務(wù)”的部分沒(méi)有得到足夠的關(guān)注。在這篇文章中,我們將討論Discord對(duì)數(shù)據(jù)服務(wù)的方法,并探討如何利用Golang的并發(fā)特性來(lái)減少特定情況下的數(shù)據(jù)庫(kù)負(fù)載。

數(shù)據(jù)服務(wù)拯救熱分區(qū)

如你所知,消息和頻道是Discord中最常用的組件。讓我們想象一個(gè)場(chǎng)景:一個(gè)擁有50萬(wàn)成員的頻道的管理員提到@everyone。會(huì)發(fā)生什么?成千上萬(wàn)個(gè)同時(shí)的請(qǐng)求直接指向那個(gè)數(shù)據(jù)庫(kù)分區(qū),所有請(qǐng)求的目標(biāo)都是檢索相同的消息。這種模式重復(fù)發(fā)生,直到該分區(qū)無(wú)法回應(yīng)其他請(qǐng)求。

img

Discord引入了一個(gè)位于Python API和數(shù)據(jù)庫(kù)集群之間的中間服務(wù) — 他們稱(chēng)之為數(shù)據(jù)服務(wù)。這個(gè)服務(wù)大致包含每個(gè)查詢(xún)一個(gè)gRPC端點(diǎn),沒(méi)有任何業(yè)務(wù)邏輯。對(duì)Discord來(lái)說(shuō),這個(gè)服務(wù)的重要特性就是請(qǐng)求合并。

請(qǐng)求合并

正如我們之前討論過(guò)的,每當(dāng)在一個(gè)龐大的頻道中有提及時(shí),就會(huì)有大量類(lèi)似的請(qǐng)求直接指向數(shù)據(jù)庫(kù)分區(qū)。通過(guò)合并這些請(qǐng)求,如果多個(gè)用戶(hù)請(qǐng)求相同的數(shù)據(jù)庫(kù)行,我們可以將這些請(qǐng)求合并成一個(gè)選擇查詢(xún),并執(zhí)行該查詢(xún)。

img

通過(guò)使用數(shù)據(jù)服務(wù)而不是直接連接到數(shù)據(jù)庫(kù),我們可以實(shí)現(xiàn)許多令人興奮的功能,比如批量查詢(xún),這些功能可以顯著減少數(shù)據(jù)庫(kù)開(kāi)銷(xiāo),并改善查詢(xún)的平均值,特別是第99百分位數(shù)。

使用Golang實(shí)現(xiàn)簡(jiǎn)單的請(qǐng)求合并

與許多其他公司一樣,Discord使用Python作為其主要的后端語(yǔ)言。無(wú)論是微服務(wù)還是單體架構(gòu),后端服務(wù)通常直接連接到數(shù)據(jù)源進(jìn)行查詢(xún)。雖然Python確實(shí)是一種多功能語(yǔ)言,但在并發(fā)性方面存在一些不足。使用Python實(shí)現(xiàn)并發(fā)和高吞吐量的服務(wù)可能有些挑戰(zhàn),而性能與用C++、Rust和Golang等編譯語(yǔ)言編寫(xiě)的類(lèi)似服務(wù)相比,往往會(huì)較低。

在進(jìn)行任何操作之前,讓我們模擬一下提到的情況。假設(shè)服務(wù)總共收到了5,000個(gè)請(qǐng)求,其中并發(fā)數(shù)為1,000。

  • 總請(qǐng)求數(shù): 5,000
  • 并發(fā)數(shù): 1,000
  • 需要檢索的唯一消息數(shù): 100
type Message struct {gorm.ModelText stringUser string // some random properties that a message row may have
}func generateRandomData(db *gorm.DB) {for i := 0; i < 100; i++ {msg := &messages.Message{Text: fmt.Sprintf("Message #%d", i)}db.Save(msg)}
}

我使用Gorm構(gòu)建了一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)模型來(lái)表示**Message(消息)**表,然后向表中填充了100條虛擬消息。

e := echo.New()
e.GET("/randomMessage", func(c echo.Context) error {randomMessageID := rand.Intn(100)var msg messages.Messageif err := db.Where("id=?", randomMessageID).First(&msg).Error; err != nil {return err}return c.JSON(200, msg)
})
e.Logger.Fatal(e.Start(":1323"))

我創(chuàng)建了一個(gè)簡(jiǎn)單的端點(diǎn)來(lái)模擬對(duì)0到100之間的隨機(jī)ID進(jìn)行SELECT查詢(xún)?,F(xiàn)在我們可以對(duì)這個(gè)端點(diǎn)進(jìn)行基準(zhǔn)測(cè)試,模擬在這種情況下會(huì)發(fā)生什么。

img

img

  • 平均每秒請(qǐng)求數(shù) (RPS): 300
  • 平均響應(yīng)時(shí)間: 3.2秒
  • 50% 響應(yīng)時(shí)間: 546毫秒
  • 99% 響應(yīng)時(shí)間: 14.7秒

如果我們有10秒的超時(shí)策略,大約有2%的請(qǐng)求將收不到響應(yīng)?,F(xiàn)在讓我們改變代碼。Golang有一個(gè)名為“single flight”的內(nèi)置包。這個(gè)包提供了重復(fù)函數(shù)調(diào)用抑制機(jī)制。一般來(lái)說(shuō),你給它一個(gè)鍵和一個(gè)函數(shù),而不是多次運(yùn)行該函數(shù),SingleFlight會(huì)暫時(shí)保持其他調(diào)用,直到第一次調(diào)用完成其請(qǐng)求并以相同的結(jié)果作出響應(yīng)。

var g = singleflight.Group{}
e.GET("/randomMessage", func(c echo.Context) error {randomMessageID := rand.Intn(100)msg, err, _ := g.Do(fmt.Sprint(randomMessageID), func() (interface{}, error) {var msg messages.Messageif err := db.Where("id=?", randomMessageID).First(&msg).Error; err != nil {return nil, err}return &msg, nil})if err != nil {return err}return c.JSON(200, msg)
})

func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool)

Do 執(zhí)行并返回給定函數(shù)的結(jié)果,確保同一時(shí)間針對(duì)給定鍵只有一個(gè)執(zhí)行過(guò)程。如果出現(xiàn)重復(fù),重復(fù)的調(diào)用者會(huì)等待原始調(diào)用完成并接收相同的結(jié)果。返回值 shared 表示是否將 v 給了多個(gè)調(diào)用者。

現(xiàn)在讓我們重新運(yùn)行模擬并比較結(jié)果。

img

img

  • 平均每秒請(qǐng)求數(shù) (RPS): 2309
  • 平均響應(yīng)時(shí)間: 433毫秒
  • 50% 響應(yīng)時(shí)間: 389毫秒
  • 99% 響應(yīng)時(shí)間: 777毫秒

正如你所看到的,僅使用了一個(gè)簡(jiǎn)單的技術(shù)就將第99百分位數(shù)減少了14秒,新方法支持的每秒請(qǐng)求次數(shù)提高了7.6倍。

結(jié)論

從那時(shí)起我們就注意到,通過(guò)優(yōu)化數(shù)據(jù)庫(kù)查詢(xún),可以大大提高應(yīng)用程序的整體性能。雖然我們討論的方法是情景性的,但Discord已經(jīng)使用了一年多,對(duì)他們有很大幫助。

你應(yīng)該知道,如果你使用數(shù)據(jù)服務(wù),你將面臨其他的復(fù)雜情況。例如,你可能會(huì)有多個(gè)數(shù)據(jù)服務(wù)實(shí)例,而你的Python API必須有一種機(jī)制將類(lèi)似的請(qǐng)求發(fā)送到同一個(gè)實(shí)例。

http://m.risenshineclean.com/news/29499.html

相關(guān)文章:

  • 事件營(yíng)銷(xiāo)方案模板寧波seo外包公司
  • 網(wǎng)站建設(shè)新趨勢(shì)國(guó)內(nèi)新聞大事
  • 樹(shù)形菜單的網(wǎng)站代碼網(wǎng)絡(luò)運(yùn)營(yíng)推廣具體做什么工作
  • 做門(mén)戶(hù)類(lèi)網(wǎng)站報(bào)價(jià)上海疫情又要爆發(fā)了
  • 網(wǎng)站服務(wù)器租用有什么好學(xué)大教育一對(duì)一收費(fèi)價(jià)格表
  • 郴州企業(yè)網(wǎng)站建設(shè)制作營(yíng)銷(xiāo)案例100例
  • 網(wǎng)站建站建設(shè)網(wǎng)站中國(guó)企業(yè)500強(qiáng)排行榜
  • a0000網(wǎng)站建設(shè)2022年seo最新優(yōu)化策略
  • 博山網(wǎng)站建設(shè)網(wǎng)頁(yè)制作基礎(chǔ)教程
  • 四川城鄉(xiāng)住房建設(shè)廳官方網(wǎng)站seo搜索優(yōu)化公司排名
  • 新華社官網(wǎng)百度推廣怎么優(yōu)化
  • 深圳平湖網(wǎng)站建設(shè)有免費(fèi)推廣平臺(tái)
  • 東莞網(wǎng)站推廣優(yōu)化建設(shè)seo站長(zhǎng)工具
  • 吳橋縣網(wǎng)站建設(shè)價(jià)格沈陽(yáng)頭條今日頭條新聞最新消息
  • 網(wǎng)站做分站360收錄批量查詢(xún)
  • 多少網(wǎng)站域名采用中文四川全網(wǎng)推網(wǎng)絡(luò)推廣
  • 服務(wù)器的做網(wǎng)站空間北京疫情最新新聞
  • 重慶網(wǎng)站建設(shè)最大seo自然排名關(guān)鍵詞來(lái)源的優(yōu)缺點(diǎn)
  • 赤峰做網(wǎng)站的公司鄭州seo優(yōu)化顧問(wèn)熱狗
  • 商城界面設(shè)計(jì)武漢seo服務(wù)多少錢(qián)
  • 網(wǎng)站改版 域名百度愛(ài)企查電話(huà)人工服務(wù)總部
  • 武漢網(wǎng)站制作模板小程序推廣方案
  • 怎么做bt爬蟲(chóng)網(wǎng)站seo專(zhuān)員是什么職位
  • 醫(yī)美三方網(wǎng)站怎么做首頁(yè)百度
  • 做軟件跟網(wǎng)站哪個(gè)難全國(guó)各城市疫情高峰感染進(jìn)度
  • 廈門(mén)網(wǎng)站建設(shè)公司推薦windows優(yōu)化大師破解版
  • 發(fā)外鏈的網(wǎng)站都要企業(yè)注冊(cè)需要優(yōu)化的地方
  • 做動(dòng)態(tài)網(wǎng)站怎樣配置iisb2b商務(wù)平臺(tái)
  • 專(zhuān)業(yè)網(wǎng)站制作公司教程長(zhǎng)尾關(guān)鍵詞什么意思
  • 小白如何免費(fèi)做網(wǎng)站阿里巴巴國(guó)際站關(guān)鍵詞推廣