The exciting stuff we have done at Bravi

Bravi has many projects and each one of them uses a proper language and technology for that specific scenario. The team I am currently working has done some pretty exciting stuff and now that the project has calm down (for few days) I think is the right time to share these things we have worked on.

The idea right now is not getting deep in each subject, just share the tools, patterns, ideas and other stuff we have used. Maybe in a next post we could explaining better each one.

Microservices

Microservices are a style of software architecture that involves delivering systems as a set of very small, granular, independent collaborating services.

This approach came with a lot of questions and forced us to think deeply over many decisions (architectural and infrastructural).

However for this project was a pretty good decision use Microservices and we do not regret about that. Nowadays we have around 15 services and using Microservices in a scenario like this gives a lot of advantages isolating the services by responsibilities.

Containers

As we are working with microservices some times a service can use a different language, technology and environment configuration from others. For this reason we needed to isolate each service in a physical level instead of only an project level. We could do that using a virtual machine, as we were used to do in previous projects. But this approach has high cost of memory and process usage. Then we thought was time to try something more efficient as the Linux Containers with Docker.

Docker is an open-source application container engine and has been used for many big companies.

docker run -i -t ubuntu /bin/bash

Bravo tool

Microservices brings up some concerns to an architectural level. For example how to run related projects, connect them allowing communicate with each other. Is possible to settup it using only docker (for simple scenarios). But to make this process easier we have built a tool to help us doing it.

Bravo is written in nodejs and basically reads an yaml configuration of the current project, where is specified how to run the service. For this it uses docker, nginx and dnsmasq (only in development environment).

bravo run -e development

Git Deploy

To allow an push button deployment using the Bravo tool we also have built another tool Git Deploy.

Logs everywhere

We used winston library to easily save logging in many ways (console, text and slack). Receive logs in channels on slack is pretty helpful. We are notified if something is going wrong right when this is happening and if you are not in the slack at the moment we are notified also in our email.

Fancy prompt

You can get lost using bashes everywhere over many containers. Therefore we have styled our prompts to show some important informations:

  1. host - the container’s host name
  2. env - in which environment the container is running (development, staging, production)
  3. git - the current git branch
  4. path of the current directory
  5. a big PRODUCTION warning if the current environment is production to make you think twice before do anything

Performance tuning

One of ours main concern in this application was to support at least 100 concurrent requests per second. To measure it we used the Apache AB tool. In our first test I think the application was supporting less than 20 requests per second. Basically we did:

  1. Optimized linux networking
  2. Optimized nodejs
  3. Optimized nginx

At some point we thought we were having a low performance due we were using docker. But we were wrong and we didn’t have to change anything related to docker configuration.

This application has many content texts. So we needed a good way to search words an sentences in long texts. This approach should be fast and works ignoring case sensitive and accents. To solve these requirements we used the Apache Solr.

React

For some front-end components were used the React.

React is, in my opinion, the premier way to build big, fast Web apps with JavaScript. It’s scaled very well for us at Facebook and Instagram. One of the many great parts of React is how it makes you think about apps as you build them. (reference)

Webpack

webpack is a bundler for modules. The main purpose is to bundle javascript files for usage in a browser.

This allowed use move some front-end code to isolated components and use them as widgets on demand over different projects.

Migrating from Wordpress to Jekyll

Today I finally migrated from Wordpress to Jekyll. I was tired using Wordpress because that was too much for my needs (markdown and syntax highlight) and seems be much easier customize the Jekyll templates.

I just want to thanks Hadi Hariri. Following his post I could easily migrate to Jekyll.

Docker Build Error

I was playing around Docker this week using this Dockerfile to build my container:

But during the build I was getting this error message:

I was using a Linux Mint 16 and after some research to solve the problem I figured out was missing install the LXC.

sudo apt-get install lxc

Solve graphics issues with NVIDIA NVS 4200m - Dell Latitude E6520

After spend an whole day trying to install the driver for my NVIDIA NVS 4200m I figured out I just had to disable the Optimus support in the BIOS.

image posted on http://ubuntuforums.org/showthread.php?t=1726575 by ethomp

Just it will allow the remote monitors work pretty well. Also with this change will appears many options of nvidia drivers on Driver Manager (Linux Mint), then you can get the recommended one.

Error - npm doesn't install packages with GitHub dependencies

To set in your node project a dependency from github you just need to include the <username>/<repository> on package.json:

If you are getting the error below then probably you don't have git installed in your environment. Install that and should fix this problem.