dlang vibe.d RESTful Сервисное обслуживание
Спасибо за помощь.
Вопрос:
Почему моя служба REST работает так плохо, используя остальные интерфейсы в dlang vibe.d по сравнению с созданием обработчиков запросов вручную?
Дополнительная информация:
Я прототипировал сервис RESTful, используя библиотеку vibe.d в dlang. Я запускаю тест, в котором клиент отправляет запросы GET и POST на сервер с полезной нагрузкой некоторого заданного размера, скажем, 2048 байт (т.е. ответ GET будет иметь 2 КБ, запрос POST будет иметь 2 КБ).
Я пользуюсьregisterRestInterface
" а также "RestInterfaceClient
"API в библиотеке 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, чтобы сказать наверняка и / или предложить решение.