[keycloak-dev] large number of realms causing slow api calls
Gideon Caranzo
gideonray at gmail.com
Tue Oct 9 16:49:50 EDT 2018
Thank Stian for your reply. API calls have improved after using a different
composite role (with few realm roles).
Aside from API calls, I also observed slow startup time (about 20 mins). I
found the following calls during startup is taking more time.
*First*, the check for new installation using
applianceBootstrap.isNewInstall() at
KeycloakApplication.migrateAndBootstrap() is causing all realms to be
queried.
public boolean isNewInstall() {
if (session.realms().getRealms().size() > 0) {
return false;
} else {
return true;
}
}
A count query will make this faster. So the condition can be something
like: if (session.realms().getRealmCount() > 0)
*Second*, call to UserStorageSyncManager.bootstrapPeriodic() is also
causing all realms to be queried.
public void bootstrapPeriodic(final KeycloakSessionFactory
sessionFactory, final TimerProvider timer) {
KeycloakModelUtils.runJobInTransaction(sessionFactory, new
KeycloakSessionTask() {
@Override
public void run(KeycloakSession session) {
List<RealmModel> realms = session.realms().getRealms();
for (final RealmModel realm : realms) {
List<UserStorageProviderModel> providers =
realm.getUserStorageProviders();
for (final UserStorageProviderModel provider :
providers) {
I'm thinking of querying only realms with user storage providers to improve
performance.
I can create a PR for this. Let me know if it's okay or if there's a better
solution than the ones I proposed.
Thanks,
Gideon
On Fri, Oct 5, 2018 at 6:22 AM Stian Thorgersen <sthorger at redhat.com> wrote:
> Keycloak simply doesn't scale well with regards to large number of realms
> today and it's not something we currently support.
>
> That's just one of several issues around large number of realms that have
> to be resolved. Another example is upgrading the server with 1700 realms is
> also going to be painful.
>
> At the moment we are not able to priorities this though. We are planning
> to resolve it, but it will be quite some time until we do.
>
> For the particular issue you've mentioned the work-around is to remove the
> realm roles from the admin composite in master realm. That will work, but
> you will only be able to login and manage realms individually.
>
> On Thu, 4 Oct 2018 at 18:07, Gideon Caranzo <gideonray at gmail.com> wrote:
>
>> Hi,
>>
>> I'm encountering slow api calls after reaching 1700 realms. I profiled it
>> and found that role checking is causing the issue particularly
>> *KeycloakModelUtils.searchFor(RoleModel
>> role, RoleModel composite, Set<String> visited)*.
>>
>> I'm using a user with "admin" role to call get realm API. And since i have
>> 1700 realms, "admin" role now have about 30K composite roles under it. The
>> line below from KeycloakModelUtils.searchFor() will load all 30K composite
>> roles causing the slow down.
>>
>> *Set<RoleModel> compositeRoles = composite.getComposites();*
>>
>> Is there a way to avoid this issue? Or is it possible to fix the code such
>> that it will do a database query instead of searching in memory to check
>> if
>> the role exist?
>>
>> Best regards,
>> Gideon
>> _______________________________________________
>> keycloak-dev mailing list
>> keycloak-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/keycloak-dev
>>
>
More information about the keycloak-dev
mailing list