Asp.Net Core Identity + EF Core + CockroachDb = очень медленно

Я хочу использовать CockroachDb с Asp.Net Core Identity. Таракан использует проводной протокол Postgres, поэтому пакет Npgsql.EntityFrameworkCore.PostgreSQL также работает с тараканом.

Просто добавить все необходимые сервисы, сгенерировать миграцию и применить ее не получится, потому что сгенерированная миграция использует NpgsqlValueGenerationStrategy.IdentityByDefaultColumn, что приводит к столбцам с GENERATED BY DEFAULT AS IDENTITY, что не поддерживается тараканом. Поэтому я изменил NpgsqlValueGenerationStrategy на SerialColumn во всех сгенерированных файлах миграции (миграция, конструктор, снимок модели). После этого изменения применение миграции работает, но при вызове UserManager.AddClaim возникает другая ошибка. Исключение переполнения. Итак, я решил, что это связано с тем, что таракан для столбцов SERIAL по умолчанию не использует последовательности, а вместо этого генерирует уникальные числа на основе текущей временной метки и идентификатора узла, что приводит к довольно большим числам. Таракан предоставляет способ перезаписать поведение ключевого слова SERIAL для текущего сеанса, выполнив SET experimental_serial_normalization = sql_sequence. Поэтому я удалил все таблицы и снова применил миграцию, но перед этим добавил код, выполняющий указанную выше команду, в конструктор AppDbContext. После применения миграции этот код можно удалить, так как он больше не нужен.

Выполнение всех этих действий заставляет Identity работать с CockroachDb, но это очень медленно. Создание нового пользователя занимает ~4 секунды. Добавление нового требования - примерно то же самое. По сравнению с PostgreSQL ~ 1 секунда.

Использование EF Core с тараканом вне Identity происходит медленно, но не безосновательно. Но сочетание EF Core и Cockroach с Identity делает производительность неприемлемой.

В чем может быть проблема? Может быть, изменение всех этих вещей, чтобы заставить Identity работать с тараканом, как-то все испортит? По функционалу все работает нормально.


person CKK    schedule 08.04.2020    source источник


Ответы (2)


Идентификация ASPNET позволит вам использовать GUID в качестве идентификатора. Если вы просто измените это, остальные будут работать без проблем и будут работать соответственно.

person ewassef    schedule 11.08.2020
comment
Это из-за проблем, описанных в другом ответе, опубликованном здесь? - person Robert Harvey; 12.08.2020
comment
Я думаю, что вы не дали ссылку. Команда CockreachDB хорошо резюмирует это здесь как выбрать индексные ключи базы данных - person ewassef; 12.08.2020

Ожидается, что параметр sql_sequence будет медленнее, так как он добавляет большую координацию между различными узлами в кластере, чтобы гарантировать постепенное увеличение последовательности на единицу.

Вот выдержка из примечаний к выпуску для этого особенность.

CockroachDB теперь поддерживает два экспериментальных режима совместимости с тем, как PostgreSQL обрабатывает SERIAL и последовательности, чтобы упростить повторное использование сторонних фреймворков или приложений, разработанных для PostgreSQL. Эти режимы можно включить с помощью переменной сеанса Experiment_serial_normalization (для каждого клиента) и параметра кластера sql.defaults.serial_normalization (для всего кластера). Первый режим, virtual_sequence, обеспечивает совместимость со многими приложениями, использующими SERIAL, с максимальной производительностью и масштабируемостью. Второй режим, sql_sequence, обеспечивает максимальную совместимость с PostgreSQL, но использует обычные последовательности SQL и поэтому имеет ограничения по производительности.

Я думаю, что в идеале было бы не использовать sql_sequence, и все должно быть исправлено, чтобы сгенерированные числа не переполнялись. Это можно исправить одним из двух способов:

person rafiss    schedule 18.06.2020