We're working on a microservice framework which:
- does the routing to and from the actual microservices
- provides a structured enough interface (through our small language), that it can:
- cache the results of requests out to any service
- allow services to find and rely upon each other to compose functionality
- run one lightweight runtime per service per machine (which never shuts down, but has little overhead due to its lack of state)
- serve static assets both to clients and to microservices requesting them
- allow services written in differing languages to talk to each other
Perhaps this gives you a picture of what might fit the job description of a microservice framework? :P... and if this sounds what HTTP servers do, you'd be partially right, but building such apps today is pretty non-trivial and hard to orchestrate.
The focus on microservices is making it much more possible to build apps like this and we're personally betting on an approach which focuses on allowing each microservice to express as much as possible in its own little corner (using our language, which we use both for app structure and communications and gives different programming languages a neutral meeting point).
We're over at http://wym.io/, where there's a demo of our language builder, for now. Hopefully this is low key enough. :P
One further question. Say a service A calls service B. And let's say service B needs several seconds to complete, and emits a progress indicator every second (I assume this is possible?) Will A be able to read these progress indicators also every second, and send its own progress indicator to its caller?
g = wym('/email') #=> Generator(id=<...>)
g.on('value', (v) ->
...
)
and /email looks like: function next(inp) { ... }
return generator(next);
Sending values in uses a slightly different syntax, and manually walks the generator through. :)A more trivial way is to pass in a callback for the service (we call them routes) to send its updates back to, but this requires more code to send values in.
Edit: to be clear, using a Generator as above isn't very microservice-ey and will trigger our framework to start tracking local state to keep the generator around, which it will auto-free when it believes it can. This is a necessary evil with any long-running code, though. Better is to break up the code so that it may be called multiple times to progress state and returning generator('/someRoute') if possible. :P
So not very enlightening yet :)
It becomes a _service_ once it gains communications and a global name, perhaps?
Whether or not Colossus meets it exactly, I haven't checked.
So what is a microservice exactly? Is it just a piece of code that runs based on a trigger coming from the browser? And what is the main responsibility of the framework? Is it the routing of requests and responses to/from the actual microservices?
Further questions that come to mind: (1) Are the results of microservices cached somehow? (2) Also, if a cached item is not longer required, is it automatically freed? (3) If the output of a running service is no longer required, is that service automatically stopped?