From 8747eafe62924a929fb0624931d970b7f7042107 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 11 Jul 2009 05:41:39 +0100 Subject: [PATCH] Add README file. --- README.md | 82 ++++++++++++++++++++++++++++++++++++++ doc/rabbithub-example.png | Bin 0 -> 32363 bytes 2 files changed, 82 insertions(+) create mode 100644 README.md create mode 100644 doc/rabbithub-example.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b81b93 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# PubSub-over-Webhooks with RabbitHub + +[RabbitHub][gitrepo] is an implementation of +[PubSubHubBub][pshb_project], a straightforward pubsub layer on top of +plain old HTTP POST - pubsub over Webhooks. RabbitHub provides an +HTTP-based interface to [RabbitMQ][]. + +It gives every AMQP exchange and queue hosted by a RabbitMQ broker a +couple of URLs: one to use for delivering messages to the exchange or +queue, and one to use to subscribe to messages forwarded on by the +exchange or queue. You subscribe with a callback URL, so when messages +arrive, RabbitHub POSTs them on to your callback. For example, + + - is the + URL for delivering messages to the "amq.direct" exchange on the + public test instance of RabbitMQ, and + + - is + the URL for subscribing to messages from the (hypothetical) queue + "some_queue_name" on the broker. + +The symmetrical .../subscribe/x/... and .../endpoint/q/... also exist. + +The [PubSubHubBub protocol][spec] specifies some RESTful(ish) +operations for establishing subscriptions between message sources +(a.k.a "topics") and message sinks. RabbitHub implements these +operations as well as a few more for RESTfully creating and deleting +exchanges and queues. + +While PubSubHubBub is written assuming Atom content, RabbitHub is +content-agnostic (just like RabbitMQ): any content at all can be sent +using RabbitHub's implementation of the PubSubHubBub protocol. Because +RabbitHub is content-agnostic, it doesn't implement any of the +Atom-specific parts of the PubSubHubBub protocol, including the "ping" +operation that tells a PSHB hub to re-fetch content feeds. + +## Example: combining HTTP messaging with AMQP and XMPP + +Combining RabbitHub with the AMQP protocol implemented by RabbitMQ +itself and with the other adapters and gateways that form part of the +RabbitMQ universe lets you send messages across different kinds of +message networks - for example, our public RabbitMQ instance, +`dev.rabbitmq.com`, has RabbitHub running as well as the standard AMQP +adapter, the [rabbitmq-xmpp][] plugin, and a bunch of our other +experimental stuff, so you can do things like this: + +RabbitHub example configuration + + - become XMPP friends with `pshb@dev.rabbitmq.com` (the XMPP adapter + gives each exchange a JID of its own) + + - use PubSubHubBub to subscribe the sink + to some + PubSubHubBub source - perhaps one on the public Google PSHB + instance. (Note how the given URL ends in "x/pshb", meaning the + "pshb" exchange - which lines up with the JID we just became XMPP + friends with.) + + - wait for changes to be signalled by Google's PSHB hub to RabbitHub + + - when they are, you get an XMPP IM from `pshb@dev.rabbitmq.com` with + the Atom XML that the hub sent out as the body + +Again, RabbitHub is content-agnostic, so the fact that Atom appears is +an artifact of what Google's public PSHB instance is mailing out, +rather than anything intrinsic in pubsub-over-webhooks. + +## HTTP messaging in the Browser + +In order to push AMQP messages out to a webpage running in a browser, +try using to run a PubSubHubBub endpoint +in a webpage - see for instance + and its [associated +Javascript](http://www.reversehttp.net/demos/endpoint.js) for a simple +prototype of the idea. It's also possible to build simple PSHB hubs in +Javascript using the same tools. + + [gitrepo]: http://github.com/tonyg/rabbithub + [pshb_project]: http://code.google.com/p/pubsubhubbub/ + [spec]: http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.1.html + [RabbitMQ]: http://www.rabbitmq.com/ + [rabbitmq-xmpp]: http://hg.rabbitmq.com/rabbitmq-xmpp/raw-file/default/doc/overview-summary.html diff --git a/doc/rabbithub-example.png b/doc/rabbithub-example.png new file mode 100644 index 0000000000000000000000000000000000000000..087e98c4301b89163101055a63a39e10550093dc GIT binary patch literal 32363 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