亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang中的生產者消費者-并發與并行?

golang中的生產者消費者-并發與并行?

Go
夢里花落0921 2021-11-29 16:07:09
我正在研究純粹使用 Golang 的后端架構。我有一個 API,用于將文件上傳到 golang 服務器,然后我將文件傳輸到云存儲(從 golang 服務器本身)?,F在,我希望兩個傳輸都是獨立的,這樣最終用戶就不必在上傳文件后等待響應。End User -> Golang Server ->[Concurrency/Parallelism] -> Cloud Storage現在,我想到了兩種方法:用戶完成上傳并將文件傳輸到云后,立即創建一個 goroutine。將文件處理程序插入隊列,不同的進程將讀取此隊列并將文件傳輸到云存儲(多生產者 - 單消費者模型)。我找到了使用 goroutine 和 channels 執行此操作的示例,但我認為這將創建與上傳一樣多的 goroutine。我想使用第二個選項,但無法理解如何在 golang 中進行操作?另外,請建議我是否使用了錯誤的方法,并且還有其他一些有效的方法可以做到這一點。更新有關要求和約束的詳細信息:1. 我使用 AWS S3 作為云存儲。如果在某個時候,從 Go 服務器到 Amazon S3 的上傳失敗,文件處理程序應該保持原樣以記錄失敗的上傳。(我沒有優先考慮這一點,我可能會根據客戶的反饋進行更改)2.上傳到 Amazon S3 成功完成后,文件將立即從 Go 服務器中刪除,以避免重復上傳。此外,如果文件以相同的名稱上傳,它將在 Amazon S3 中被替換。3.正如評論中所指出的,我可以使用頻道作為隊列。是否可以使用 Go 的 Channels 和 goroutines 來設計上述架構?
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

上傳文件的用戶可以容忍錯誤,然后重試。但是當上傳的文件只存在于它上傳到的機器上時存在危險,并且在上傳到云存儲之前出現問題。在這種情況下,文件將丟失,這對用戶來說將是一個無賴。

這是通過良好的架構解決的。這是一個先進先出的隊列模式

這種模式的一個最受歡迎的 Go 實現是go-workers,它可能由Redis數據庫支持。

假設在任何給定時間有n個服務器運行您的服務。假設您的后端代碼編譯了兩個單獨的二進制文件,一個服務器二進制文件和一個工作二進制文件。

理想情況下,接受文件上傳的機器都會掛載一個共享的網絡文件系統,這樣:

  1. 用戶上傳文件到服務器

    一種。服務器將一條記錄添加到工作隊列中,該記錄包含來自 Redis 存儲的唯一 ID。

    灣 這個唯一的 ID 用于創建文件名,文件直接從用戶上傳到 NFS 服務器上的臨時存儲。請注意,該文件永遠不會駐留在運行服務器的機器的存儲中。

  2. 文件由工人上傳到云存儲

    一種。worker從具有唯一 ID 的工作隊列中取出下一個待辦事項記錄

    灣 使用唯一 ID 在 NFS 服務器上查找文件,工作人員將文件上傳到云存儲

    C。成功后,worker更新工作隊列中的記錄以反映成功

    d. worker刪除 NFS 服務器上的文件

通過將服務器流量和工作隊列大小作為兩個獨立的指標進行監控,可以確定應該分別運行服務器/工作器服務的服務器數量。


查看完整回答
反對 回復 2021-11-29
?
米脂

TA貢獻1836條經驗 獲得超3個贊

Marcio Castilho 寫了一篇關于類似問題的好文章。它可以在使用 golang 處理每分鐘一百萬個請求中找到。

他展示了他所犯的錯誤以及他為糾正這些錯誤所采取的步驟。一般學習通道、goroutines 和并發的使用的好資源。

charneykaye提到的go-workers也是很好的來源。


查看完整回答
反對 回復 2021-11-29
  • 2 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號