README.textile in hayeah-ASS-0.0.2 vs README.textile in hayeah-ASS-0.1.0

- old
+ new

@@ -1,162 +1 @@ - -Asynchronous Service Stages (ASS) is a way to -organize distributed services by decoupling the -what and how of computation from the when and -where. Built on top of RabbitMQ (an implementation -of AMQP), ASS helps you to build robust and -scalable distributed applications. - -End of project pimping, let's get started. - -h1. Install - -You need - -(1) Erlang -(2) RabbitMQ -(3) AMQP gem - -Thread.new { EM.run } -AMQP.start - -^C to exit - - -h1. The Basics - -A service component is a ruby script that -communicates with RabbitMQ. You need to define the -AMQP server your ASS depends on. Something like this, - - -require 'rubygems' -require 'ass' -AMQP.start(:host => 'localhost', - #:vhost => "/ass-test", - :logging => false) do - # ASS definition -end - - -To start a server - -server = ASS.new("echo") -# => #<ASS::Server echo> - -But it doesn't do anything yet. You define the -behaviour of the server by setting its -callback. The callback can be a class, so that for -each client request an object is created from the -class to process the request. Like so, - - -server.react(SomeReactorClass) - - -However, often you just want something simple. The -react method can take a block and construct an -anonymous callback class from which the server -creates an callback object for each request. Here -we ask the server to react to @foo@ or @bar@. - - -server.react { - def foo(input) - [:server,:foo,input] - end - - def oof(input) - [:server,:oof,input] - end -} - - -The react method accepts for the callback either -a Class, a Module, a block, or any object. When an -object is used, it's considered a singleton, which -is used to process all the requests. - -Now that we have a server, we need to get a client -so to call the server. Because the call is -asynchronous (the client doesn't wait for the -result), to process the result when it gets back, -we need to define callback for the client (just as -we did for the server). For each call to the -remote server, the result is processed at the -client side by a method of the same name, - - -client = server.client.react { - def foo(output) - p [:client,:foo,output] - end - def oof(output) - p [:client,:oof,output] - end -} - -c.call(:foo,42) -c.call(:oof,24) - -# [:client,:foo,[:server,:foo,42]] -# [:client,:foo,[:server,:foo,24]] - - -> ruby server.rb -> ruby client.rb - -> ruby server.rb -^C - -While the server is down, the requests the client -is making is queued by the underlying message -middleware (RabbitMQ), so in some future time when -we restart the server, we wouldn't lose any -request. Let's restart the server. - -> ruby server.rb - -See that the server caught up with all the pending -requests. To increase service capacity, we can -just increase the number of server instances. - -> ruby server.rb - -Now the load is distributed between these two -instances. We can also start more clients to -handle more load. - -> ruby client.rb - -You can see requests coming in from two clients. - - -h1. Service Configuration - --how the name of a service map to AMQP entities. --various options for different functional characteristics. - --using routing_key --using reply_to - - -rabbitmqctl list_exchanges -rabbitmqctl list_queues - - -h1. RPC service - -The RPC client provides a synchronous API to the -asynchronous services. This is so the users of an -ASS application don't have to bother with the -difficulties of asynchronous programming style -with callbacks. - -The RPC client is intended to be used as the -gateway into some reliable internal -services. While the internal services coordinated -with ASS needs to be robust to component failures, -there's no such requirements for gateways. It is -ok for a gateway to fail, and fail in delivering a -response, as long as the internal services carry -out the task without a hitch. \ No newline at end of file