Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/logvinovleon/uberchallenge
My email sender for the UBER challenge. https://github.com/uber/coding-challenge-tools/blob/master/coding_challenge.md
https://github.com/logvinovleon/uberchallenge
Last synced: 17 days ago
JSON representation
My email sender for the UBER challenge. https://github.com/uber/coding-challenge-tools/blob/master/coding_challenge.md
- Host: GitHub
- URL: https://github.com/logvinovleon/uberchallenge
- Owner: LogvinovLeon
- License: mit
- Created: 2016-09-25T04:08:38.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2016-09-28T08:42:16.000Z (over 8 years ago)
- Last Synced: 2024-10-31T15:23:42.389Z (2 months ago)
- Language: Go
- Size: 146 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# UberChallenge
My email sender for the UBER challenge.
https://github.com/uber/coding-challenge-tools/blob/master/coding_challenge.md## TL;DR
Just go and try it! [www.uberchallenge.email](www.uberchallenge.email)
The API: [https://api.uberchallenge.email/email](https://api.uberchallenge.email/email) (I would describe it later)##Problem description:
This service allows you to send emails using different email providers.
For now it supports [Mailgun](https://mailgun.com) and [Sendgrid](https://sendgrid.com).
The best and the only feature of this service is that it falls back to the secondary provider if first is down.* Mailgun has 99.99% SLA.
* Sendgrid does not have an SLA.## Scope
The solution focuses on the back-end, but also has a front-end part
which allows to play with the service and send some emails.## Architecture
Back-end and front-end are completely separated.
They have nothing in common.I just placed them into a single repo so it would be easier for you to review.
### Back-end
Back-end is a Go app.
I have absolutely no experience with Go and started learning it after I decided to write this project.#### Why Go?
* Go is designed to be fast, safe and reliable.
* It's statically typed.
* It is also designed for web.
* This service is IO-heavy. It spends most of the time communicating with the providers.
* Go runs every request in it's own goroutine, so if one request get's stuck or slow or fails it would not affect other users.The whole back-end contains of a single endpoint which allows you to (surprise!) send emails.
It you want to test it you can execute this command from console:
```
curl -X POST -H "Content-Type: application/json" \
-d='{"to":"[email protected]", \
"subject": "Lorem", \
"body": "ipsum"}' \
https://api.uberchallenge.email/email -i
```I wanted to keep it as simple as possible, that's why I'm not using any frameworks.
You don't need them for such a simple app.
It also has `preferred_provider` parameter which is not required.
You can set it to `sendgrid` if you're brave. By default we start sending with `mailgun`.####Back-end is deployed on Heroku and this gives me a couple of benefits
* Monitoring & metrics
* Logging
* Continuous deployment (github integration and easy rollbacks)
* Scalability (the servers are completely stateless, so I can just add more instances with a single command)If this night this service would become EXTREMELY popular I CAN (but wouldn't because of the costs) handle the load.
I would receive an email from mailgun, that I would reach the quota soon.
The only two actions that I need to do is to change the mailgun plan and scale the number of heroku instances.If I would have more time and motivation I would use some of the auto-scaling solutions, but it seemed to be an overkill.
#### Security
The service checks the correctness of the client input and uses https.I do not store any tokens/API keys in the repo.
In order to run the service you need to set those environment variables:
```
SENDGRID_API_KEY
MAILGUN_DOMAIN
MAILGUN_API_KEY
MAILGUN_API_KEY
PORT (heroku sets it)
```And execute:
`go run web.go`If you're planning to use only one provider you don't need to set the variables for the other one.
### Font-end
Front-end is in [docs](docs) directory.
It's just a couple of static files, so you can run it on your local machine.
I'm serving them using github pages connected to a custom domain.
GitHub Pages sites have a bandwidth limit of 100GB or 100,000 requests per month.
If my front-end would become EXTREMELY popular at night I would receive a polite email from GitHub (they guarantee it) and would setup a CDN in front of GH pages.
GH pages is already a CDN, so it also allows we to serve my page faster to the users in different locations.
#### Security
I do not have any confidential or sensitive information on those pages, that's why I don't use https for Front-end.
(Also because GH Pages does not support https for custom domains yet)
If it would be critical I can setup a CDN in front of it/instead of it and have https.
#### Speed
I did not use any heavy css frameworks like bootstrap.
I used [milligram](https://milligram.github.io/) which is only 2kB gzipped.# Other projects I'm proud about
* [Interpreter of my own functional language written in Haskell](https://github.com/LogvinovLeon/MIML)
* [Algorithmic trading bot for Jane Street hackathon](https://github.com/LogvinovLeon/eth1)
* Awesome work on Profilers and JS packaging that I've done at Quora, but cannot describe here because of an NDA.# Links:
* [My CV](https://docs.google.com/document/d/1wxfYc1kwj5c51uXhXfhgFe0ZjelIctBDrPelmXH3VBA/edit) (It has all other links inside)
* [My Github](https://github.com/LogvinovLeon)