Шина событий Vertx заблокирована

#vert.x

Вопрос:

У меня есть небольшое приложение vertx. Вершина http получает запрос и отправляет его по шине событий с шаблоном запрос-ответ. Так что что-то вроде:

 vertx.eventBus().request(queue, request, options, reply -> {
            if (reply.succeeded()) {
                JsonObject body = (JsonObject) reply.result().body();
                context.response().end(body.encode());  
            } else {
                JsonObject result = new JsonObject().put("errorMessage", reply.cause().getMessage());
                    context.response().end(result.encode());
            }
        });
 

В вертикали БД я использую потребителя, чтобы получить сообщение для перехода в БД, внести некоторые изменения и отправить обратно в вершину HTTP.
Моя проблема в том, что у меня есть действие удаления, которое должно выполнять множество проверок, поэтому этот процесс может занять до 10 секунд. В этот момент HTTP verticle все еще может получать некоторые новые запросы, но потребитель БД ничего не получает, пока не будет выполнено действие удаления. Таким образом, запросы не обрабатываются. Единственное, что помогает, — это установить многопоточность в вершину БД, и это устаревает. Блокировка Vertx.executeBlocking или пул потоков JAVA вокруг выполнения БД также не помогают, так как потребитель просто ничего не получает, пока не ответит.
Я что-то пропустил?
Спасибо

Комментарии:

1. Развернута ли вершина БД как рабочая? Сколько экземпляров создано?

2. БД является работником с 1 экземпляром. Я подумал, что setmultithreaded может быть реализован как-то по-другому, так как при запуске вершины БД происходит некоторый процесс инициализации. Поэтому, если я запускаю 10 экземпляров, мне нужно 10 раз инициализировать процесс

3. Если вы создадите 10 отдельных экземпляров, то вам не понадобится пул подключений к БД, или?

4. вы также можете совместно использовать пул БД для всех рабочих вершин

5. укажите свою вершину базы данных, также вы можете поделиться источником данных во время создания экземпляра вершины: источник данных ds = … ;// инициализировать источник данных vertx.deployVerticle(() -> новая вершина базы данных(ds), …);

Ответ №1:

Из вашего вопроса я заключаю, что вершина БД развернута с одним экземпляром. Вершина БД должна быть развернута как рабочая. Вы также можете развернуть несколько экземпляров этой вершины, чтобы у вас всегда была одна вершина БД, которая может принять следующий запрос.

Предложение по оптимизации: Если только действие удаления занимает так много времени, выделите это действие в специальной вертикали базы данных. Таким образом, ваша система более отзывчива, и вы можете контролировать, сколько вершин базы данных-«действие удаления»-развернуто и, следовательно, сколько подключений к базе данных может быть заблокировано на более длительное время.