Приложение не выбирает строки из Sharded DBJAVA

Программисты JAVA общаются здесь
Anonymous
Приложение не выбирает строки из Sharded DB

Сообщение Anonymous »

Я работаю над очень «высоко нагруженным» проектом (Java, Spring, Postgresql, K8s), и нам нужно было разделить наш БД на разделе, а затем на осколках. На каждом осколках также есть планировщик, и несколько стручков для экземпляров приложения (здесь нет планирования, потому что это не планировщик Spring по умолчанию), и есть 100% гарантия, что планировщики начинаются в другое время.

Код: Выделить всё

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor( r -> {
Thread thread = new Thread(r);
thread.setName(shard);
return thread;
});
executors.add(executor);

Service service = serviceFactory.create(shard);
executor.scheduleAtFixedRate(service::process, (long) (Math.random() * 1001), config.getFetchInterval(), TimeUnit.MILLISECONDS);
< /code>
Итак, они не могут попытаться выбрать одни и те же строки при запуске, даже при работе над одним и тем же осколом. Итак, буквально, каждая транзакции  long , которые блокируют таблицу, разбивают функцию. 
В функции есть несколько выборов.select * from TABLE_A where ... for update skip locked fetch first ? rows only
и второй, выберите «Записи», подключенные к Table_a (от одного ко многим отношениям, записи от table_a имеют ссылки на Table_b , так что одна запись из Table_b может иметь много подключенных записей в Table_a ), а затем в Forcure From Works From Works Force_b . Здесь, поскольку я думаю, что здесь все в порядке из -за факта, что эта функция разбивается и только после долгих транзакций и исправлена ​​одним или двумя перезапуску применения. Во -первых, например, 500 записей, а затем второй сможет приобрести следующие 500 записей и т. Д. Если это так, я думаю, что мы увидим исключение в журналах, но журналы совершенно ясны: < /p>

Код: Выделить всё

public void process() {
TenantContext.setCurrentTenant(SHARD_NAME);
log.info("Start function");
long startMillis = System.currentTimeMillis();
LocalDateTime fromDate = lastStartDateParam = lastStartDateParam != null ? lastStartDateParam : config.getStartDate();
LocalDateTime toDate = fromDate.plusDays(3);

transactionRunner.doInTransaction(() -> {
// business logic here
return null
});

log.info("Finish deferred message import in date range {} - {} by {} ms",
fromDate, toDate, System.currentTimeMillis() - startMillis);
}
Отсюда мы можем увидеть только первый журнал, а второй - совершенно без исключений, время выполнения - это несколько мс.


Подробнее здесь: https://stackoverflow.com/questions/796 ... sharded-db

Вернуться в «JAVA»