github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/design/0-inv/20240306-async/README.md (about) 1 # IAppPartitions + async actualizers 2 3 https://github.com/voedger/voedger/issues/1464 4 5 ## Context 6 7 - [vvm.provideAsyncActualizersFactory()](https://github.com/voedger/voedger/blob/43469aef2ed4878dfa3cb7dca304c87350547a8d/pkg/vvm/wire_gen.go#L518) 8 - vvm.provideOperatorAppServices() 9 - forks appServices per apps 10 - [appsAmount]appServices 11 12 ```mermaid 13 graph 14 15 %% Entities ==================== 16 17 pipeline.ISyncOperator 18 pipeline.ISyncOperator2["pipeline.ISyncOperator"] 19 pipeline.ISyncOperator3["pipeline.ISyncOperator"] 20 21 state.ActualizerStateOptFunc 22 23 istructs.QName 24 istructs.AppQName 25 istructs.PartitionID 26 istructs.IAppStructsProvider 27 istructs.ProjectorFactory(["istructs.ProjectorFactory()"]) 28 istructs.Projector 29 istructs.ProjectorFunc 30 31 projectors.SyncActualizerConf 32 projectors.AppStructsFunc(["projectors.AppStructsFunc()"]) 33 projectors.AsyncActualizerFactory(["projectors.AsyncActualizerFactory()"]) 34 projectors.ProvideAsyncActualizerFactory(["projectors.ProvideAsyncActualizerFactory()"]) 35 36 appparts.IAppPartitions 37 38 vvm.provideAsyncActualizersFactory(["vvm.provideAsyncActualizersFactory()"]):::S 39 vvm.provideAppPartitionFactory(["vvm.provideAppPartitionFactory()"]) 40 vvm.provideAppServiceFactory(["vvm.provideAppServiceFactory()"]) 41 vvm.provideOperatorAppServices(["vvm.provideOperatorAppServices()"]) 42 vvm.provideServicePipeline(["vvm.provideServicePipeline()"]) 43 vvm.AsyncActualizersFactory(["vvm.AsyncActualizersFactory()"]) 44 vvm.AsyncProjectorFactories["[]vvm.AsyncProjectorFactories"] 45 vvm.AppPartitionFactory(["vvm.AppPartitionFactory()"]) 46 47 %% Relations ==================== 48 49 istructs.ProjectorFunc -..- istructs.Projector 50 istructs.QName -.- istructs.Projector 51 52 istructs.PartitionID -..- istructs.ProjectorFactory 53 projectors.AppStructsFunc -.- projectors.SyncActualizerConf 54 istructs.PartitionID -.- projectors.SyncActualizerConf 55 projectors.ProvideAsyncActualizerFactory --> projectors.AsyncActualizerFactory 56 projectors.SyncActualizerConf -.- projectors.AsyncActualizerFactory 57 istructs.ProjectorFactory -....- projectors.AsyncActualizerFactory 58 59 istructs.ProjectorFactory --> istructs.Projector 60 61 62 istructs.IAppStructsProvider -.- vvm.provideAsyncActualizersFactory 63 appparts.IAppPartitions -.- vvm.provideAsyncActualizersFactory 64 projectors.AsyncActualizerFactory -.- vvm.provideAsyncActualizersFactory 65 projectors.AsyncActualizerFactory --> pipeline.ISyncOperator3 66 67 state.ActualizerStateOptFunc -..- |"[]"| vvm.provideAppPartitionFactory 68 vvm.provideAsyncActualizersFactory ----> vvm.AsyncActualizersFactory 69 vvm.provideAppPartitionFactory --> vvm.AppPartitionFactory 70 istructs.AppQName -.- vvm.AppPartitionFactory 71 vvm.AsyncProjectorFactories -.- vvm.AppPartitionFactory 72 73 vvm.AppPartitionFactory -.- vvm.provideAppServiceFactory 74 vvm.AppPartitionFactory --> pipeline.ISyncOperator2 75 76 77 vvm.provideAppServiceFactory -.- vvm.provideOperatorAppServices 78 vvm.provideOperatorAppServices -.- vvm.provideServicePipeline 79 80 vvm.AsyncActualizersFactory --> pipeline.ISyncOperator 81 vvm.AsyncActualizersFactory -.- vvm.provideAppPartitionFactory 82 83 istructs.ProjectorFactory -.- vvm.AsyncProjectorFactories 84 85 istructs.AppQName -..- vvm.AsyncActualizersFactory 86 vvm.AsyncProjectorFactories -.- vvm.AsyncActualizersFactory 87 istructs.PartitionID -.- vvm.AsyncActualizersFactory 88 89 classDef S fill:#B5FFFF 90 ``` 91 92 ## Analysis 93 94 95 - istructsmem.AppConfigType 96 ```go 97 type AppConfigType struct { 98 ... 99 syncProjectorFactories []istructs.ProjectorFactory 100 asyncProjectorFactories []istructs.ProjectorFactory 101 cudValidators []istructs.CUDValidator 102 eventValidators []istructs.EventValidator 103 ... 104 } 105 ``` 106 - iextengine.IExtensionEngineFactories: `map[appdef.ExtensionEngineKind]IExtensionEngineFactory` 107 - iextengine.IExtensionEngineFactory: `New(ctx context.Context, packages []ExtensionPackage, config *ExtEngineConfig, numEngines int) ([]IExtensionEngine, error)` 108 - iextengine.ExtensionPackage 109 ```go 110 type ExtensionPackage struct { 111 QualifiedName string 112 ModuleUrl *url.URL 113 ExtensionNames []string 114 } 115 116 type IExtensionIO interface { 117 istructs.IState 118 istructs.IIntents 119 istructs.IPkgNameResolver 120 } 121 122 type IExtensionEngine interface { 123 SetLimits(limits ExtensionLimits) 124 Invoke(ctx context.Context, extName ExtQName, io IExtensionIO) (err error) 125 Close(ctx context.Context) 126 } 127 ``` 128 - istructs.Projector: `Func func(event IPLogEvent, state IState, intents IIntents) (err error)` 129 - Projector example: invite.provideAsyncProjectorApplyCancelAcceptedInviteFactory 130 131 ## Proposal 132 133 ### Projectors shall be accessible through ExtEngineKind_BuiltIn 134 135 - `istructs.IState.PLogEvent() IPLogEvent` 136 - state: sync projectors: Put event 137 - state: async projectors: Put event 138 - IAppPartition(s) 139 ```go 140 type IAppPartitions interface { 141 // Adds new application or update existing. 142 // 143 // If application with the same name exists, then its definition will be updated. 144 DeployApp(name istructs.AppQName, def appdef.IAppDef, perPartitionEngines [cluster.ProcessorKind]int, numPartitions int) 145 146 ``` 147 - Use `IAppPartition.Invoke` in async actualizer 148 - Wire: Register all projectors in `iextenginebuiltin.ProvideExtensionEngineFactory` 149 - Wrapper around istructs.Projector that gets IPLogEvent and passes to istructs.Projector 150 - `appparts.NewWithEngines(engfacts iextengine.IExtensionEngineFactories)` 151 - IAppPartition.Invoke 152 ```go 153 type IAppPartition interface { 154 Invoke(qname istructs.QName, state istructs.IState, intents istructs.IIntents) (err error) 155 } 156 ``` 157 - Use `Invoke()` in async actualizer 158 - Use `Invoke()` in `IAppPartition.DoSyncActualizer` 159 160 ### Migrate to Actualizers Processors 161 162 - ???