Skip to content

ruifigueira/stats

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Stats application

Very simple stats collecting application for transactions.

Build

To build and run Unit tests:

mvn clean package

Run

To run the application:

java -jar target/stats.jar

After that, you can test registering transactions:

curl -X POST -H "Content-Type: application/json" -d '{"amount":12.3,"timestamp":1478192204000}' http://localhost:8080/transactions

and to get current statistics:

curl -X GET -H "Content-Type: application/json" http://localhost:8080/statistics

or just open http://localhost:8080/statistics in your browser.

Decisions

O(1) Complexity

To achieve both memory and time O(1) complexity, the idea is that statistics are aggregated per second. When we want to get statistics for the latest 60 seconds, we combine the latest 60 aggregated statistics, each one providing one second.

To keep these 60 statistics per second, we only need a ring buffer, and every time a second passes, we shift it accordingly, resetting the structures corresponding to periods older than 60 seconds (those same structures will now become the most recent second structures).

There are some compromises, however, with this solution: The 60 second interval for statistics is not exact, because it starts at millisecond 0 of each second. That means that, if we are requesting statistics when time is 65.5 sec., instead of getting results from transactions from 5.5sec. to 65.5sec., we'll get from transactions since 6sec. to 66sec.

Possible Improvements

  • ReadWriteLock for thread-safety instead of synchronized methods, which don't differenciate read and write operations.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages