Vertx WebClient общий или один для нескольких статей?
Я использую vert.x в качестве шлюза api для маршрутизации вызовов к нижестоящим службам.
На данный момент я использую один экземпляр веб-клиента, который используется в нескольких версиях (вводится через guice).
Имеет ли смысл для каждой статьи иметь собственный веб-клиент? Поможет ли это повысить производительность? (Каждый мой экземпляр шлюза запускает 64 вершины и обрабатывает примерно 1000 запросов в секунду)
Каковы плюсы и минусы каждого подхода?
Может ли кто-нибудь помочь выяснить, какова идеальная стратегия для того же?
Благодарность
1 ответ
Vert.x оптимизирован для использования одного WebClient
за статью. Совместное использование синглаWebClient
Экземпляр между потоками может работать, но это может отрицательно сказаться на производительности и привести к тому, что некоторый код будет выполняться в "неправильном" потоке цикла событий, как описано Жюльеном Вьет, ведущим разработчиком Vert.x:
Таким образом, если вы разделяете веб-клиент между вертикалями, тогда ваша статья может повторно использовать ранее открытое соединение (из-за объединения), и вы получите обратные вызовы в цикле событий, которых не ожидаете. Кроме того, в веб-клиенте есть синхронизация, которая может стать неудовлетворительной при интенсивном использовании из разных потоков.
Кроме того, документация Vert.x дляHttpClient
, который является базовым объектом, используемым WebClient
, явно заявляет, что не следует разделять его между контекстами Vert.x (каждая Вертикаль получает свой собственный Контекст):
HttpClient можно использовать в статье или встроить.
При использовании в Verticle, Verticle должен использовать свой собственный экземпляр клиента.
В более общем смысле, клиент не должен использоваться в разных контекстах Vert.x, так как это может привести к неожиданному поведению.
Например, поддерживающее соединение будет вызывать клиентские обработчики в контексте запроса, открывшего соединение, последующие запросы будут использовать тот же контекст.