Dlang vibe.d Эффективность обслуживания RESTful

Спасибо за помощь.

Вопрос: Почему моя служба REST, похоже, работает так плохо с использованием интерфейсов отдыха в dlang vibe.d по сравнению с созданием обработчиков запросов вручную?

Больше информации: Я прототипировал сервис RESTful, используя библиотеку vibe.d в dlang. Я запускаю тест, когда клиент отправляет запросы GET и POST на сервер с полезной нагрузкой определенного размера, например 2048 байт (т.е. ответ GET будет иметь 2k, запрос POST будет иметь 2k).

Я использую API-интерфейс " registerRestInterface " и " RestInterfaceClient " в библиотеке vibe.d для создания моего типа сервера и клиента вроде этого...

Сервер:

auto routes = new URLRouter;
registerRestInterface(routes, new ArtifactArchive());
auto settings = new HTTPServerSettings();
settings.port = port;
settings.bindAddresses = [host];
settings.options |= HTTPServerOption.distribute;
listenHTTP(settings, routes);
runEventLoop();

Клиент:

IArtifactArchive archive = new RestInterfaceClient!IArtifactArchive(endpoint)
IArtifactArchive.Payload result;
result = archive.getContents(info.FileDescriptor, offset, info.BlockSize);

Я не делаю ничего необычного в моем интерфейсе. Просто заполняя массив байтов и передавая его. Я знаю, что производительность зависит от многих разных вещей; однако я, похоже, вижу скорость передачи 160 КБ при использовании интерфейсов REST в vibe.d и примерно 5 МБ скорости передачи при использовании ручных обработчиков запросов HTTP, таких как:

void ManualHandleRequest(HTTPServerRequest req, HTTPServerResponse res) ...
listenHTTP(settings, &ManualHandleRequest);

Мне очень нравится API интерфейса REST, но я не могу терпеть такую потерю производительности, чтобы использовать его. Любые мысли о том, почему это кажется намного медленнее, чем другой метод? Возможно, я настраиваю что-то неправильно или что-то не хватает. Я несколько новичок в языке программирования D и в библиотеке vibe.d.

Спасибо за ваше время!

1 ответ

Я подозреваю, что с помощью специального обработчика запросов вы фактически пишете ответ как массив байтов. Генератор интерфейса REST сериализует все возвращаемые данные в JSON по умолчанию, что создает огромные накладные расходы по сравнению с необработанным массивом.

Это всего лишь случайное предположение, хотя мне нужно увидеть, что реальная реализация метода REST позволяет точно и/или предложить решение.

licensed under cc by-sa 3.0 with attribution.