Как мне настроить Java Executor для предоставления верхнего предела потоку каждому клиенту в мультитенантном приложении? - PullRequest
1 голос
/ 06 августа 2020

Я разрабатываю мультитенантное приложение, которое хочу дать каждому арендатору верхнюю границу количества потоков. Но я не уверен, можно ли это настроить, поскольку я не вижу никаких параметров, указывающих максимальный размер потока в Executor.

Это пример.

    public static void main(String args[])
    {
        ThreadFactory factory = new ThreadFactoryBuilder()
                .setDaemon(true)
                .setNameFormat("ThreadPool")
                .setPriority(Thread.NORM_PRIORITY - 1)
                .build();

        ExecutorService executorService = Executors.newFixedThreadPool(10, factory);

        List<Future> futures = new ArrayList<>();
        // TenantA
        for (int i = 0; i < 10; i++) {
            futures.add(runTask(executorService, "TenantA:" + i));
        }

        // TenantB
        for (int i = 0; i < 10; i++) {
            futures.add(runTask(executorService, "TenantB:" + i));
        }
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete((v, th) -> {
            System.out.println("Completed");
        }).join();
    }

    public static CompletableFuture<Void> runTask(ExecutorService executorService, String name)
    {
        return CompletableFuture.runAsync(() -> {
            try {
                System.out.println("Run task " + name);
                Thread.sleep(1000);
                System.out.println("Task done");

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, executorService);
    }

Что я хотел бы достичь, как в примере, когда TenantA и TenantB совместно используют один и тот же Executor, а общее количество потоков составляет 10. Количество арендаторов может быть динамическим c, как будто оно может расти, если мы добавляем дополнительную учетную запись, или уменьшаться, если клиент уходит.

Вопрос в том, есть ли какая-либо конфигурация в Java Executor, которая может достичь чего-то, что если я хочу дать каждому арендатору максимальное количество потоков 5, чтобы каждый арендатор получил 5. Потому что сейчас происходит следующее: если TenantA имеет 10 или более задач, то TenantA будет использовать все ресурсы, а TenantB будет придется ждать, пока A выполнит задачи. Один из способов, которого я хочу избежать, - это указать в конфигурации для каждого арендатора где-нибудь в конфигурации, потому что количество арендаторов может измениться. Итак, было бы здорово, если бы я мог просто сказать Java, что у вас 1000 потоков, и каждая группа может использовать до 100, чтобы ни одна учетная запись не могла забрать все ресурсы.

Другое решение, которое я могу придумать, это чтобы создать Map<AccountId, ExecutorService>, чтобы каждый арендатор получил свой ExecutorService, но может быть очевидное решение, которое мне не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...