Simple, but blazingly fast, url shortener in various languages and frameworks
Note: this is just a simple service to learn various languages and frameworks. Efficiency nor security or mantainabilty are the main intention in this project.
- 🚀
SIMPLE, FAST AND ROBUST - ✨
CUSTOM OR RANDOM UNIQUE URLS (ACCEPTS UNICODE, SPACES... EVEN EMOJIS! 🔝) - 🌺
BEAUTIFUL BY DEFAULT AND CUSTOMIZABLE - 🛡️
AUTOMATIC-SSL READY - 🏗️
CONTAINERIZED AND EASY TO DEPLOY - 📱
RESPONSIVE - 🍃
LIGHTWEIGHT, BUILT-IN CACHE AND HA - 😃
SEO FRIENDLY AND CUSTOM LINK PREVIEWS
- Install:
- Run
make $language/$framework( for examplego/echo)
Important as all WS containers map to port 80, in order to run another language/framework run make stop and then make $language/$framework.
See makefile for further commands.
Use the frontend localhost or interact directly with the shorterner via API calls described below.
Nothing
defaultServes /static
path paramname
defaultRedirects to url specified by name HTTP code 307 in order not to get urls cached by browserserror defaultServes 404.html pageerror application/json{ "message": "error message" }
path paramnamenullablequery paramurl
default{ "id": 33, "name": "shortr", "url": "https://github.com/neoxelox/shortr", "hits": 1, "last_hit_at": "2020-07-27T00:50:42.027431Z", // ( or null ) "created_at": "2020-07-26T23:36:14.896767Z", "modified_at": "2020-07-26T23:36:14.900672Z" }
error default{ "message": "error message" }
path paramname
default{ "id": 33, "name": "shortr", "url": "https://github.com/neoxelox/shortr", "hits": 1, "last_hit_at": "2020-07-27T00:50:42.027431Z", // ( or null ) "created_at": "2020-07-26T23:36:14.896767Z", "modified_at": "2020-07-26T23:36:14.900672Z" }
error default{ "message": "error message" }
path paramnamequery paramurl
default{ "id": 33, "name": "shortr", "url": "https://github.com/neoxelox/shortr", "hits": 1, "last_hit_at": "2020-07-27T00:50:42.027431Z", // ( or null ) "created_at": "2020-07-26T23:36:14.896767Z", "modified_at": "2020-07-26T23:36:14.900672Z" }
error default{ "message": "error message" }
path paramname
defaultServes stats.<renderer>.html pageapplication/json{ "id": 33, "name": "shortr", "url": "https://github.com/neoxelox/shortr", "hits": 1, "last_hit_at": "2020-07-27T00:50:42.027431Z", // ( or null ) "created_at": "2020-07-26T23:36:14.896767Z", "modified_at": "2020-07-26T23:36:14.900672Z" }
error defaultServes 404.html pageerror application/json{ "message": "error message" }
Nothing
defaultOKerror default{ "message": "error message" }
Any
default if templateServes <code>.html pageapplication/json{ "message": "error message" }
The project uses the latest Postgres version available and automatically initializes a pgadmin4 instance localhost:5433 to navigate through the database. Default user is [email protected] and password admin. The server group is called URLs and the default database password is postgres.
URL:
id: integer
name: string
url: string
hits: integer
last_hit_at: datetime nullable
created_at: datetime
modified_at: datetimeThe load testing tool is Locust using 1 master and 4 worker containers, which are automatically created. All follow the locustfile with 2500 users cap and a 25 spawn rate.
The benchmark must not be taken as fully good comparison, but gives a quick overview at language and framework efficiency for this purpose.
The minimum number of simultaneous files open for Locust to work is 10000. You can check your SO's default using ulimit -Sn and then increasing it with ulimit -S -n 10000.
The benchmark was run on (sudo lshw -short):
H/W path Device Class Description
============================================================
system MS-7B29 (Default string)
/0 bus H310M PRO-VDH (MS-7B29)
/0/39/0 memory 8GiB DIMM DDR4 Synchronous 2667 MHz (0,4 ns)
/0/39/2 memory 8GiB DIMM DDR4 Synchronous 2667 MHz (0,4 ns)
/0/46 processor Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz
/0/100/1/0 display GM206 [GeForce GTX 960]
| Language | Framework | Mean requests per second | Maximum requests per second | Slowest request |
|---|---|---|---|---|
| Go | Echo | 6650 rps | 7050 rps | 810 ms |
Feel free to contribute to this project by adding more languages/frameworks, the only requirement is that it has to provide the minimum endpoints described above : ) .
This project is licensed under the MIT License - read the LICENSE file for details.



