Duda: web services framework for Monkey

[OBS: this is a repost from http://blog.monkey-project.com/2012/03/13/duda-web-services-framework-for-monkey/]

There is one fact: we are in exciting times for the project. Our HTTP core is consolidated since a while ago, it works in non-blocking mode, it has a nice indented configuration model and provide an advanced API to extend the core behavior, through this we support different behaviors by layers like IPv4, IPv6, SSL encription, security by subnets, basic auth, shell, log writer, etc.

There is a common question from people around the project: “where are you going ?” and the answer is: do you see that embedded Linux Box ?, there’s where we go. Common web servers lack of performance for embedded systems, most of them have focused in high production environments. our focus is different.

Our tech world is service oriented and i would say that implemented through a fat HTTP software stack, simple things are done in scripting languages that requires a process context or even be ran in a JVM environment, that is not lightweight and requires extra resources to be scalable. If you plan to implement a web service for embedded you should start forgetting about Java and PHP and think in lightweight options. Please Google a little about the options available and then continue reading here.

I am pleased to announce Duda, a web services framework built on top of Monkey, is event-driven oriented and expose a friendly C API for the implementation of web services. It goals are performance and easy deployment. It target Linux embedded devices based on ARM (x86 and x64). It implementations is licensed under the LGPL so it allows to link your private web service with our GPL product.

Duda stack overview


There are many mechanisms to achieve a great performance, but talking in an embedded context the primary answer will be: do it in C. Duda and it’s API is made for C developers looking for an event-driven framework supporting URI maps and callbacks. We define an URI map as follows:

  • webservice_name: the web service name, a short name like ‘myapp’
  • interface: an interface group a set of methods, think it like a main class, mostly for ordering purposes.
  • method: a routine who take cares of the main request, this is mapped internally by a callback and is able to send response data
  • param: parameters passed through the URI, it’s limited to 16 parameters per request.


If you desire to pass a huge amount of data, you can consider using the POST HTTP method, Duda supports JSON in case you wanted to use it.

Performance: Duda v/s NodeJS

Now how we compare Duda versus the NodeJS framework ?: Duda is for C developers looking for achieve performance with low resources usage, NodeJS is for javascript developers who wanted to write server side implementations. You could claim that NodeJS is pretty faster compared to Apache.. and let me tell you that any non-blocking implementation will be faster than Apache, but.. could be a Javascript engine be faster than something written in C ?, the answer is NO. You can great things with NodeJS, but this last one is not the ultimate solution.

For the following tests i have created a NodeJS script with 5 workers (same as monkey) which replies a “Hello World!\n” string (13 bytes)

Requests per second

I have done the easiest bechmark test with Apache benchmark: 50000 request with 100 concurrents hitting the hello world of each server:

Duda + Monkey is 24% faster than NodeJS


Total transferred bytes

Something is wrong here, why Monkey transferred almost twice bytes than NodeJS ?, looking at the response header we can see that NodeJS is being tricky, its not sending the HTTP Date header, i expected the framework do this by its own.

Duda + Monkey sent twice of data and we continue being faster

Memory Usage

Its importan to know how much memory is using each service when is running, check the results and

Duda + Monkey only uses 264KB while NodeJS requires 35MB


A graphical comparison of Memory usage:

35MB isn't too much ?



Duda since it’s beginning is hitting a huge performance, is ready for embedded due to it lightweight nature. We are hard working to implement required features such as Redis, Memcache, MySQL and others. All of this is part of Monkey v1.0 so stay tuned. We keep rocking, and now harder 😉



  • You can get the Apache Benchmark results and code for each services from here

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax