У меня есть данные, извлекаемые из Reactive Mongo, которые мне нужно передать через API-интерфейс Spray Rest. Я надеялся сделать это с помощью Chunked Responses. Однако я обнаружил, что Enumerator, который возвращается из Reactive Mongo, способен проталкивать Spray быстрее, чем может обрабатывать сетевое соединение. В результате соединение обрывается.
Мне удалось решить эту проблему с помощью функции Spray Ack в промежуточном действующем субъекте. Это вместе с ожиданием блокировки позволило мне создать обратное давление на перечислитель. Однако я действительно не хочу Await. Я хотел бы найти способ передавать данные через спрей неблокирующим образом.
Это возможно? У меня есть несколько идей, которые могут сработать, если я смогу заполнить недостающие части.
1) Создайте обратное давление на Enumerator неблокирующим образом (не знаю, как это сделать. Предложения?)
2) Разбейте счетчик на более мелкие счетчики. Начинайте использовать каждый счетчик только после завершения предыдущего. Я могу сделать это с помощью актера. Чего мне здесь не хватает, так это способа разбить большой счетчик на более мелкие счетчики.
3) Используйте что-то вроде метода "Enumeratee.take". Где бы я взял какое-то количество записей из Перечислителя, потом, когда буду готов, возьму еще. Это действительно то же самое решение, что и 2), но с немного другой точки зрения. Однако это потребует от счетчика поддерживать состояние. Есть ли способ использовать Enumeratee.take несколько раз против одного и того же счетчика без перезапуска каждый раз с самого начала?
Может ли кто-нибудь предложить какие-либо альтернативные предложения, которые могут работать? Или если это невозможно, пожалуйста, дайте мне знать.
Я использую Play Enumerators 2.3.5.