mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-31 11:32:15 +00:00
perf(actionsv2): execution target router (#10564)
# Which Problems Are Solved The event execution system currently uses a projection handler that subscribes to and processes all events for all instances. This creates a high static cost because the system over-fetches event data, handling many events that are not needed by most instances. This inefficiency is also reflected in high "rows returned" metrics in the database. # How the Problems Are Solved Eliminate the use of a project handler. Instead, events for which "execution targets" are defined, are directly pushed to the queue by the eventstore. A Router is populated in the Instance object in the authz middleware. - By joining the execution targets to the instance, no additional queries are needed anymore. - As part of the instance object, execution targets are now cached as well. - Events are queued within the same transaction, giving transactional guarantees on delivery. - Uses the "insert many fast` variant of River. Multiple jobs are queued in a single round-trip to the database. - Fix compatibility with PostgreSQL 15 # Additional Changes - The signing key was stored as plain-text in the river job payload in the DB. This violated our [Secrets Storage](https://zitadel.com/docs/concepts/architecture/secrets#secrets-storage) principle. This change removed the field and only uses the encrypted version of the signing key. - Fixed the target ordering from descending to ascending. - Some minor linter warnings on the use of `io.WriteString()`. # Additional Context - Introduced in https://github.com/zitadel/zitadel/pull/9249 - Closes https://github.com/zitadel/zitadel/issues/10553 - Closes https://github.com/zitadel/zitadel/issues/9832 - Closes https://github.com/zitadel/zitadel/issues/10372 - Closes https://github.com/zitadel/zitadel/issues/10492 --------- Co-authored-by: Stefan Benz <[email protected]>
This commit is contained in:
co-authored by
Stefan Benz
parent
5721b63bcb
commit
a9ebc06c77
@@ -108,6 +108,7 @@ func NewServer(
|
||||
query *query.Queries,
|
||||
repo repository.Repository,
|
||||
encryptionAlg crypto.EncryptionAlgorithm,
|
||||
targetEncryptionAlgorithm crypto.EncryptionAlgorithm,
|
||||
cryptoKey []byte,
|
||||
es *eventstore.Eventstore,
|
||||
userAgentCookie, instanceHandler func(http.Handler) http.Handler,
|
||||
@@ -162,6 +163,7 @@ func NewServer(
|
||||
fallbackLogger: fallbackLogger,
|
||||
hasher: hasher,
|
||||
encAlg: encryptionAlg,
|
||||
targetEncryptionAlgorithm: targetEncryptionAlgorithm,
|
||||
opCrypto: op.NewAESCrypto(opConfig.CryptoKey),
|
||||
assetAPIPrefix: assets.AssetAPI(),
|
||||
}
|
||||
|
||||
@@ -36,11 +36,12 @@ type Server struct {
|
||||
defaultIdTokenLifetime time.Duration
|
||||
jwksCacheControlMaxAge time.Duration
|
||||
|
||||
fallbackLogger *slog.Logger
|
||||
hasher *crypto.Hasher
|
||||
signingKeyAlgorithm string
|
||||
encAlg crypto.EncryptionAlgorithm
|
||||
opCrypto op.Crypto
|
||||
fallbackLogger *slog.Logger
|
||||
hasher *crypto.Hasher
|
||||
signingKeyAlgorithm string
|
||||
encAlg crypto.EncryptionAlgorithm
|
||||
targetEncryptionAlgorithm crypto.EncryptionAlgorithm
|
||||
opCrypto op.Crypto
|
||||
|
||||
assetAPIPrefix func(ctx context.Context) string
|
||||
}
|
||||
|
||||
@@ -429,10 +429,8 @@ func (s *Server) userinfoFlows(ctx context.Context, qu *query.OIDCUserInfo, user
|
||||
if function == "" {
|
||||
return nil
|
||||
}
|
||||
executionTargets, err := execution.QueryExecutionTargetsForFunction(ctx, s.query, function)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
executionTargets := execution.QueryExecutionTargetsForFunction(ctx, function)
|
||||
info := &ContextInfo{
|
||||
Function: function,
|
||||
UserInfo: userInfo,
|
||||
@@ -443,7 +441,7 @@ func (s *Server) userinfoFlows(ctx context.Context, qu *query.OIDCUserInfo, user
|
||||
UserGrants: qu.UserGrants,
|
||||
}
|
||||
|
||||
resp, err := execution.CallTargets(ctx, executionTargets, info)
|
||||
resp, err := execution.CallTargets(ctx, executionTargets, info, s.targetEncryptionAlgorithm)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user