Nearby Friends
Diagram: Nearby Friends · 80 elements
{
"type": "excalidraw",
"version": 2,
"source": "https://app.excalidraw.com",
"elements": [
{
"type": "text",
"version": 106,
"versionNonce": 801734615,
"isDeleted": false,
"id": "jccsCSvED4I8qouX_KPKJ",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -424.132922045222,
"y": -1814.4797583541208,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 375,
"height": 24,
"seed": 1575630884,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Designing Nearby Friends Service",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Designing Nearby Friends Service",
"lineHeight": 1.2
},
{
"type": "text",
"version": 82,
"versionNonce": 728780057,
"isDeleted": false,
"id": "gbKGlJvtvf59nOw4jlTLG",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -424.39276257068025,
"y": -1772.0093415249519,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 421.875,
"height": 24,
"seed": 465015716,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Establish Design Scope/Ask Questions",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Establish Design Scope/Ask Questions",
"lineHeight": 1.2
},
{
"type": "text",
"version": 230,
"versionNonce": 1643725305,
"isDeleted": false,
"id": "ZK9P8Zv30IGn44MW4UTug",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 159.0113793649757,
"y": -1771.0924805147224,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 269.53125,
"height": 24,
"seed": 2115631780,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Functional Requirements",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Functional Requirements",
"lineHeight": 1.2
},
{
"type": "text",
"version": 329,
"versionNonce": 1230019289,
"isDeleted": false,
"id": "0ceEYJshkHB_GcDM9gYV6",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -420.86394363591313,
"y": -1426.1424287497653,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 316.40625,
"height": 24,
"seed": 978231716,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Non-Functional Requirements",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Non-Functional Requirements",
"lineHeight": 1.2
},
{
"type": "text",
"version": 309,
"versionNonce": 34199481,
"isDeleted": false,
"id": "6e_oKwpTBPGu__LNzj0fV",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 162.8509966524133,
"y": -1450.3311907631446,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 58.59375,
"height": 24,
"seed": 818251940,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Scale",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Scale",
"lineHeight": 1.2
},
{
"type": "text",
"version": 456,
"versionNonce": 1882964759,
"isDeleted": false,
"id": "2SB074i81ERnDKvgBNTLZ",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -421.6072299441337,
"y": -1219.7481333920664,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 117.1875,
"height": 24,
"seed": 1710141348,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007586364,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "API design",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "API design",
"lineHeight": 1.2
},
{
"type": "text",
"version": 463,
"versionNonce": 2053337751,
"isDeleted": false,
"id": "y1o0Vln5z3zjhiGP-8J9-",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 167.14371420489385,
"y": -1174.8251195549092,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 117.1875,
"height": 24,
"seed": 394764836,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Data Model",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Data Model",
"lineHeight": 1.2
},
{
"type": "text",
"version": 408,
"versionNonce": 1822885815,
"isDeleted": false,
"id": "EJZbXER35jVpzl2oSrL1x",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -421.43294623440477,
"y": -825.6182724440762,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 199.21875,
"height": 24,
"seed": 186149156,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004975,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "High Level Design",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "High Level Design",
"lineHeight": 1.2
},
{
"type": "text",
"version": 420,
"versionNonce": 1109982839,
"isDeleted": false,
"id": "FjYnIMsjiW0V1OI0lWiH4",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -405.9041032802786,
"y": -27.208514777350615,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 117.1875,
"height": 24,
"seed": 996852516,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007057173,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 3,
"text": "Deep Dives",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Deep Dives",
"lineHeight": 1.2
},
{
"type": "text",
"version": 657,
"versionNonce": 114086135,
"isDeleted": false,
"id": "WzsMCXTuGmGPYY0CTa0Vx",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -421.7296280305467,
"y": -1726.56828068778,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 496.875,
"height": 288,
"seed": 1602315991,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004976,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Q: How close is nearby?\nA: Say 5 miles but this is configurable by user\n\nQ: Can I use straight line distance?\nA: Yes\n\nQ: Do we need to store location history? \nA: Yes, for ML and more\n\nQ: If a friend is inactive for >10 min, can we assume\nthey will disappear from nearby friend list? \nA: Yes, we're only concerned with active friends\n\nQ: Should we account for GDPR/CCPA privacy laws?\nA: Keep it simple and let's not worry for now",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Q: How close is nearby?\nA: Say 5 miles but this is configurable by user\n\nQ: Can I use straight line distance?\nA: Yes\n\nQ: Do we need to store location history? \nA: Yes, for ML and more\n\nQ: If a friend is inactive for >10 min, can we assume\nthey will disappear from nearby friend list? \nA: Yes, we're only concerned with active friends\n\nQ: Should we account for GDPR/CCPA privacy laws?\nA: Keep it simple and let's not worry for now",
"lineHeight": 1.2
},
{
"type": "text",
"version": 225,
"versionNonce": 70907609,
"isDeleted": false,
"id": "Qk1FgI9RMCddqp0gOcD5Z",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 158.02265135613055,
"y": -1726.342433881963,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 403.125,
"height": 115.19999999999999,
"seed": 502191673,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004976,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Users should be able to see nearby friends\n- Each nearby friend shows distance and \ntimestamp of when it was last updated\n\nNearby friends list should be updated every\nfew seconds",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Users should be able to see nearby friends\n- Each nearby friend shows distance and \ntimestamp of when it was last updated\n\nNearby friends list should be updated every\nfew seconds",
"lineHeight": 1.2
},
{
"type": "text",
"version": 417,
"versionNonce": 1332196281,
"isDeleted": false,
"id": "rIKaGyimy1b-egV-e5mtd",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -421.95194598002183,
"y": -1389.3789996041037,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 440.625,
"height": 153.6,
"seed": 1674992951,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004976,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Low latency. We want to receive location\nupdates from friends quickly\n\nReliability. The system needs to be reliable,\nbut data point lost once in a while is fine.\n\nEventual consistency. A few seconds in delay to\nget location reads from replicas is ok.",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Low latency. We want to receive location\nupdates from friends quickly\n\nReliability. The system needs to be reliable,\nbut data point lost once in a while is fine.\n\nEventual consistency. A few seconds in delay to\nget location reads from replicas is ok.",
"lineHeight": 1.2
},
{
"type": "text",
"version": 353,
"versionNonce": 112008567,
"isDeleted": false,
"id": "c2XgRTtX1w3KhOG9_Z0Yz",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 164.571373523824,
"y": -1411.7900630176825,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 365.625,
"height": 211.2,
"seed": 958154585,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007004976,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "10 million DAU\n\nUser has avg of 400 friends, assume\nall use the \"nearby friends\" feature\n\nApp displays 20 nearby friends per page\nand can load more pages on request\n\nLocation refreshes every 30 secs\n\n10 mil/30 sec = 334k QPS",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "10 million DAU\n\nUser has avg of 400 friends, assume\nall use the \"nearby friends\" feature\n\nApp displays 20 nearby friends per page\nand can load more pages on request\n\nLocation refreshes every 30 secs\n\n10 mil/30 sec = 334k QPS",
"lineHeight": 1.2
},
{
"type": "text",
"version": 944,
"versionNonce": 812422969,
"isDeleted": false,
"id": "R-m0NnZFdyUvNAtJT5zN5",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -413.6648477852721,
"y": -496.5558173468604,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 99.97990417480469,
"height": 25,
"seed": 1550704569,
"groupIds": [
"HTvvzAP48Qb2fGO4vjpSw",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Mobile App",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Mobile App",
"lineHeight": 1.25
},
{
"type": "rectangle",
"version": 989,
"versionNonce": 824657945,
"isDeleted": false,
"id": "FGI4_UExMBiTcgtYQUIaC",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -393.11091519378357,
"y": -463.1907700545572,
"strokeColor": "#000000",
"backgroundColor": "#ced4da",
"width": 58.89213481702299,
"height": 100.77632899026516,
"seed": 1324056729,
"groupIds": [
"L-AmgPNYM2kqt4Cr1sS-q",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "9SRH2SLh_C37_sKq4k0Vg",
"type": "arrow"
},
{
"id": "NVWkNLjiJ-dxCVkc73wkV",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 768,
"versionNonce": 1480503993,
"isDeleted": false,
"id": "XqnoaUAtSPuzIuw3mL8Ue",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -386.0823983244034,
"y": -455.71622847926676,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 44.59466552734375,
"height": 79.869384765625,
"seed": 1723991417,
"groupIds": [
"L-AmgPNYM2kqt4Cr1sS-q",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 891,
"versionNonce": 1596584857,
"isDeleted": false,
"id": "I7HIlSODsr47LFHLHLP6y",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -367.1514852761098,
"y": -372.963680679443,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 7.390490080180824,
"height": 7.390490080180824,
"seed": 1328868953,
"groupIds": [
"L-AmgPNYM2kqt4Cr1sS-q",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 872,
"versionNonce": 1824135289,
"isDeleted": false,
"id": "k-4A7WhCZ6BTM0rqGqzFF",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -380.1606383846852,
"y": -447.19279164374996,
"strokeColor": "#000000",
"backgroundColor": "#15aabf",
"width": 32.33419667119563,
"height": 34.66566002887225,
"seed": 2132261689,
"groupIds": [
"L-AmgPNYM2kqt4Cr1sS-q",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 1234,
"versionNonce": 582132057,
"isDeleted": false,
"id": "HfUbcHC9tx8i0y7nF4DqL",
"fillStyle": "hachure",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -379.0019174890227,
"y": -404.11648058148205,
"strokeColor": "transparent",
"backgroundColor": "#868e96",
"width": 28.93210671164773,
"height": 5.337681625828628,
"seed": 1187900441,
"groupIds": [
"L-AmgPNYM2kqt4Cr1sS-q",
"xk2ivK1JJCIIn9VXyCO_C"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "text",
"version": 1073,
"versionNonce": 510070329,
"isDeleted": false,
"id": "M8KXPUH5m6IKjXwYUA9g1",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -191.9079105394153,
"y": -460.7492767904125,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 143.17991638183594,
"height": 25,
"seed": 264845495,
"groupIds": [
"cz4eDdu34mY5q94NxY52m",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Load Balancer",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Load Balancer",
"lineHeight": 1.25
},
{
"type": "rectangle",
"version": 1741,
"versionNonce": 112910105,
"isDeleted": false,
"id": "jVIRS-F6EBHj4dmKfkO4J",
"fillStyle": "hachure",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -175.39309059159132,
"y": -423.6871461906733,
"strokeColor": "#000000",
"backgroundColor": "#ced4da",
"width": 112.66774779966488,
"height": 30.16569648281405,
"seed": 2041514455,
"groupIds": [
"hDqvHwgzTKv7QNQ4X-jOo",
"3uRh3zVVaa8wCD9yl7G7a",
"oFtSCwP-tT-o4NMvbf1kk",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "9SRH2SLh_C37_sKq4k0Vg",
"type": "arrow"
},
{
"id": "NVWkNLjiJ-dxCVkc73wkV",
"type": "arrow"
},
{
"id": "bKBifz5Fb75RloE5Xd96o",
"type": "arrow"
},
{
"id": "hpt4k4PiQ6XnsXx-pYqTg",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1186,
"versionNonce": 1076842361,
"isDeleted": false,
"id": "AcnQsT6si7yf8FO9lR2Uj",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -163.98128191631145,
"y": -411.89888107746447,
"strokeColor": "#000000",
"backgroundColor": "#000000",
"width": 6.317885331917057,
"height": 6.317885331917057,
"seed": 83736311,
"groupIds": [
"TCJEZdq2rrA5FC20XmrUE",
"kFK1GwynF85vsu4Dba9cR",
"KaqGiGP_CyGUmCLiRr2o1",
"oFtSCwP-tT-o4NMvbf1kk",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1209,
"versionNonce": 1617492057,
"isDeleted": false,
"id": "w7ksnPfEiyKoDdlveDkV8",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -149.36651547750944,
"y": -411.62760015298545,
"strokeColor": "#000000",
"backgroundColor": "#000000",
"width": 6.317885331917057,
"height": 6.317885331917057,
"seed": 1211744279,
"groupIds": [
"zQImyVQF-p249LWx1BQyM",
"QyL5EAUbYaX9XRczQXm4z",
"KaqGiGP_CyGUmCLiRr2o1",
"oFtSCwP-tT-o4NMvbf1kk",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1229,
"versionNonce": 557483321,
"isDeleted": false,
"id": "GxHEhvIdWaT61OQU2_hX7",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -134.7517490387072,
"y": -411.62760015298545,
"strokeColor": "#000000",
"backgroundColor": "#000000",
"width": 6.317885331917057,
"height": 6.317885331917057,
"seed": 358065463,
"groupIds": [
"6TSci4hKMSjT_d2OTx3hx",
"PjEN6ySFucitq3_HE7jPJ",
"KaqGiGP_CyGUmCLiRr2o1",
"oFtSCwP-tT-o4NMvbf1kk",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1124,
"versionNonce": 1845982745,
"isDeleted": false,
"id": "DPy5JydgCDfMBQAzuxl49",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -83.66475359599895,
"y": -412.9841065006417,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 8.75961710275031,
"height": 8.75961710275031,
"seed": 196863575,
"groupIds": [
"dFaM4pnp6UTBECU4jU-hx",
"RMKyo4cgGrrovcHltYTF-",
"oFtSCwP-tT-o4NMvbf1kk",
"RKCRdV2plCbOOEmeLvDjf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "arrow",
"version": 165,
"versionNonce": 339364887,
"isDeleted": false,
"id": "9SRH2SLh_C37_sKq4k0Vg",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -323.81317659286015,
"y": -421.0789875143703,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 140.25811401180488,
"height": 41.94534410962291,
"seed": 47628697,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007053801,
"link": null,
"locked": false,
"startBinding": {
"elementId": "FGI4_UExMBiTcgtYQUIaC",
"focus": 0.18915488264602404,
"gap": 10.405603783900432
},
"endBinding": {
"elementId": "jVIRS-F6EBHj4dmKfkO4J",
"focus": -0.6622428761195509,
"gap": 8.16197198946395
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
67.81074107182303,
-35.224025044927544
],
[
140.25811401180488,
6.721319064695365
]
]
},
{
"type": "arrow",
"version": 169,
"versionNonce": 750007127,
"isDeleted": false,
"id": "NVWkNLjiJ-dxCVkc73wkV",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -321.83631804442035,
"y": -391.96525252825666,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 138.89228446924648,
"height": 48.30274148699192,
"seed": 1253260727,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "onHyJSX_ULcrZ_3XEO-PV"
}
],
"updated": 1707007182549,
"link": null,
"locked": false,
"startBinding": {
"elementId": "FGI4_UExMBiTcgtYQUIaC",
"focus": -0.10620828297781165,
"gap": 12.382462332340225
},
"endBinding": {
"elementId": "jVIRS-F6EBHj4dmKfkO4J",
"focus": 0.547213942526927,
"gap": 7.5509429835825586
},
"lastCommittedPoint": null,
"startArrowhead": "arrow",
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
67.77479818912411,
45.86311832380369
],
[
138.89228446924648,
-2.43962316318823
]
]
},
{
"type": "text",
"version": 8,
"versionNonce": 442954713,
"isDeleted": false,
"id": "onHyJSX_ULcrZ_3XEO-PV",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -268.12401985529624,
"y": -355.702134204453,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 80221207,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007181961,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(1)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "NVWkNLjiJ-dxCVkc73wkV",
"originalText": "(1)",
"lineHeight": 1.2
},
{
"type": "text",
"version": 73,
"versionNonce": 329621689,
"isDeleted": false,
"id": "rdNh2Cg2WA5SN04co2QgK",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -273.52459083675376,
"y": -477.27568461410965,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 37.5,
"height": 19.2,
"seed": 781001623,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "http",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "http",
"lineHeight": 1.2
},
{
"type": "text",
"version": 132,
"versionNonce": 730014105,
"isDeleted": false,
"id": "joOJ-p5Fd76yYU9l5E1zZ",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -294.7501568826407,
"y": -335.91557727870537,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 84.375,
"height": 19.2,
"seed": 1646033271,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "WebSocket",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "WebSocket",
"lineHeight": 1.2
},
{
"type": "rectangle",
"version": 238,
"versionNonce": 1908246137,
"isDeleted": false,
"id": "d9pkChQ3itAQ9HV_NwymS",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 133.19578758617848,
"y": -639.428249782077,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 118.3203125,
"height": 119.703125,
"seed": 1840467447,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 179,
"versionNonce": 1360547673,
"isDeleted": false,
"id": "gVPoqTdJDHCWfr0M2PVM0",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 125.84169304917799,
"y": -648.4182782130918,
"strokeColor": "#000000",
"backgroundColor": "#fff",
"width": 118.3203125,
"height": 119.703125,
"seed": 1411675927,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "7MGmfQb6-Cuy11Gpi-hfO",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 253,
"versionNonce": 1577913625,
"isDeleted": false,
"id": "lzSNCxnsDZWNkqfVEK5qm",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 116.60341179917799,
"y": -658.1214032130918,
"strokeColor": "#000000",
"backgroundColor": "#fff",
"width": 118.3203125,
"height": 126,
"seed": 1624472631,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [
{
"type": "text",
"id": "V4Stg9YVrPhFXONsR1LuU"
},
{
"id": "hpt4k4PiQ6XnsXx-pYqTg",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "text",
"version": 134,
"versionNonce": 587071993,
"isDeleted": false,
"id": "V4Stg9YVrPhFXONsR1LuU",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 124.20106804917799,
"y": -652.7214032130918,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 103.125,
"height": 115.19999999999999,
"seed": 1497407097,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "User \nService\n(User \nmanagement,\nadd \nfriends)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "lzSNCxnsDZWNkqfVEK5qm",
"originalText": "User Service\n(User management, add friends)",
"lineHeight": 1.2
},
{
"type": "rectangle",
"version": 290,
"versionNonce": 1490982841,
"isDeleted": false,
"id": "_5y2bziEoS6TxLhZYyx4l",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 136.63731860459876,
"y": -410.4226655263365,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 118.3203125,
"height": 119.703125,
"seed": 163558679,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 231,
"versionNonce": 1820670105,
"isDeleted": false,
"id": "vvkQYpPgkBCrFEQZ0Ib3S",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 129.28322406759827,
"y": -419.4126939573512,
"strokeColor": "#000000",
"backgroundColor": "#fff",
"width": 118.3203125,
"height": 119.703125,
"seed": 2086074935,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 310,
"versionNonce": 1149339961,
"isDeleted": false,
"id": "87eAjZoMFXUhQSrbc1k8O",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 120.04494281759827,
"y": -429.1158189573512,
"strokeColor": "#000000",
"backgroundColor": "#fff",
"width": 118.3203125,
"height": 126,
"seed": 1644731223,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [
{
"type": "text",
"id": "RY68vR2U4aVGGt8-tBdsi"
},
{
"id": "bKBifz5Fb75RloE5Xd96o",
"type": "arrow"
},
{
"id": "cgMDJMX2tT3BIZrihAA6h",
"type": "arrow"
},
{
"id": "shBxEYx3PGMnXqBHyM7MW",
"type": "arrow"
},
{
"id": "EC-Pb2-z-ARvu6c0i_pBJ",
"type": "arrow"
},
{
"id": "XSwhTO5O2c69l8aRYexsP",
"type": "arrow"
},
{
"id": "DyL75H_q4L1swrJPSzj5v",
"type": "arrow"
}
],
"updated": 1707007206667,
"link": null,
"locked": false
},
{
"type": "text",
"version": 225,
"versionNonce": 734045785,
"isDeleted": false,
"id": "RY68vR2U4aVGGt8-tBdsi",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 132.33009906759827,
"y": -394.91581895735123,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 93.75,
"height": 57.599999999999994,
"seed": 522786935,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Location \nWebSocket \nServers",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "87eAjZoMFXUhQSrbc1k8O",
"originalText": "Location WebSocket Servers",
"lineHeight": 1.2
},
{
"type": "arrow",
"version": 214,
"versionNonce": 1616522327,
"isDeleted": false,
"id": "bKBifz5Fb75RloE5Xd96o",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -54.70432096581516,
"y": -400.96894464433166,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 161.19484318391738,
"height": 59.72359246456921,
"seed": 1011159799,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "Ch-46CzuU1phKMUpJEpE_"
}
],
"updated": 1707007187609,
"link": null,
"locked": false,
"startBinding": {
"elementId": "jVIRS-F6EBHj4dmKfkO4J",
"focus": -0.45080120573816745,
"gap": 8.02102182611128
},
"endBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": -0.6101287292681496,
"gap": 13.55442059949604
},
"lastCommittedPoint": null,
"startArrowhead": "arrow",
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
161.19484318391738,
59.72359246456921
]
]
},
{
"type": "text",
"version": 4,
"versionNonce": 2026031833,
"isDeleted": false,
"id": "Ch-46CzuU1phKMUpJEpE_",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 11.830600626143536,
"y": -380.7071484120471,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 807569815,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007187134,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(2)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "bKBifz5Fb75RloE5Xd96o",
"originalText": "(2)",
"lineHeight": 1.2
},
{
"type": "arrow",
"version": 120,
"versionNonce": 1767771863,
"isDeleted": false,
"id": "hpt4k4PiQ6XnsXx-pYqTg",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -52.54325514354343,
"y": -415.6381336458226,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 159.40668476964686,
"height": 179.27860604180438,
"seed": 1819505753,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007053802,
"link": null,
"locked": false,
"startBinding": {
"elementId": "jVIRS-F6EBHj4dmKfkO4J",
"focus": 0.8640316133230931,
"gap": 10.182087648383003
},
"endBinding": {
"elementId": "lzSNCxnsDZWNkqfVEK5qm",
"focus": 0.5966309446893842,
"gap": 9.739982173074566
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
159.40668476964686,
-179.27860604180438
]
]
},
{
"type": "text",
"version": 225,
"versionNonce": 660733273,
"isDeleted": false,
"id": "tTrbMZnbX9cfPStHX9yXv",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.344069536509628,
"x": -36.27884484881382,
"y": -362.8936885784576,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 101.91796875,
"height": 32.11475104755629,
"seed": 1665607479,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 13.38114626981512,
"fontFamily": 3,
"text": "bidirectional\nlocation info",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "bidirectional\nlocation info",
"lineHeight": 1.2
},
{
"type": "rectangle",
"version": 241,
"versionNonce": 1066936695,
"isDeleted": false,
"id": "PJrYYyq48qi9kJYs-UowJ",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 427.41499190274135,
"y": -333.7115447410875,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 86.99059306297488,
"height": 91.58350106366856,
"seed": 760059897,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"type": "text",
"id": "ruq99B503dGII2QkQQeg_"
},
{
"id": "cgMDJMX2tT3BIZrihAA6h",
"type": "arrow"
}
],
"updated": 1707007230910,
"link": null,
"locked": false
},
{
"type": "text",
"version": 192,
"versionNonce": 1240703513,
"isDeleted": false,
"id": "ruq99B503dGII2QkQQeg_",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 433.4102884342288,
"y": -316.7197942092532,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 75,
"height": 57.599999999999994,
"seed": 1690548281,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007235234,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Location\nCache \n(Redis)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "PJrYYyq48qi9kJYs-UowJ",
"originalText": "Location Cache (Redis)",
"lineHeight": 1.2
},
{
"type": "ellipse",
"version": 1033,
"versionNonce": 817891545,
"isDeleted": false,
"id": "1QVdplVLBL6Hw_DLpTiqU",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 440.36003583340425,
"y": -718.7754811186733,
"strokeColor": "#343a40",
"backgroundColor": "#ced4da",
"width": 109.8321415321732,
"height": 35.97949463984984,
"seed": 116223959,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1095,
"versionNonce": 1700496825,
"isDeleted": false,
"id": "qxtqKQrxr_Z3Pq-UzdQ9o",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 438.76024132988186,
"y": -663.9331722659745,
"strokeColor": "#343a40",
"backgroundColor": "#ced4da",
"width": 109.8321415321732,
"height": 35.97949463984984,
"seed": 1769954551,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "line",
"version": 2098,
"versionNonce": 1999922841,
"isDeleted": false,
"id": "IsyvvJ903wROWJxEsSrI-",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 547.5676122446862,
"y": -692.248311875479,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 62.919973092203804,
"height": 16.569826567722288,
"seed": 966174231,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
-7.717788171236833,
4.324090850727728
],
[
-19.183327474436958,
7.7110082617861595
],
[
-42.81629072420273,
10.406308680810248
],
[
-61.81392396082347,
10.018292165497847
],
[
-51.88601215932861,
16.569826567722288
],
[
0.6039230297040357,
15.130832712019613
],
[
1.106049131380324,
0.15087939971484624
]
]
},
{
"type": "line",
"version": 3056,
"versionNonce": 553528185,
"isDeleted": false,
"id": "F7kZtKXYaCnqXpqqTHHHi",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 439.5197833522211,
"y": -699.5216150978613,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 56.91296547607416,
"height": 22.041797053944865,
"seed": 1445448503,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
7.065736032717557,
6.881076768591961
],
[
17.995008500752938,
11.734153706773773
],
[
40.417659232343,
16.48280391057008
],
[
56.91296547607416,
18.341940802077865
],
[
50.169384719348834,
22.041797053944865
],
[
0.791927866256203,
18.72707725538081
],
[
0.05115903779665124,
5.6467225601126
]
]
},
{
"type": "rectangle",
"version": 1639,
"versionNonce": 1914261241,
"isDeleted": false,
"id": "4ZkvkNHtsAKN_VVW8XDrp",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 441.5365606590194,
"y": -681.2217905642538,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 106.25696548475567,
"height": 34.374661986468986,
"seed": 1268206679,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "7MGmfQb6-Cuy11Gpi-hfO",
"type": "arrow"
},
{
"id": "DyL75H_q4L1swrJPSzj5v",
"type": "arrow"
}
],
"updated": 1707007206668,
"link": null,
"locked": false
},
{
"type": "line",
"version": 1135,
"versionNonce": 141808153,
"isDeleted": false,
"id": "kE0dRaR3WmSMNJ4VUiPKe",
"fillStyle": "cross-hatch",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 439.679952002155,
"y": -703.8987145804895,
"strokeColor": "#343a40",
"backgroundColor": "white",
"width": 1.7391052169640349,
"height": 58.886483736523175,
"seed": 632924535,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
1.7391052169640349,
58.886483736523175
]
]
},
{
"type": "line",
"version": 1003,
"versionNonce": 1044653817,
"isDeleted": false,
"id": "i3WjiPlAuLv9q5i48rD18",
"fillStyle": "cross-hatch",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 547.463789752645,
"y": -704.7356441447464,
"strokeColor": "#343a40",
"backgroundColor": "white",
"width": 1.4566597020185434,
"height": 61.17970748476482,
"seed": 30630551,
"groupIds": [
"ND56PiffmbWiN9YScY1qn",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
1.4566597020185434,
61.17970748476482
]
]
},
{
"type": "text",
"version": 1523,
"versionNonce": 792443799,
"isDeleted": false,
"id": "hqponLvGgS6GKIPbQflZC",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 465.1439049600765,
"y": -750.6042003268851,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 55.539947509765625,
"height": 25,
"seed": 1620637623,
"groupIds": [
"oE3CYEuOgEu6uynmqXlXN",
"dsQKkGJzhUWhRoLlR0PIE",
"Bk4kxs5hmPt4KVjrm6bKT"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007317327,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Users",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Users",
"lineHeight": 1.25
},
{
"type": "arrow",
"version": 113,
"versionNonce": 28017943,
"isDeleted": false,
"id": "7MGmfQb6-Cuy11Gpi-hfO",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 267.06368485269,
"y": -596.458390513572,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 167.84204996112408,
"height": 82.69777539676704,
"seed": 1330780951,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007053802,
"link": null,
"locked": false,
"startBinding": {
"elementId": "gVPoqTdJDHCWfr0M2PVM0",
"focus": 0.3656291492278748,
"gap": 22.901679303512026
},
"endBinding": {
"elementId": "4ZkvkNHtsAKN_VVW8XDrp",
"focus": 1.027706207676615,
"gap": 6.630825845205322
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
167.84204996112408,
-82.69777539676704
]
]
},
{
"type": "ellipse",
"version": 1151,
"versionNonce": 971055289,
"isDeleted": false,
"id": "ufEPYzK_JMHsgU0JfGPbn",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 410.9713789250966,
"y": -461.91123109820535,
"strokeColor": "#343a40",
"backgroundColor": "#ced4da",
"width": 109.8321415321732,
"height": 35.97949463984984,
"seed": 1686739641,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007225259,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1213,
"versionNonce": 2119082393,
"isDeleted": false,
"id": "2jTaaQSX6FU172_wCZPcN",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 409.3715844215742,
"y": -407.06892224550654,
"strokeColor": "#343a40",
"backgroundColor": "#ced4da",
"width": 109.8321415321732,
"height": 35.97949463984984,
"seed": 1909971865,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007225259,
"link": null,
"locked": false
},
{
"type": "line",
"version": 2216,
"versionNonce": 1595475577,
"isDeleted": false,
"id": "8akRXzSE0WN_KXsYDLYx3",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 518.1789553363785,
"y": -435.38406185501105,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 62.919973092203804,
"height": 16.569826567722288,
"seed": 1097531513,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007225259,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
-7.717788171236833,
4.324090850727728
],
[
-19.183327474436958,
7.7110082617861595
],
[
-42.81629072420273,
10.406308680810248
],
[
-61.81392396082347,
10.018292165497847
],
[
-51.88601215932861,
16.569826567722288
],
[
0.6039230297040357,
15.130832712019613
],
[
1.106049131380324,
0.15087939971484624
]
]
},
{
"type": "line",
"version": 3174,
"versionNonce": 117690201,
"isDeleted": false,
"id": "7DspaBsag0BhzuvL8yXEf",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 410.13112644391344,
"y": -442.65736507739337,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 56.91296547607416,
"height": 22.041797053944865,
"seed": 17205593,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007225259,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
7.065736032717557,
6.881076768591961
],
[
17.995008500752938,
11.734153706773773
],
[
40.417659232343,
16.48280391057008
],
[
56.91296547607416,
18.341940802077865
],
[
50.169384719348834,
22.041797053944865
],
[
0.791927866256203,
18.72707725538081
],
[
0.05115903779665124,
5.6467225601126
]
]
},
{
"type": "rectangle",
"version": 1757,
"versionNonce": 2086829113,
"isDeleted": false,
"id": "IPLDksn2bw_7q4scf5FXf",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 412.14790375071175,
"y": -424.35754054378583,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 106.25696548475567,
"height": 34.374661986468986,
"seed": 1509815865,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "shBxEYx3PGMnXqBHyM7MW",
"type": "arrow"
}
],
"updated": 1707007225259,
"link": null,
"locked": false
},
{
"type": "line",
"version": 1253,
"versionNonce": 803789529,
"isDeleted": false,
"id": "HEnMKpQoPINHCfstENFS5",
"fillStyle": "cross-hatch",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 410.29129509384734,
"y": -447.03446456002155,
"strokeColor": "#343a40",
"backgroundColor": "white",
"width": 1.7391052169640349,
"height": 58.886483736523175,
"seed": 2134165273,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007225260,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
1.7391052169640349,
58.886483736523175
]
]
},
{
"type": "line",
"version": 1121,
"versionNonce": 1805260729,
"isDeleted": false,
"id": "Hg8iY4FycAdwyvgOc7Jtx",
"fillStyle": "cross-hatch",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0.028963420403457896,
"x": 518.0751328443373,
"y": -447.8713941242785,
"strokeColor": "#343a40",
"backgroundColor": "white",
"width": 1.4566597020185434,
"height": 61.17970748476482,
"seed": 2065595385,
"groupIds": [
"idEcp1x37CN3Tv-8LwRrM",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007225260,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
1.4566597020185434,
61.17970748476482
]
]
},
{
"type": "text",
"version": 1715,
"versionNonce": 1036086201,
"isDeleted": false,
"id": "XQUTxJQG0EJAk_1o2C-bl",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 400.91973136452214,
"y": -493.81757450062275,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 159.15985107421875,
"height": 25,
"seed": 1035900121,
"groupIds": [
"3JyeH0Zzm7h5P8a0sZlmA",
"GrsGMVIy1T8caZf4oi8yO",
"FWdL6cCJcahf32Xe3ltjG"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007311977,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Location History",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Location History",
"lineHeight": 1.25
},
{
"type": "arrow",
"version": 386,
"versionNonce": 1084057815,
"isDeleted": false,
"id": "cgMDJMX2tT3BIZrihAA6h",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 256.8402683727403,
"y": -335.0536849897001,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 157.2675139378723,
"height": 52.331158184084416,
"seed": 1673732023,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "UQlv48rLDPOqu_9nJqsVC"
}
],
"updated": 1707007230910,
"link": null,
"locked": false,
"startBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": 0.062457909718093466,
"gap": 18.47501305514203
},
"endBinding": {
"elementId": "PJrYYyq48qi9kJYs-UowJ",
"focus": -0.39987514434659027,
"gap": 13.307209592128743
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
157.2675139378723,
52.331158184084416
]
]
},
{
"type": "text",
"version": 9,
"versionNonce": 1757665369,
"isDeleted": false,
"id": "UQlv48rLDPOqu_9nJqsVC",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 317.8410422091072,
"y": -432.81725767012614,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 1638522711,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007220624,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(4)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "cgMDJMX2tT3BIZrihAA6h",
"originalText": "(4)",
"lineHeight": 1.2
},
{
"type": "arrow",
"version": 240,
"versionNonce": 1184465401,
"isDeleted": false,
"id": "shBxEYx3PGMnXqBHyM7MW",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 260.4464431805023,
"y": -385.87877857645253,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 138.863539174636,
"height": 6.243744402986863,
"seed": 305812377,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "B4BPiyJdOrF7gvkGw7YOF"
}
],
"updated": 1707007225260,
"link": null,
"locked": false,
"startBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": -0.24548991421167662,
"gap": 22.081187862904017
},
"endBinding": {
"elementId": "IPLDksn2bw_7q4scf5FXf",
"focus": -0.6171604015442823,
"gap": 12.83792139557346
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
138.863539174636,
-6.243744402986863
]
]
},
{
"type": "text",
"version": 8,
"versionNonce": 1688771767,
"isDeleted": false,
"id": "B4BPiyJdOrF7gvkGw7YOF",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 315.3309690978943,
"y": -306.3978464217932,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 1796221529,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007217002,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(3)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "shBxEYx3PGMnXqBHyM7MW",
"originalText": "(3)",
"lineHeight": 1.2
},
{
"type": "rectangle",
"version": 1471,
"versionNonce": 1878806329,
"isDeleted": false,
"id": "4C5QVEFQ-unptPRAiQ7YN",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 91.70863847433571,
"y": -118.70325125750219,
"strokeColor": "#000000",
"backgroundColor": "#ced4da",
"width": 179.18708648278113,
"height": 52.35352756923032,
"seed": 1392676343,
"groupIds": [
"a3rnNiRBy4RDvQg-jPbYR",
"Y2HUJ47s2RDVwu3Ja-WJw"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "XSwhTO5O2c69l8aRYexsP",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1009,
"versionNonce": 1442840601,
"isDeleted": false,
"id": "tmUmmQ12oZNIMnmXsLp1s",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 78.82384812780998,
"y": -118.71433349886206,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 26.910901449043095,
"height": 52.59852965616796,
"seed": 1301002007,
"groupIds": [
"a3rnNiRBy4RDvQg-jPbYR",
"Y2HUJ47s2RDVwu3Ja-WJw"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "XSwhTO5O2c69l8aRYexsP",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "ellipse",
"version": 1332,
"versionNonce": 1137675737,
"isDeleted": false,
"id": "UCewAU8dJMN4ie4Y7lw1J",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 257.96532538335356,
"y": -118.38999954366386,
"strokeColor": "#000000",
"backgroundColor": "#ced4da",
"width": 26.910901449043095,
"height": 51.994803546728704,
"seed": 726842423,
"groupIds": [
"j0jSdfiN072EXE0v4i7zo",
"a3rnNiRBy4RDvQg-jPbYR",
"Y2HUJ47s2RDVwu3Ja-WJw"
],
"frameId": null,
"roundness": null,
"boundElements": [
{
"id": "EC-Pb2-z-ARvu6c0i_pBJ",
"type": "arrow"
}
],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 1809,
"versionNonce": 1441180569,
"isDeleted": false,
"id": "Uxsqpk7qvpwRuKMk7GpuM",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 256.0268708092031,
"y": -117.95391000493396,
"strokeColor": "transparent",
"backgroundColor": "#ced4da",
"width": 16.935173537299587,
"height": 51.04397170199983,
"seed": 3939671,
"groupIds": [
"j0jSdfiN072EXE0v4i7zo",
"a3rnNiRBy4RDvQg-jPbYR",
"Y2HUJ47s2RDVwu3Ja-WJw"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false
},
{
"type": "text",
"version": 1270,
"versionNonce": 1528811641,
"isDeleted": false,
"id": "ZMom2MZGzmyR4B3kYfGVe",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 108.90730589528181,
"y": -152.4087111945471,
"strokeColor": "#000000",
"backgroundColor": "#ffff",
"width": 139.5398712158203,
"height": 25,
"seed": 1872517751,
"groupIds": [
"jT9f_ddWhZl3_PRjwTnHF",
"xsVwPcdB-ZHYfuOmsfZu5",
"Y2HUJ47s2RDVwu3Ja-WJw"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007053707,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Redis Pub/Sub",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Redis Pub/Sub",
"lineHeight": 1.25
},
{
"type": "arrow",
"version": 258,
"versionNonce": 1444457977,
"isDeleted": false,
"id": "EC-Pb2-z-ARvu6c0i_pBJ",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 223.09130678307838,
"y": -286.0052419886292,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 127.71884005060201,
"height": 196.89987781604884,
"seed": 436095479,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "f-5P3LyP83nW60uy6bzjH"
}
],
"updated": 1707007241894,
"link": null,
"locked": false,
"startBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": 0.43344177479394747,
"gap": 17.110576968722
},
"endBinding": {
"elementId": "UCewAU8dJMN4ie4Y7lw1J",
"focus": 1.1391914833878618,
"gap": 7.805724324283824
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
127.71884005060201,
96.99640537597816
],
[
69.49729451854438,
196.89987781604884
]
]
},
{
"type": "text",
"version": 4,
"versionNonce": 2116801495,
"isDeleted": false,
"id": "f-5P3LyP83nW60uy6bzjH",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 336.7476468336804,
"y": -198.60883661265106,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 812731577,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007240872,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(5)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "EC-Pb2-z-ARvu6c0i_pBJ",
"originalText": "(5)",
"lineHeight": 1.2
},
{
"type": "arrow",
"version": 280,
"versionNonce": 526285721,
"isDeleted": false,
"id": "XSwhTO5O2c69l8aRYexsP",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 70.43949542978244,
"y": -89.38610045699258,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 87.50820403949564,
"height": 214.37897191677703,
"seed": 1387795415,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "4ylWtRRjYHZIjQYPkVsUp"
}
],
"updated": 1707007245493,
"link": null,
"locked": false,
"startBinding": {
"elementId": "tmUmmQ12oZNIMnmXsLp1s",
"focus": -1.237766677566928,
"gap": 8.461150015034454
},
"endBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": 0.2222900808221151,
"gap": 13.367385131015055
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
-51.270141782694864,
-101.84869156438529
],
[
36.238062256800774,
-214.37897191677703
]
]
},
{
"type": "text",
"version": 4,
"versionNonce": 1280624695,
"isDeleted": false,
"id": "4ylWtRRjYHZIjQYPkVsUp",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 5.106853647087576,
"y": -200.83479202137787,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 28.125,
"height": 19.2,
"seed": 1018155609,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007244967,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "(6)",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "XSwhTO5O2c69l8aRYexsP",
"originalText": "(6)",
"lineHeight": 1.2
},
{
"type": "arrow",
"version": 75,
"versionNonce": 432929305,
"isDeleted": false,
"id": "DyL75H_q4L1swrJPSzj5v",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 265.9265146416776,
"y": -417.13335097838467,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 176.30641633443008,
"height": 215.6127374540232,
"seed": 1418787735,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1707007206668,
"link": null,
"locked": false,
"startBinding": {
"elementId": "87eAjZoMFXUhQSrbc1k8O",
"focus": 0.40663490188088847,
"gap": 27.561259324079344
},
"endBinding": {
"elementId": "4ZkvkNHtsAKN_VVW8XDrp",
"focus": 0.3996220314032151,
"gap": 14.101040145376942
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
176.30641633443008,
-215.6127374540232
]
]
},
{
"type": "text",
"version": 904,
"versionNonce": 1216464311,
"isDeleted": false,
"id": "v9qhYjlG2oNRLgkCGzJsn",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 633.924216618734,
"y": -725.7587450117876,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 803.90625,
"height": 604.8000000000001,
"seed": 895822169,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007546679,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 3,
"text": "(1) Mobile app sends location update to LB\n(2) LB forwards update to WS server\n(3) WS server saves location data to\n Location History DB\n(4) WS server updates new location in the\n location cache. Updates some variable\n in a connection handler to calculate\n distances.\n(5) WS server publishes new location to\n user's channel in the Redis Pub/Sub server\n \n Note: Steps 3 to 5 can be done concurrently\n(6) Each subscriber (friend of user) receives the\n user location update.\n(7) WS server computes distance between \n user and subscriber. If within specified\n radius, an update is sent to the subscriber's\n client.",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "(1) Mobile app sends location update to LB\n(2) LB forwards update to WS server\n(3) WS server saves location data to\n Location History DB\n(4) WS server updates new location in the\n location cache. Updates some variable\n in a connection handler to calculate\n distances.\n(5) WS server publishes new location to\n user's channel in the Redis Pub/Sub server\n \n Note: Steps 3 to 5 can be done concurrently\n(6) Each subscriber (friend of user) receives the\n user location update.\n(7) WS server computes distance between \n user and subscriber. If within specified\n radius, an update is sent to the subscriber's\n client.",
"lineHeight": 1.2
},
{
"type": "text",
"version": 179,
"versionNonce": 189499191,
"isDeleted": false,
"id": "-v5Z2bdYg3tnGYnuLIvNd",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -420.3917210130083,
"y": -1181.5426624103184,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 393.75,
"height": 57.599999999999994,
"seed": 121103991,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007639728,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Mostly concerned about WebSocket API's,\nuser/friend management is trivial for this\nproblem",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Mostly concerned about WebSocket API's,\nuser/friend management is trivial for this\nproblem",
"lineHeight": 1.2
},
{
"type": "text",
"version": 338,
"versionNonce": 17129401,
"isDeleted": false,
"id": "NDE9elOlq6BLRMKpkGJjN",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -422.24466399007645,
"y": -1101.1403546859244,
"strokeColor": "#6741d9",
"backgroundColor": "transparent",
"width": 403.125,
"height": 153.6,
"seed": 1648402071,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007798808,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "POST /locationUpdate/{lat, long, timestamp}\n\nupdate location every 30 secs\n\nGET /friendLocation\n\nWebSocket server gets updates from friends\nas they come in",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "POST /locationUpdate/{lat, long, timestamp}\n\nupdate location every 30 secs\n\nGET /friendLocation\n\nWebSocket server gets updates from friends\nas they come in",
"lineHeight": 1.2
},
{
"type": "text",
"version": 174,
"versionNonce": 318444087,
"isDeleted": false,
"id": "GdOJhdwEAbSw3vbSa_Udc",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 165.0613995569928,
"y": -1114.7269129015922,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 403.125,
"height": 153.6,
"seed": 504037303,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707007863051,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "Location Cache:\n\nKey: user_id, Value: {lat, long, timestamp}\n\nLocation History:\n\nuser_id | latitude | longitude | timestamp\n",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Location Cache:\n\nKey: user_id, Value: {lat, long, timestamp}\n\nLocation History:\n\nuser_id | latitude | longitude | timestamp\n",
"lineHeight": 1.2
},
{
"type": "text",
"version": 1687,
"versionNonce": 637197273,
"isDeleted": false,
"id": "cHgYht7CLkSsk_m8BiaA3",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -405.0640736432038,
"y": 19.538423278669768,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 684.375,
"height": 480,
"seed": 506708631,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1707011022181,
"link": null,
"locked": false,
"fontSize": 16,
"fontFamily": 3,
"text": "How to scale, we might need a Pub/Sub channel for each DAU (100 million)?\n\nMuch more likely to be limited by CPU usage rather than memory\n\n14 million updates per second (334k updates * 40 friends)\n\nWe can solve this using a Distributed Redis Pub/Sub server cluster\n\nWe'll can use some kind of service discovery package to handle this\nlike etcd or ZooKeeper. \n\nThe book goes a lot more into consistent hashing but basically you \njust need to know that there is a Hash Ring (hashed on channel id)\nthat will point a location update to the right Pub/Sub server.\n\nWhile something like etcd/ZooKeeper will be the source of truth, you\ncan also cache the hash ring in-memory in each WebSocket server \nfor increased speed\n\nExtra feature: Nearby random person (ie anyone who opted to location \nsharing for anyone to see) - use geohashes, create channel for each\ngrid/hash for a certain precision\n\nAlternative to Redis Pub/Sub: Apparently can use Erlang? I don't\nknow too much about this and never heard of this case before",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "How to scale, we might need a Pub/Sub channel for each DAU (100 million)?\n\nMuch more likely to be limited by CPU usage rather than memory\n\n14 million updates per second (334k updates * 40 friends)\n\nWe can solve this using a Distributed Redis Pub/Sub server cluster\n\nWe'll can use some kind of service discovery package to handle this\nlike etcd or ZooKeeper. \n\nThe book goes a lot more into consistent hashing but basically you \njust need to know that there is a Hash Ring (hashed on channel id)\nthat will point a location update to the right Pub/Sub server.\n\nWhile something like etcd/ZooKeeper will be the source of truth, you\ncan also cache the hash ring in-memory in each WebSocket server \nfor increased speed\n\nExtra feature: Nearby random person (ie anyone who opted to location \nsharing for anyone to see) - use geohashes, create channel for each\ngrid/hash for a certain precision\n\nAlternative to Redis Pub/Sub: Apparently can use Erlang? I don't\nknow too much about this and never heard of this case before",
"lineHeight": 1.2
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
},
"files": {}
}