● What is multi-process synchronisation? ● Description of the problem. ● Architectural approach to solve the problem. ● A bit of code RxJava (not live coding - Sorry!) ● Conclusion. Agenda
The Producer's sole function is to insert data into the data-area, it is not allowed to remove any data from the area. Similarly, for the Consumer to be able to remove information from the data area, there must be information there in the first place. Once again, the sole function of the Consumer is to remove data from the data area. http://www.dcs.ed.ac.uk/home/adamd/essays/ex1.html “This problem is one ... well-known problems in concurrent programming: a finite-size buffer and two classes of threads, producers and consumers, put items into the buffer (producers) and take items out of the buffer (consumers).” https://docs.oracle.com/cd/E19455-01/806-5257/sync-31/index.html Multi-process synchronization
We want to be able to visualise in real-time the position of certain devices on a map. This included several devices under different and sometimes problematic conditions: - Internet connection loss - GPS loss The Tracking Problem
Things to consider: ● We needed to provide accurate positional information: even when the GPS doesn't work as expected. ● Consider possible connection loss due bad reception or no connection to the server. ● We needed to make sure that the data received by the server was complete and in the correct order. ● Handle all possible failures. The Tracking Problem
Position Producer Service: generates positions every 2 seconds even when there's no more GPS available (or not accurate enough). Position Consumer Service: fetches from the database all the positions that haven’t been sent yet, makes sure that they are sorted and executes the request. Handles possible failures with the sending. Position Interpolator Service: makes sure all positions have a location that can be mapped in the server. Linear Interpolation Architectural Design Overview
class Position { var sequenceNumber: Int = 0 var createdAt: Long = DateTime.now().millis var distance: Float = 0f var isTransmitted: Boolean = false var geoLocation: GeoLocation? = null var notes: List = List() }
Producer Architectural Design Overview Every certain time generates positions even if there are incomplete. - Poor accuracy (>20m) - No GPS All the positions should be saved locally on the phone: - cope with internet connection loss - somebody has to fix those incomplete position
Consumer Architectural Design Overview This component works based on a number to keep the correct order. After the positions are sent they are then marked as 'transmitted'. If the position with the upcoming sequence number is not complete, the consumer should wait until the interpolator does its job, and send the position.
Interpolator Architectural Design Overview If the GPS doesn't provide a location, the interpolator comes to the rescue. we always want to have an idea of where the devices are. This component checks the database looking for incomplete positions and does a linear Interpolation with last valid position and the next valid.
interval(): create an Observable that emits a sequence of integers spaced by a given time interval all(): Returns an Observable that emits a Boolean that indicates whether all of the items emitted by the source Observable satisfy a condition. http://reactivex.io/RxJava/javadoc/index.html?rx/Observable.html