Я разрабатываю мультитенантное приложение, которое хочу дать каждому арендатору верхнюю границу количества потоков. Но я не уверен, можно ли это настроить, поскольку я не вижу никаких параметров, указывающих максимальный размер потока в 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
, но может быть очевидное решение, которое мне не хватает.