Cougar is an open source framework for implementing well defined service interfaces with true transport independence, freeing you up to write your core logic. Originally written by Betfair, and powering their core services, it is a high performance framework, easily supporting high concurrency requirements.
Oh, you wanted more detail than the front page? Well, in that case read on, after all, it’s always a little more complex than that..
At it’s core, Cougar provides an execution venue within which executables can be run. Executables are asynchronous in nature, proving results (be those responses or faults) via a callback mechanism. In it’s simplest form, an execution venue consists of a queue of outstanding execution requests, and a pool of threads which pull work from that queue.
Executables are often simple wrapper classes which map to method calls on a service interface, which is generated from an interface definition, written in Cougar’s very own IDL (it looks rather like Thrift but in XML), the implementation of which is written by you (or your developers if you have some at your beck and call).
Execution requests are accompanied by the arguments passed in and some contextual information about the call which provides access to (amongst other things):
Cougar supports 3 core paradigms of interaction:
Layered over the top of this core, Cougar provides a set of transports for interacting with the outside world. You can extend this set of transports with your own as required, and we expect to expand this set over time:
All these transports support varying security levels, all the way from none to 2-way SSL for non-repudiated client identification.
Obviously at some point you’re going to want to call other Cougar based service interfaces, and Cougar provides a client framework to do so. Supporting JSON over HTTP (RPC), our custom binary protocol (RPC & Connected Objects) and ActiveMQ or any other JMS provider (enabling subscription to other interfaces’ events), Cougar clients are generated stubs from the target’s interface definition document, which you can then bind to the transport of choice.
Alongside the main features above there are a bunch of other handy extras: