---
# System prepended metadata

title: Elofun Architectures
tags: [Elofun, Architecture]

---

# Elofun Architectures

[TOC]

## Architecture

![](https://i.imgur.com/rdpjttV.jpg)


## Languages

Server: Typescript + NodeJS
Client: Typescript + ReactJS
Deployment: Docker

## DiscoveryService

Connection: HTTPS
Location: AWS

- Maintain client load balance registry
- Keepalive GameService and update registry

## GameService
General logic

Connection: Websocket
Location: AWS
Modules:
- Auth
- GameProfile
- Shop
- User Notification (Mail box)
- User Activities and analytic
- Leaderboard, Championship
- Game server

Database: 
- DB: Store user data
- CacheDb: PubSub, Memorycache

## GameServer

host multiple GameRoom. spawn and manage by GameService

Connection: Websocket
Locations: Local Region(optimize ping)
Life circle:

1. GameService matching => Request create a game room
```
    roomId 
    bundleGameServerSourceCDN
    bundleBotSourceCDN
```
2. GameServer download `bundleGameServerSourceCDN` and create new instance
3. Client connect
4. Match start
5. End match => Update result to GameService
6. Kill instance


## Client

ReactJS hosted on CDN
Life circle:
1. Connect DiscoveryService to lookup GameService(version=x) 
2. Connect to GameService
3. User request a matching
4. Server response GameServer url + RoomInfo
5. Download `bundleGameClientSourceCDN`
6. Connect to GameServer via ws and play game


## Game

Build base on EloGameSDK. (allow develop game base on Nodejs, CocosCreator)

Webpack bundles source => upload s3 

```
    gameId
    gameVersion
    bundleGameServerSourceCDN
    bundleGameClientSourceCDN
    bundleBotSourceCDN
```

## Trackings

Third party analytic services


## Proposal - Event sourcing approach

User activities store inside DB under Actions and Events

- Actions: User action (openaccount, connect, buyitem, requestmatch, winmatch, losematch....)
- Events: trigger by action (dailyRewardReceived, matchRewardReceived, friendOpenAccountWithRefCode, ....)

**Biz logic building base on action and events**

Example: 

- Action connect after x days => send welcomeback gift 
- friendOpenAccountWithRefCode 3 times => send friend invited gift

Ref: 

- https://martinfowler.com/eaaDev/EventSourcing.html
- https://microservices.io/patterns/data/event-sourcing.html



---


![](https://i.imgur.com/uv4IIpJ.jpg =120x)


###### tags: `Elofun` `Architecture`

