The Reviews API has been refractored as a microservice from the existing monolithic API for the e-commerce website, Atelier. It responds to several RESTful endpoints and has been optimized to handle web-scale traffic.
- Implemented an ETL process to migrate over 5GB/13M+ entries into a redesigned postgreSQL database.
- Scaled horizontally to a micro-service architecture with 3 AWS EC2 instances.
- Installed an NGINX load balancer to distribute traffic across servers and utilize proxy_caching.
Optimization | Requests Per Sec | Avg. Response Time | Error % |
---|---|---|---|
EC2 Express Server W/PostgreSQL on AWS | 1000 | 4423 ms | 34.3 |
EC2 Ecpress Server W/NGINX Load Balancer | 1000 | Fail | Fail |
2 EC2 Express Server W/NGNIX Load Balancer | 1000 | 362ms | 13.1 |
2 EC2 Express Server W/NGNIX Load Balancer W/ Proxy Cache | 1000 | 43ms | 0 |
3 EC2 Express Server W/NGNIX Load Balancer W/ Proxy Cache | 2500 | 211ms | 4.2 |
1. Clone the Repository
git clone https://github.com/TheChimeraBros/Reviews-API-Service.git
2. Install Dependencies
npm install
3. Follow the instructions in the README file located in the server
folder to set up the database.
4. Configure Environment Variables
Create a .env
file based on the example.env
file.
5. Start the Server
npm run test
Query Parameters
Parameters should be query strings.
Parameter | Type | Description |
---|---|---|
page | integer | Product for which to retrieve questions. |
count | integer | Specifies how many results per page to return. Default 5 |
sort | text | Changes the sort order of reviews to be based on "newest", "helpful", or "relevant" |
product_id | integer | Specifies the product for which to retrieve reviews. |
{
"product": "2",
"page": 0,
"count": 5,
"results": [
{
"review_id": 5,
"rating": 3,
"summary": "I'm enjoying wearing these shades",
"recommend": false,
"response": null,
"body": "Comfortable and practical.",
"date": "2019-04-14T00:00:00.000Z",
"reviewer_name": "shortandsweeet",
"helpfulness": 5,
"photos": [{
"id": 1,
"url": "urlplaceholder/review_5_photo_number_1.jpg"
},
{
"id": 2,
"url": "urlplaceholder/review_5_photo_number_2.jpg"
},
// ...
]
},
{
"review_id": 3,
"rating": 4,
"summary": "I am liking these glasses",
"recommend": false,
"response": "Glad you're enjoying the product!",
"body": "They are very dark. But that's good because I'm in very sunny spots",
"date": "2019-06-23T00:00:00.000Z",
"reviewer_name": "bigbrotherbenjamin",
"helpfulness": 5,
"photos": [],
},
// ...
]
}
Parameters
Parameter | Type | Description |
---|---|---|
product_id | integer | Specifies the product for which to retrieve reviews. |
{
"product_id": "2",
"ratings": {
2: 1,
3: 1,
4: 2,
// ...
},
"recommended": {
0: 5
// ...
},
"characteristics": {
"Size": {
"id": 14,
"value": "4.0000"
},
"Width": {
"id": 15,
"value": "3.5000"
},
"Comfort": {
"id": 16,
"value": "4.0000"
},
// ...
}
Adds a review for the given product
Parameter | Type | Description |
---|---|---|
product_id | integer | Specifies the product for which to retrieve reviews. |
rating int | Integer (1-5) | indicating the review rating |
summary | text | Summary text of the review |
body | text | Continued or full text of the review |
recommend | bool | Value indicating if the reviewer recommends the product |
name | text | Username for question asker |
text | Email address for question asker | |
photos | [text] | Array of text urls that link to images to be shown |
characteristics | object | Object of keys representing characteristic_id and values representing the review value for that characteristic. { "14": 5, "15": 5 //...} |
Updates a review to show it was found helfpul
Parameters
Parameter | Type | Description |
---|---|---|
review_id | integer | Required ID of the review to update |
Response
Updates a review to show it was reported. Note, this action deos not delete the review, but the review will not be returned in the above GET request
Parameters
Parameter | Type | Description |
---|---|---|
review_id | integer | Required ID of the review to update |
Response