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  - ???