[Kimchi-devel] [RFC] asynchronous (websocket based) notification (Wok #16)

Daniel Henrique Barboza dhbarboza82 at gmail.com
Wed Feb 8 19:07:55 UTC 2017


Hi everyone,

I want to start a discussion on 
https://github.com/kimchi-project/wok/issues/16,
"Asynchronous event notification".

As most of you are aware, WoK does not have any sort of push 
notification. WoK
UI works based on a polling strategy using the Notifications API to 
fetch for any
backend notifications. This polling is on a 3 second interval to not 
overload the server
with these requests. The problems with this approach are obvious: the 
cost of
the polling process for both UI and backend, the interval for a backend 
event to be
delivered to the UI and so forth.

- The idea

This work aims to implement an asynchronous strategy to deliver server 
to client
messages. The idea is to use websockets* to establish a socket 
connection between
the UI and the backend. The backend can send any message using this 
socket and
the UI, after receiving it, can act upon immediately.


- Push server implementation

This socket in the backend side would act as a 'push server' that will 
receive the
connections and push the same messages to all of them. Only server to client
messages will be sent.

This push server can be implemented in two ways:

* from scratch

* using an external library

One library that seems to do this asynchronous socket implementation is 
tornado
( https://github.com/tornadoweb/tornado ). It is present in all distros 
we support
and it has Apache 2.0 licensing. I'll experiment with it and see if it 
helps. I am
opened to any other suggestion of libraries that can be used in the push 
server
implementation. If no library is good enough for us, I'll have to 
implement it from
scratch.


- WoK backend design

In WoK backend, my idea is to reuse the 'add_notification' method from the
existing Notifications API. When adding a notification, fire a message 
to the
push server and notify all the listeners too.

This approach has the following advantages:

- it will work out of the box for all backend messages in all plug-ins that
uses the 'add_notification' method;

- we can re-use the same JSON message format of the Notifications API,
reducing the amount of UI work we'll have to adapt the existing UIs;

- it will be harmless to implement. Given that the push server will send
messages to all connected UI endpoints, if no endpoint is connect
no message will be sent.


- WoK frontend design

For any tab that wants to receive the push notifications, just connect
to the push server via websocket and react to the messages sent - just
like it is done today with the notifications API but without the need of
sending the GET /notifications messages.

We will need to be careful to not open unnecessary websockets when
tab switching. We will need to pay attention to closing up the connections
we don't need anymore.

I am planning to do a proof of concept of an UI working with this new
push server notifications in the 'User Log' tab, together with this backend
work. When a new log entry is created, a push notification is sent and the
UI would refresh automatically. This implementation would be used as a base
for the other tabs/plug-ins.


Let me know what you think!


Daniel


PS: for the record, before deciding to use websockets I've considered 
using SSE
(Server-side Events), a HTML5 standard, but gave up due to lack of SSE 
support
from Microsoft browsers.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20170208/05c6d5c3/attachment.html>


More information about the Kimchi-devel mailing list