国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

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

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

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

數據服務拯救熱分區(qū)

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

img

Discord引入了一個位于Python API和數據庫集群之間的中間服務 — 他們稱之為數據服務。這個服務大致包含每個查詢一個gRPC端點,沒有任何業(yè)務邏輯。對Discord來說,這個服務的重要特性就是請求合并。

請求合并

正如我們之前討論過的,每當在一個龐大的頻道中有提及時,就會有大量類似的請求直接指向數據庫分區(qū)。通過合并這些請求,如果多個用戶請求相同的數據庫行,我們可以將這些請求合并成一個選擇查詢,并執(zhí)行該查詢。

img

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

使用Golang實現(xiàn)簡單的請求合并

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

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

  • 總請求數: 5,000
  • 并發(fā)數: 1,000
  • 需要檢索的唯一消息數: 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構建了一個簡單的數據庫模型來表示**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)建了一個簡單的端點來模擬對0到100之間的隨機ID進行SELECT查詢?,F(xiàn)在我們可以對這個端點進行基準測試,模擬在這種情況下會發(fā)生什么。

img

img

  • 平均每秒請求數 (RPS): 300
  • 平均響應時間: 3.2秒
  • 50% 響應時間: 546毫秒
  • 99% 響應時間: 14.7秒

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

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í)行并返回給定函數的結果,確保同一時間針對給定鍵只有一個執(zhí)行過程。如果出現(xiàn)重復,重復的調用者會等待原始調用完成并接收相同的結果。返回值 shared 表示是否將 v 給了多個調用者。

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

img

img

  • 平均每秒請求數 (RPS): 2309
  • 平均響應時間: 433毫秒
  • 50% 響應時間: 389毫秒
  • 99% 響應時間: 777毫秒

正如你所看到的,僅使用了一個簡單的技術就將第99百分位數減少了14秒,新方法支持的每秒請求次數提高了7.6倍。

結論

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

你應該知道,如果你使用數據服務,你將面臨其他的復雜情況。例如,你可能會有多個數據服務實例,而你的Python API必須有一種機制將類似的請求發(fā)送到同一個實例。

http://m.aloenet.com.cn/news/29499.html

相關文章:

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