views:

482

answers:

3

Hello,

I'm whiling to add a support of Server Side events to CppCMS. I understand the technical part of what to do on the level of communication: Client sends long polling XmlHTTPRequest, and waits for respond, server accepts the connection and does not respond until server side event occurs and sends the response to the client. The client repeats the procedure.

However, this is too "low" level for most of web developers. There are many questions: how do I manage events, how do I manage connections and so on.

I thought about two possible models:

  1. There are some named events defined and the server side, for example "New Message in Chat Room no 134"; when the request accepted the server side application checks the messages in the room (for example in DB) and if there is no new messages for the client it subscribes to event and waits on it.

    When some other client posts data to the server, it notifies all applications on the "New Message in Chat Room no 134" event and they wake up and send these messages to clients, and so on.

    This model is still looks like quite "low level" model, but it hides all notification methods.

  2. Another option is to define some named queues, so each client creates such queue upon connection to server and waits for new messages. When some client posts a new message to "Chat Room no 134", on the server side it is broadcasted to all queues connected to this "Chat Room no 134", and the message is delivered to client.

    However there are many questions that are risen:

    • How do I manage queues and the session level, at the level of single page?
    • How do I delete queues and create timeouts on them?
    • What happens if more then one "window" subscribes to same queue?
  3. Create a persistent object on server side that glues between server side events and user side events. It may communicate over distinct XHR requests that are redirected to it.

    So client (JavaScript) registers events and waits for them with XHR and server side dispatched event notifications, until the page is rebuild.

So, I would like to know, what are most popular and recommended API models behind server side push technologies?

Thanks

Edit: Added third option

+3  A: 

Try Bayeux, it's very much like your first model. The client subscribe to channel "chatroom/new-message/134". If there are new message, the server will broadcast to the subscribers.

You can use wildcard channel name to subscribe to multiple rooms "chatroom/new-message/*" (trailing only)

Bird
If so, it would be more similar to 2nd one...
Artyom
Bayeux is one of the cleanest and simplest standards for comet-style communication.
Anton
+1 Bayeux. Simple, effective, none of the extra complexities of XMPP.
jvenema
A: 

There's no general solution that fits all applications. If you want to learn about some general patterns, have a look at Event-Driven Architectures.

There are some slides online from a presentation I attended once (it's a quite high-level view of the topic).

Thomas Danecker
+3  A: 

You should check out XMPP PubSub, which defines a generic publish/subscribe protocol over XMPP. There's also an XMPP extension called BOSH (lower-level protocol details are documented separately in XEP-0124) that defines a mechanism that allows HTTP clients to bind to XMPP servers using long-polling (i.e., comet). Combining these two specifications gives you a robust event subscription model for web-apps using comet. Even if you don't end up using XMPP/BOSH, the specs contain some valuable insight into how this sort of system can be built.

If you do end up using XMPP and BOSH here are some tools you may find useful:

  • StropheJS: A library for writing client-side XMPP clients that speak BOSH.
  • Idavoll: A generic publish-subscribe service component for XMPP servers.
  • Punjab: A BOSH connection manager that acts as a sort of "translating proxy" between BOSH HTTP clients and your XMPP server.

Admittedly this is a very heavy-weight solution, and it may not be appropriate for your particular application, but a lot of thought was put into these standards so they may be helpful.

mmalone