Изначально мы планировали увеличить память сервера, чтобы вместить большие объемы возвращаемых данных. Однако вместо этого мы предпочитаем реализовать потоковый подход. Этот метод включает в себя запрос всех данных из базы данных, их пакетную обработку и возврат каждого пакета клиенту. Это хорошо работает до определенного размера (около нескольких ГБ, примерно 35 миллионов записей). Однако, как только мы превысим этот предел, я сталкиваюсь с ошибкой на клиенте: ответ завершился преждевременно. (Ответ закончился). Несмотря на это, все журналы сервера показывают, что приложение все еще работает и обрабатывает данные, а база данных и контейнеры работают нормально.
Учитывая, что для репликации проблемы требуется значительный объем данных , я пытаюсь определить, кроется ли проблема в коде или это ограничение Newtonsoft.JSON. В последнем случае может потребоваться переход на System.Text.Json (или другую альтернативу).
Код сервера:
Код: Выделить всё
[AcceptVerbs("POST", Route = "stream")]
public async Task StreamAsync([FromBody] Request request)
{
await using var sw = new StreamWriter(Response.Body, leaveOpen: true);
await foreach (var response in StreamDataAsync(request))
await StreamResponse(sw, response); // returns approximately 20k records at a time
}
private async Task StreamResponse(StreamWriter sw, object response)
{
await sw.WriteLineAsync(JsonConvert.SerializeObject(response));
await sw.FlushAsync();
}
Код: Выделить всё
try
{
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
using (var stream = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(stream))
{
string streamedResponse = null;
while ((streamedResponse = await reader.ReadLineAsync()) != null)
{
results.Add(JsonSerializer.Deserialize(streamedResponse));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // Response Ended Prematurely Here
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... newtonsoft