考虑一个小型Go应用程序,它读取一个2GB以上的大型JSON文件,将JSON数据封送到一个结构体中,并将JSON数据POST到一个Web服务端点。
接收有效负载的Web服务改变了它的功能,现在每个有效负载的大小限制为25MB。在Go语言中解决这个问题的最佳方法是什么?我已经想到了以下方法,但是我不确定这是不是最好的方法:
1.创建一个函数,将大JSON文件拆分为多个较小的文件(最大20MB),然后迭代这些文件,发送多个较小的请求。
与当前用于发送整个JSON负载的函数类似的函数:
func sendDataToService(data StructData) {
payload, err := json.Marshal(data)
if err != nil {
log.Println("ERROR:", err)
}
request, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payload))
if err != nil {
log.Println("ERROR:", err)
}
client := &http.Client{}
response, err := client.Do(request)
log.Println("INFORMATIONAL:", request)
if err != nil {
log.Println("ERROR:", err)
}
defer response.Body.Close()
}
2条答案
按热度按时间uqdfh47h1#
您可以将输入分成块,然后分别发送每个块:
cfh9epnr2#
由于服务器端可以渐进地处理数据,因此我假设可以将大的JSON对象拆分成较小的块。
1.使用HTTP请求
优点:在客户端实现起来非常简单。
缺点:发出数百个HTTP请求可能会很慢。你还需要处理超时-这是额外的复杂性。
*使用WebSocket消息
如果接收端支持WebSockets,则分步流程如下所示:
这种解决方案可能性能更高,因为您不需要像使用HTTP那样在每次发送消息时都连接和断开服务器。
然而,这两种解决方案都假设您需要在服务器端组装所有部分。例如,您可能需要将数据与相关ID沿着发送,以便让服务器知道您正在发送什么文件,并发送一个特定的文件结束消息,以便让服务器知道文件何时结束。在WebSocket服务器的情况下,您可以假设在单个连接会话期间发送整个文件。