Welcome to the nearmap.com C# test. The purpose of this assignment is to test your familiarity with C#, distributed systems concepts, performance benchmarking and TDD.
The source code that you are given is a very simple imitation of a key/value store:
DatabaseStoreis the central store that takes a while (500ms) to store and retrieve data.DistributedCacheStoreis an interface to a distributed cache that takes much less time to turn around (100ms to store or retrieve).
This scenario is a simplified example of a typical high performance server cluster with a database, a distributed cache and multiple worker nodes.
After startup:
- Data in
DatabaseStorenever changes and can be cached forever. - If
DatabaseStore.GetValue()returnsnullfor a key, the requested data item does not exist and will never exist. DistributedCacheStoreis initially empty.
Complete the 2 parts below & submit the solution. If the solution is incomplete, please state what hasn't been finished and outline how you are planning on solving it.
- Unless otherwise stated, the provided code can be modified at will
- The whole solution must build with no errors.
- You can use Visual Studio or any other C# IDE.
Implement the IDataSource interface to create a mechanism to retrieve data from DatabaseStore with lowest possible latency.
For a frequently-requested item your IDataSource.GetValue() implementation should have a better response time than the distributed cache store (ie < 100ms).
- The user of the
IDataSourceinterface must not have to deal with thread synchronisation. - You must write unit tests for all new functionality, and all tests must pass.
- You can use any publicly available libraries in unit tests
- Your non-test code can use an IoC library if desired, and otherwise only .NET Framework or .NET Core libraries/classes
Complete the Main() to test your IDataSource implementation; it must:
- Populate
DatabaseStorewith the following data at startup:
| key | value |
--------------------------------
| key0 | value0 |
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
| key4 | value4 |
| key5 | value5 |
| key6 | value6 |
| key7 | value7 |
| key8 | value8 |
| key9 | value9 |
- Use 10 threads, each making 50 consecutive requests for a random key in the range (key0-key9). I.e. there would a total of 500 requests.
- For each request, print the managed ThreadId, requested key name, returned value, time to complete that request; similar to the following example:
[1] Request 'key1', response 'value1', time: 50.05 ms
[2] Request 'key2', response 'value2', time: 50.05 ms
- DO NOT fork this repository or create pull requests on it, because we don't want other candidates to see your solution.
- Provide your solution as a
.zipor .gzarchive file, either via email or some Dropbox-like service, to your Nearmap contact.