We’re working to take our software to Azure cloud and looking at Orleans and Service Fabric (SF) as potential frameworks. We need to:
- Populate our analysis engines with lots of data (e.g., 100MB to 2GB) per engine instance.
- Maintain that state, and if an engine instance goes idle for say 20 minutes or more, we’d like to unload it (i.e., and not pay for the engine instance resource).
- Each engine instance will support one to several end users with a specific data set.
- Each engine instance can be highly interactive generating lots of plot data near realtime. We’re maintaining state as we don’t want to pay the price to populate engine instance for each engine interaction.
- An engine instance action can take a few seconds, a few minutes, to even tens of minutes. We’ll want some feedback.
- Users may access an engine instance every few seconds (e.g., to steer the engine towards a result based on feedback) and will want live plot data.
- Each user will want to talk to a specific engine instance.
- As a user expresses interest in running a simulation (i.e., standing up an engine instance), ideally we want him to choose small/medium/large computing resource to run his engine instance (i.e., based on the problem he’s trying to solve he may want more or less computing/memory power).
We’re considering Orleans and SF but we’re having difficulty specifying architecture based on above requirements. We’ve considered:
- Trying to think about an SF partition, or an Orleans silo as an ‘engine instance’ described above.
- Leveraging both Orleans and SF notion of fault tolerance through replication.
- Leveraging local (i.e., to partition or silo) storage to store results and maintain state (i.e., for long periods or until idle for 20 minutes).
We’ve not understood how to:
- Limit a silo or a partition to a single engine instance so that we can control resourcing of the engine instance.
- Keep a user’s engine instance data separate from another users engine instance data.
- Direct a request from a user (e.g., through a web API) to a particular engine instance.
Does this make sense for Orleans, does it make more sense for SF? Any pointers on how to implement the above would be helpful.