-
Notifications
You must be signed in to change notification settings - Fork 10
v3.2 Architecture
Separating the load engine to the set of the mini-services will dramatically improve the following:
- Scalability
- Performance
- Reliability due to components isolation
- Extensibility due to lower dependency between the components
-
Storage
A cloud storage or a filesystem
-
Item
While Storage is the subject of a load the Item is the object of a load. The only thing which item has is a mutable name.
-
Item Input
The readable source of the items. This may be a CSV file, a binary stream, a collection or a bucket listing.
-
Item Output
The writable destination for the items. This may be a CSV file, a binary stream or a collection.
-
Item Generator
The entity which reads a specified item input and pushes the resolved items to the load generator.
-
I/O Task
An I/O task is a item linked with a particular I/O type (write/read/delete). Also I/O Task has the state and the execution result as an extension of this state.
The service which executes the I/O tasks generated by Load Generators. The basic property is the concurrency level and storage client configuration. The functionality includes:
- Low-level implementation of the I/O tasks execution functionality (FS either HTTP)
- Endpoint node balancer (if applicable)
- Rate limit related things
- Callbacks for the completed I/O Tasks
Load Generator is an extension of the Item Generator which generates the I/O tasks from the generated Items. The basic properties are:
- Origin Code (all I/O tasks generated share the same origin code)
- I/O type (create/read/etc)
- Item output generating new I/O tasks
- Relative weight for the Storage Drivers
Basic functions:
- User interaction (optional)
- Configuration deployment
- Test initiation
- Execution control (timeouts handling, shutdown invocations, etc)
- Metrics aggregation and representation
- The Load Generator uses the configured item input and builds the next item.
- The item is passed to I/O Task Builder by the Load Generator and the next I/O task is built.
- If weight throttle is configured the I/O task awaits for the weight throttle permit.
- If rate throttle is configured the I/O task awaits for the rate throttle permit.
- The I/O task is put into the shared by the Load Monitor round-robin Storage Driver selector.
- The I/O task is put into the selected Storage Driver.
- The I/O task is enqueued into the Storage Driver's incoming I/O tasks queue.
- If the Storage Driver has not enough own I/O tasks the next I/O task is taken from the incoming I/O tasks queue.
- The I/O task is submitted for execution (the effect depends on the Storage Driver implementation).
- The I/O task is completed and the ioTaskCompleted callback is invoked.
- If the I/O task is composite get the list of the subtasks and put the to the own I/O tasks queue if these subtasks haven't been scheduled yet. Else if the I/O task is partial and parent (composite) I/O task has all subtasks (partial) done then put the parent I/O task into the own I/O tasks queue to schedule one more execution to finalize the composite I/O task execution (if necessary).
- I/O task result is built and put into the I/O task results queue.
- The Load Monitor invokes the getResults method of the Storage Driver and get the next I/O task result.
- The Load Monitor logs the corresponding I/O trace record if it is enabled.
- The Load Monitor updates the performance metrics and internal counters using the I/O task result.
- If recycling is configured the I/O task result corresponding item info record is put into the unique items map. Else if an item info output is configured the item info record is put to it.
- If recycling is configured the I/O task result is sent again to the corresponding Storage Driver for the execution.
So the most basic item data flow looks like:
Item -> I/O Task -> I/O Task Result -> Item Info
- Overview
- Deployment
- User Guide
- Troubleshooting
- Reference