What is Bump
-
Bump is location sharing Mobile App. Install bump on 2 phones(add as friends).
Phone1 can see location of Phone2 on bump. Helpful if someone is travelling alone in new area
Requirements (CRUD)
Functional
Non-Functional
BOE
Metric | Description |
---|---|
QPS(Queries per second) | Very low, as in when someone opens app then request is sent to system and system sends location back |
BW Estimates | |
Storage Requirements |
Data to be stored for 1 user: < user_id(8 byte), longitude(8 bytes), lattitude(8 bytes), followed_by(8 * 50 bytes) > Total storage required: 400 bytes(for 1 user) 100 Million users. 40G bytes(for 5 years) |
API Design (CRUD)
- REST API?
REST API Versioning(v1,v2)
1. User can create Account on Bump |
2. Read location of friend on bump app |
3. Update self profile to include friends(whom you will follow) |
4. Delete friend |
5. Delete Account |
---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
DB Schema
- Graph DB
// user Table
| userid (pk) | username | creation_timestamp | initial_location (long, latt) |
// friends table
-> Would be stored on Graph DB
HLD
Design-1: Using Kafka to send events
@startuml control DNS as dns box India #LightCyan actor User as u end box box Data Center participant LoadBalancer as lb participant AppServer as as queue Kafka as kafka participant Sender as sender participant Fetcher as fetcher database connDB as conndb end box box US #LightYellow actor Friend as f end box participant 3rdPartyAPIs as 3rdapis #LightPink note over sender send location of friend to user end note note over fetcher Fetches friend latt,long using google APIs end note note over 3rdapis #LightPink To get GPS location Free Geolocation APIs - OpenStreetMap OR Android: FusedLocationProviderClient OR iOS: CoreLocation framework end note u -> dns: amo.com dns -> u: 1.2.3.4 u -> lb: HTTP GET\n/v1/get_location?friend_id=789 lb -> as: HTTP GET\n/v1/get_location?friend_id=789 as -> kafka: Topic(get_frnd_location)\nMsg(user_id=123,\nfriend_id=789) kafka -> fetcher: Topic(get_frnd_location)\nMsg(user_id=123,\nfriend_id=789) fetcher -> conndb: Get friend IP conndb -> fetcher: friend's IP fetcher -> f: Give permission to use GPS f -> fetcher: done fetcher -> 3rdapis: friend's IP 3rdapis -> f: GPS coordinates f -> 3rdapis: corrdinates 3rdapis -> fetcher: long,lattitude fetcher -> fetcher: Verify long,latt note over fetcher #Cyan CACHING Since locations are frequently asked, we can add a Cache layer end note fetcher -> kafka: Topic(frnd_location)\nMsg(long,latt\nfrnd_id=789,usr_id=123) kafka -> sender: Topic(frnd_location)\nMsg(long,latt\nfrnd_id=789,usr_id=123) sender -> conndb: User(123) IP? conndb -> sender: x.y.z.f sender -> u: long,latt (frnd_id=789) note over u Mobile App draws a map using Mapbox or OpenStreetMap for distance between friends end note sender <-> u: sender keep sending location updates every 30 seconds @enduml |
User Authentication:
System authenticates user has permission to access friend's location or not Push notifications(Web sockets): For lower latency and reduced resource usage. The server will push updates to the client only when there’s a significant change in location Fetch user locations through Google APIs: Google APIs will collect GPS coordinates directly from the user's device via the user's permission. Friend is Offline: retry will happen. Fetcher might put same msg on kafka queue and service after x time. Reducing Latency: Websockets can be used in place of pooling. Instead of Fetcher pushing data on kafka then sender sending the data, fetcher can directly send the data to user Replace Kafka with a lightweight event-driven architecture using WebSocket for real-time communication. Kafka is overkill for a relatively low-volume messaging use case like this. Fetching Location: It not neccessary to use Google's API for location On Android we can use FusedLocationProviderClient API On iOS we can use CoreLocation API open-source or free geolocation services like OpenStreetMap or Here APIs for mapping and rendering user location. |
Design using WebSocket AppServer
|
Reduced Latency: In place of kafka, AppServer has became a Websocket server, which maintains connection open when client connects to server to get location of friend Removed Sender module, Now fetcher can directly send updates to AppServer. |