我正在使用 Apache Prediction IO 開發推薦引擎。在事件服務器之前,我有一個 GO api,用于偵聽來自客戶和進口商的事件。在客戶使用導入器的特定情況下,我收集導入的身份,并將 json 從導入器 api 發送到 GO api。例如,如果用戶導入一個包含 45000 個數據的 csv,我會將這 45000 個身份以 json 格式發送到 GO api,例如{"barcodes":[...]}. 預測 IO 事件服務器需要特定形狀的數據。type ItemEvent struct { Event string `json:"event"` EntityType string `json:"entityType"` EntityId string `json:"entityId"` Properties map[string][]string `json:"properties"` EventTime time.Time `json:"eventTime"`}type ItemBulkEvent struct { Event string `json:"event"` Barcodes []string `json:"barcodes"` EventTime time.Time `json:"eventTime"`}ItemEvent是我將從 GO Api 發送到事件服務器的最終數據。ItemBulkEvent是我從進口商 api 收到的數據。func HandleItemBulkEvent(w http.ResponseWriter, r *http.Request) { var itemBulk model.ItemBulkEvent err := decode(r,&itemBulk) if err != nil { log.Fatalln("handleitembulkevent -> ",err) util.RespondWithError(w,400,err.Error()) }else { var item model.ItemEvent item.EventTime = itemBulk.EventTime; item.EntityType = "item"; item.Event = itemBulk.Event itemList := make([]model.ItemEvent,0,50) for index, barcode := range itemBulk.Barcodes{ item.EntityId = barcode if (index > 0 && (index % 49) == 0){ itemList = append(itemList, item) go sendBulkItemToEventServer(w,r,itemList)HandleItemBulkEvent是批量更新的處理函數。在這一步中,我應該提到預測 io 的批量上傳。通過 rest api 預測 io 事件服務器每個請求需要 50 個事件。所以我創建了一個包含 50 個上限和一個項目的列表。我使用相同的項目,只是每次都更改身份部分(條形碼)并添加到列表中。在每 50 個項目中,我使用了一個處理函數,將該列表發送到事件服務器,然后清理列表,依此類推。sendBulkItemToEventServer函數編組傳入的項目列表并向預測 io 的事件服務器發出發布請求。在這部分中,當我嘗試使用 5000+- 項目時,它做得很好,但是當我嘗試使用 45000 項目時,應用程序崩潰并出現以下錯誤。知道如何解決這個問題嗎?
2 回答

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
您的程序中有幾個錯誤。運行時錯誤是因為您正在檢查 if err2
is not nil,但是您正在打印err
,而不是err2
. err
為零,因此運行時錯誤。
這意味著err2
不是零,所以你應該看到那個錯誤是什么。
您提到您正在分批發送 50 條消息,但該實現是錯誤的。您將元素添加到itemList
,然后用 that 啟動一個 goroutine itemList
,然后截斷它并再次開始填充。這是一場數據競賽,你的 goroutine 將看到itemList
處理程序正在修改的實例。無需截斷,只需itemList
在向 goroutine 提交一個時創建一個新的,這樣每個 goroutine 都可以擁有自己的副本。
如果您想繼續使用相同的切片,您可以編組切片,然后將 JSON 消息傳遞給 goroutine 而不是切片。
- 2 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消